普通视图

发现新文章,点击刷新页面。
今天 — 2026年1月16日首页

现代 CSS 颜色使用指南

作者 冴羽
2026年1月16日 11:21

1. 前言

大多数开发者处理颜色时,就是从设计稿里复制粘贴一个色值,然后就完事了。

但是!CSS 颜色在过去几年里发生了很多变化!

不仅从 Web 十六进制代码演变成了 hsl() 函数,而且就连你熟知的 rgb() 函数也跟以前不同了!

不信我们接着往下看。

2. 现代 CSS 写法

2.1. 你不需要添加 a

以前,我们用 rgb() 填写普通的 RGB 颜色值,要想改变不透明度,就必须使用 rgba()

.red {
  color: rgb(255, 0, 0);
}

.red-50 {
  color: rgba(255, 0, 0, 0.5);
}

现在,你可以直接添加第 4 个通道了:

.red {
  color: rgb(255, 0, 0);
}

.red-50 {
  color: rgb(255, 0, 0, 0.5);
}

而且,不用担心浏览器兼容问题,只要你不用支持 IE。

2.2. 空格分隔语法

除此之外,逗号现在也被视为老语法了,对于新的颜色函数,我们甚至不能再使用逗号,只能使用新的空格语法。

.red {
  color: rgb(255 0 0);
}

.blue {
  color: hsl(226 100% 50%);
}

不过,使用空格分隔语法时要注意:你不能为 alpha 通道添加第四个值。

换句话说,这样写 color: rgb(255 0 0 0.5) 是不可以的。

如果你要添加第 4 个值,你需要在字母值之前使用一个正斜杠:

.red {
  color: rgb(255 0 0);
}

/* 50% 透明 */
.red-50 {
  color: rgb(255 0 0 / 0.5);
}

.hsl-red-50 {
  color: hsl(0 100% 50% / 0.5);
}

为什么要这么做呢?

因为 CSS 新增了很多颜色函数,统一用斜杠可以快速区分“颜色值”和“透明度”,看代码时一目了然。

2.3. hsl() 也变了

单位现在可选了:

.red {
  color: hsl(0deg 100% 50%);
}

.also-red {
  color: hsl(0deg 100 50);
}

.another-red {
  color: hsl(0 100% 50%);
}

.this-is-red-too {
  color: hsl(0 100 50);
}

小提示: 最好还是保留百分号,因为 VS Code 只有带百分号的才会显示颜色预览。

3. 相对颜色

相对颜色是什么?

简单说就是基于现有颜色生成新颜色。

3.1. 基础用法

我们从一个简单的例子开始:

.rgb-red {
  color: rgb(from #ff0000 r g b);
}

这行代码的意思是:

基于 #ff0000 这个颜色,提取它的红(r)、绿(g)、蓝(b)值,然后用这些值创建一个新颜色。

结果其实就是 rgb(255 0 0)

看起来很傻对吧?但重点是下面这个:

.rgb-red {
  color: rgb(from #ff0000 r g b);
}

/* 轻松创建 50% 透明度版本 */
.rgb-red-50 {
  color: rgb(from #ff0000 r g b / 0.5);
}

3.2. 最实用的场景:处理 CSS 变量

以前你想让一个 CSS 变量颜色变透明,得这样:

:root {
  --color-primary: #2563eb;
  --color-primary-transparent: rgba(37, 99, 235, 0.75); /* 手动转换,麻烦! */
}

现在呢,你可以直接这样写:

:root {
  --color-primary: #2563eb;
}

.semi-transparent-primary-background {
  /* 直接基于变量创建透明版本 */
  background-color: hsl(from var(--color-primary) h s l / 0.75);
}

就像你有一张照片,以前想调整透明度要重新处理一遍,现在滤镜一点就搞定。

3.3. 快速生成配色方案

我们可以快速创建基础颜色的浅色和深色版本:

:root {
  --base: hsl(217 73% 50%);
  --base-light: hsl(from var(--base) h s 75%); /* 调亮 */
  --base-dark: hsl(from var(--base) h s 25%); /* 调暗 */
}

比如实现一个 Toast,它可能基于一种基础颜色,然后创建一种较深的颜色用于文本,一种较浅的颜色用于背景,还需要一个不透明度较低的颜色用于阴影。

以前要 4 个值,现在直接 1 个值搞定:

.toast {
  --toast-color: #222;

  /* 深色文字 */
  color: hsl(from var(--toast-color) h s 15%);

  /* 原色边框 */
  border: 2px solid var(--toast-color);

  /* 浅色背景 */
  background: hsl(from var(--toast-color) h s 90%);

  /* 半透明阴影 */
  box-shadow: 0 12px 12px -8px hsl(from var(--toast-color) h s l / 0.325);
}

此时换颜色也超简单:

[data-toast="info"] {
  --toast-color: #0362fc; /* 蓝色 */
}

[data-toast="error"] {
  --toast-color: hsl(0 100% 50%); /* 红色 */
}

一个变量搞定所有颜色变体,优雅!十分优雅!

4. 浅暗主题切换

4.1. 以前的痛苦

不知道你是否实现过网站的浅色和深色主题:

:root {
  /* 默认浅色主题 */
  --text-heading: #000;
  --text-body: #212121;
  --surface: #efefef;

  @media (prefers-color-scheme: dark) {
    /* 暗色主题 - 第一遍 */
    --text-heading: #fff;
    --text-body: #efefef;
    --surface: #212121;
  }
}

.dark-theme {
  /* 暗色主题 - 又写一遍! */
  --text-heading: #fff;
  --text-body: #efefef;
  --surface: #212121;
}

同样的颜色写两遍,一个给媒体查询(自动切换),一个给切换按钮。

改一次要改两个地方,烦死了!

4.2. 现在的解决方案:light-dark()

:root {
  /* 跟随系统偏好 */
  color-scheme: light dark;

  /* 一次定义,自动切换 */
  --text-heading: light-dark(#000, #fff);
  --text-body: light-dark(#212121, #efefef);
  --surface: light-dark(#efefef, #212121);
}

light-dark(浅色, 暗色) 就这么简单!系统是浅色就用第一个,暗色就用第二个。

4.3. 添加手动切换按钮

如果让用户手动切换主题:

:root {
  /* 默认跟随系统 */
  color-scheme: light dark;
  --text-heading: light-dark(#000, #fff);
  --text-body: light-dark(#212121, #efefef);
  --surface: light-dark(#efefef, #212121);
}

/* 用户选了浅色,锁定 */
html[data-theme="light"] {
  color-scheme: light;
}

/* 用户选了暗色,锁定 */
html[data-theme="dark"] {
  color-scheme: dark;
}

4.4. 组件精细控制

如果某个区域必须保持固定颜色,比如某个背景图上必须是白字:

.hero {
  /* 不管全局主题怎么变,这里永远是浅色主题 */
  color-scheme: light;
  background: url("light-background.webp");
}

5. 渐变优化

5.1. 以前的痛苦

让我们直接看例子,这是一个从蓝到红的渐变:

.gradient {
  --color-1: hsl(219 76 41); /* 蓝色 */
  --color-2: hsl(357 68 53); /* 红色 */
  background: linear-gradient(90deg, var(--color-1), var(--color-2));
}

中间会出现灰扑扑的颜色,不好看:

以前你只能手动加个中间色:

.better {
  --middle: hsl(271 52 41); /* 紫色 */
  background: linear-gradient(90deg, var(--color-1), var(--middle), /* 加一个中间色 */ var(--color-2));
}

是不是好看多了:

但是麻烦呀!我甚至可能需要添加两到三个额外的色阶,以确保它与原设计完全相同。

5.2. 现在的解决办法:指定颜色空间

现在你可以轻松解决,只需要指定一个颜色空间:

.better {
  /* 用 oklch 颜色空间插值,中间色更鲜艳 */
  background: linear-gradient(in oklch 90deg, var(--color-1), var(--color-2));
}

就像拍照时选滤镜,不同的颜色空间会产生不同的中间色效果。oklch 在大多数情况下效果最好。

看下效果对比:

唯一的真正问题是,不同的颜色空间可能更适合不同的渐变,所以有时确实需要花点时间摸索。

可选的颜色空间有:

  • oklch / lch
  • oklab / lab
  • hwb
  • xyz
  • 不指定默认是 srgb

5.3. 实现彩虹渐变

以前做彩虹要指定每一个颜色。

现在只需要:

.rainbow {
  /* 从红色绕一整圈再回到红色,走长路径 */
  background: linear-gradient(in hsl longer hue 90deg, red, red);
}

longer hue 的意思是“走远路”,这样就能经过所有颜色了。

实现效果如下:

6. 超宽色域——当客户就要那个色

有时候客户会拿着他们的 Logo 说:“我就要这个色,一模一样的!”

问题是,普通的 hex、rgb()hsl() 用的是 sRGB 色域,能表示的颜色有限。

这就像以前电视只能显示几百种颜色,然而现在的手机屏幕能显示几百万种。

6.1. 解决方案:display-p3

为了满足客户的需求,你可以使用 color颜色函数,并使用 display-p3 色域。

.vibrant-green {
  /* 使用 display-p3 色域,颜色更鲜艳 */
  color: color(display-p3 0 1 0);
}

如果浏览器不支持,会自动回退到能显示的最接近颜色,不会出错。

你可以在 Chrome 的开发者工具查看这种颜色:

点击色块,它会显示你选择的颜色,但同时也会显示使用 sRGB 色域的显示器的色域限制。

建议: 除非客户真的非常在意那个特定颜色,一般用不着。但知道有这个方案总是好的。

7. 总结

现在你可以更轻松地写代码了:

  1. 少打字 - 不用区分 rgbargb,用空格代替逗号
  2. 少定义变量 - 用相对颜色基于一个颜色生成多个变体
  3. 少写重复代码 - light-dark() 一次定义两套主题
  4. 更好的渐变 - 指定颜色空间让中间色更漂亮
  5. 更精确的颜色 - 需要时可以用更宽的色域

最重要的是: 这些特性浏览器支持都很好了(除了 IE,但谁还在乎 IE 呢?)

我是冴羽,10 年笔耕不辍,专注前端领域,更新了 10+ 系列、300+ 篇原创技术文章,翻译过 Svelte、Solid.js、TypeScript 文档,著有小册《Next.js 开发指南》、《Svelte 开发指南》、《Astro 实战指南》。

欢迎围观我的“网页版朋友圈”,关注我的公众号:冴羽(或搜索 yayujs),每天分享前端知识、AI 干货。

昨天 — 2026年1月15日首页

2025 年 HTML 年度调查报告亮点速览!

作者 冴羽
2026年1月15日 10:28

1. 前言

近日「State of HTML 2025」年度调查报告公布。

这份报告收集了全球数万名开发者的真实使用经验和反馈,堪称是 Web 开发领域的“年度风向标”。

上篇文章我们盘点了使用最多的功能 Top 5,本篇我们盘点下这份报告的亮点部分。

注:目前 State of JS 2025 还未公布,欢迎关注公众号:冴羽,第一时间获取报告结果。

2. 延迟加载最常用

使用过延迟加载的受访者比例高达 70%,是“新可用(Newly Available)”功能中最常用的功能。

所谓延迟加载,指的是 loading="lazy"属性,该属性可以指定仅在需要时加载资源。

<img src="picture.jpg" loading="lazy" /> <iframe src="supplementary.html" loading="lazy"></iframe>

3. 内容安全策略(CSP)使用量增长最多

内容安全策略的使用量同比增长最大。

但同时,内容安全策略也是最令人失望的功能榜首 😂。

所谓内容安全策略,指的是网站向浏览器发出的一组指令,用于帮助检测和缓解 XSS 攻击。

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';" />

4. <input type="color"/>表单使用最广泛

<input type="color"/> 是 2025 年使用最广泛的表单相关功能,41.8% 的受访者表示使用过该功能。

5. JPEG XL 最受好评

JPEG XLctx.drawElement() 是图形方面两项最受好评的新功能。

关于这两项功能:

JPEG XL 是一种新型图像编码格式,它结合了现有的 JPEG 和 WebP 编码技术,旨在提供更好的压缩性能、更高的图像质量和更好的适用性,支持有损和无损压缩。它旨在超越现有的位图格式,并成为它们的通用替代。

ctx.drawElement() 使开发者可以在 HTML 元素上绘制 <canvas>

<canvas id="canvas" layoutsubtree="true">
  <p>Hello world!</p>
</canvas>
<script type="module">
  const ctx = canvas.getContext("2d");
  const text = canvas.querySelector("p");
  ctx.drawElement(text, 30, 0);
</script>

6. hidden="until-found" 好多人从没听说过

你知道浏览器现在可以玩捉迷藏了吗?

这个 hidden="until-found" 属性可以让你隐藏一个元素,直到用户触发它,例如点击指向它的锚链接。

目前这项功能显然还处于“隐藏”状态,79.4% 的受访者甚至从未听说过它。

而且浏览器支持仍然有限(说的就是你,Safari!)。

但一旦互操作性得到改善,它或许会成为你工具箱中不可或缺的工具。

7. Sanitizer API 最受欢迎

最受欢迎和最不受欢迎的功能都与安全有关:

Sanitizer API 获得了最多的正面评价,而内容安全策略则位列最令人失望的功能榜首。

Sanitizer API 指的是 element.setHTML()以及 Document.parseHTML() API,通过清理 HTML 中不受信任的字符串来防止 XSS 攻击。

8. popover 可以开始用了

Popover API 今年正式上线,这意味着它现在已被四大主流浏览器全面支持。

所以现在正是学习该 API 的最佳时机。

其实 Popover API 学起来也很简单,它主要用于实现弹出窗口,例如覆盖层、弹窗、菜单等。

<button popovertarget="foo">Toggle the popover</button>
<div id="foo" popover>Popover content</div>

值得一提的是,Popover API 还是开发者投诉 “浏览器不支持” 最多的功能 —— 不是浏览器没跟上,是我们还没反应过来 “这个功能已经能用了”。

9. blocking="render" 知道的人多了起来

顾名思义,这个属性可以让<link><script><style>标签阻塞页面渲染,直到它们完全加载完毕。

不过浏览器支持尚未完全到位,但一旦得到广泛支持,它肯定会使网页加载用户体验更加流畅。

10. ElementInternals 可以开始用了

如果你编写过 Web 组件,那么你一定经常需要指定自定义伪类、默认 ARIA 参数,或者让组件的行为像常规表单元素一样。

ElementInternals 不仅能做到这些,还能做得更多!

而且它应用广泛,自 2023 年以来就受到所有浏览器的支持!

11. PaymentRequestAPI 值得密切关注

广告似乎已成为网络世界中不可避免的一部分,PaymentRequest API 可能是实现浏览器集成微支付的第一步。仅凭这一点,就值得我们密切关注。

目前支持度欠佳:

12. <search>可以开始用了

<search> 元素属于那种只需稍加努力就能轻松添加到最佳实践列表中的实用技巧。

用于封装搜索用户界面的语义元素:

<search>
  <form action="search.php">
    <label>Find: <input name="q" type="search" /></label>
    <button>Go!</button>
  </form>
</search>

现在它已被四大主流浏览器支持,没有理由不使用它了。

我是冴羽,10 年笔耕不辍,专注前端领域,更新了 10+ 系列、300+ 篇原创技术文章,翻译过 Svelte、Solid.js、TypeScript 文档,著有小册《Next.js 开发指南》、《Svelte 开发指南》、《Astro 实战指南》。

欢迎围观我的“网页版朋友圈”,关注我的公众号:冴羽(或搜索 yayujs),每天分享前端知识、AI 干货。

昨天以前首页

2025 年 HTML 年度调查报告公布!好多不知道!

作者 冴羽
2026年1月14日 14:12

前言

近日,「State of HTML 2025」年度调查报告公布。

这份报告收集了全球数万名开发者的真实使用经验和反馈,堪称是 Web 开发领域的“年度风向标”。

让我们看看 2025 年,大家都用了 HTML 的哪些功能。

注:State of JS 2025 还未公布,欢迎关注公众号:冴羽,第一时间获取报告结果。

特性 Top 5

开发者使用最多的特性 Top 5 分别是:

  1. 地标元素(Landmark Elements)

其实就是<aside>, <article>, <main>, <nav>, <section>这些,想必你也经常使用。

  1. tabindex 属性:使 HTML 元素可聚焦,允许或阻止它们按顺序获得焦点。
<div role="button" tabindex="0">I’m Tabbable</div>
  1. <svg>(内联 SVG)
<svg>
  <circle cx="50" cy="50" r="50" />
</svg>
  1. <canvas>
<canvas width="200" height="200"></canvas>
  1. loading="lazy":懒加载
<img src="picture.jpg" loading="lazy" /> <iframe src="supplementary.html" loading="lazy"></iframe>

表单 Top 5

开发者使用最多的表单功能 Top 5 分别是:

  1. <input type="color">:颜色选择器
<input type="color" />
  1. <datalist>:供用户选择的表单控件
<input name="country" list="countries" />
<datalist id="countries">
  <option>Afghanistan</option>
  ...
</datalist>
  1. input.showPicker():打开具有选择器的表单控件(颜色选择器、日期输入框等)
<input id="dateInput" type="date" /> <button onclick="dateInput.showPicker()">Select date</button>
  1. contenteditable="plaintext-only":允许编辑元素的原始文本,但不允许进行富文本格式设置
<h2 class="title" contenteditable="plaintext-only"></h2>
  1. Customizable Select:可自定义样式和样式的下拉控件
select,
::picker(select) {
  appearance: base-select;
}

图形和多媒体 Top 5

开发者使用最多的图形和多媒体功能 Top 5 分别是:

  1. <svg>(内联 SVG)
<svg>
  <circle cx="50" cy="50" r="50" />
</svg>
  1. <canvas>
<canvas width="200" height="200"></canvas>
  1. ctx.drawElement():使开发者可以在 HTML 元素上绘制 <canvas>
<canvas id="canvas" layoutsubtree="true">
  <p>Hello world!</p>
</canvas>
<script type="module">
  const ctx = canvas.getContext("2d");
  const text = canvas.querySelector("p");
  ctx.drawElement(text, 30, 0);
</script>
  1. WebGL:一个基于 OpenGL 的底层 API
const gl = canvas.getContext("webgl");
  1. colorSpace:设置图形的颜色空间
const ctx = canvas.getContext("2d", {colorSpace: "display-p3"});

内容 Top 5

开发者使用最多的图形和多媒体功能 Top 5 分别是:

  1. 内容安全策略 (CSP):网站向浏览器发出的一组指令,用于帮助检测和缓解 XSS 攻击
Content-Security-Policy: script-src 'self';
  1. <template>:内容在加载页面时不会呈现,但随后可以在运行时使用 JavaScript 实例化
<template id="counter">
  <div class="counter">Clicked {{ times }} times</div>
</template>
  1. Intl.LocaleAPI:国际化 API
const us = new Intl.Locale("en-US");
  1. HTML 模块:通过 JS imports 导入 HTML 文件,并访问其元素和 JS 导出
<script type="module">
  import { TabList } from "./tablist.html" with { type: 'html' };
  customElements.define("tab-list", TabList);
</script>
  1. Sanitizer API:element.setHTML() 以及 Document.parseHTML() API,通过清理 HTML 中不受信任的字符串来防止 XSS 攻击。
greeting.setHTML('Hello ' + nameInput.value);

交互 Top 5

开发者使用最多的交互功能 Top 5 分别是:

  1. <details><summary>:隐藏或显示内容
<details>
  <summary>Details</summary>
  Longer content
</details>
  1. <dialog>:对话框
<dialog id="confirm">
  <form method="dialog">
    Are you sure?
    <button value="1">Yes</button>
    <button value="0">No</button>
  </form>
</dialog>
  1. <details name>:手风琴效果
<details open name="sidebar_panel">
  <summary>Main info</summary>
  <!-- controls -->
</details>
<details name="sidebar_panel">
  <summary>Style</summary>
  <!-- controls -->
</details>
  1. popover:弹出窗口
<button popovertarget="foo">Toggle the popover</button>
<div id="foo" popover>Popover content</div>
  1. element.before():将一个元素移动到另一个元素之前的 DOM 方法
referenceElement.before(newElement);

性能 Top 5

开发者使用最多的性能功能 Top 5 分别是:

  1. loading="lazy":懒加载
<img src="picture.jpg" loading="lazy" /> <iframe src="supplementary.html" loading="lazy"></iframe>
  1. srcset 和 sizes 属性:提供多个源图像,以帮助浏览器选择正确的图像
<img srcset="fairy-med.jpg 480w, fairy-large.jpg 800w" sizes="(max-width: 600px) 480px, 800px" src="fairy-large.jpg" alt="Elva dressed as a fairy" />
  1. fetchpriority 属性:浏览器优先获取该资源
<img src="logo.svg" fetchpriority="high" />
  1. <img sizes="auto" loading="lazy">sizes="auto" 属性会在图像加载之前为其预留布局空间,从而避免一些布局偏移
<img sizes="auto" loading="lazy" />
  1. blocking="render":阻止渲染(但不阻止解析),直到某些资源加载完毕
<script blocking="render" async src="async-script.js"></script>

Web 组件 Top 5

开发者使用最多的 Web 组件功能 Top 5 分别是:

  1. 自定义元素
<my-switch start="On" end="Off">Wi-Fi</my-switch>
  1. 定义自定义元素
class MyElement extends HTMLElement { … }
customElements.define("my-element", MyElement);
  1. Shadow DOM:将外部不可见的元素封装起来,并使用不影响页面其余部分的 CSS 对其进行样式设置
this.shadowRoot = this.attachShadow({ mode: "open" });
  1. slot 属性:将组件 UI 中预定义的部分替换为自己的元素
<my-switch>
  Wi-Fi
  <i slot="start" class="icon-on">On</i>
  <i slot="end" class="icon-off">Off</i>
</my-switch>
  1. 声明 Shadow DOM:使用 HTML 定义 Shadow 树,例如在服务器端渲染 Web 组件时
<host-element>
  <template shadowrootmode="open">
    <!-- Shadow content -->
  </template>
</host-element>

系统功能 Top 5

开发者使用最多的系统功能 Top 5 分别是:

  1. Web Share API:将内容共享给用户选择的各种目标的机制
navigator.share(shareData);
  1. 文件系统访问 API:访问用户本地设备上的文件和目录,并创建可写文件,以便进行更新
const handle = await window.showSaveFilePicker();
const writable = await handle.createWritable();
await writable.write("Hello, world!");
await writable.close();
  1. SpeechRecognition:将麦克风输入转换为文本的 API
const rec = new SpeechRecognition();
rec.lang = "en-US";
rec.addEventListener("result", (e) => console.log(e.results[0][0].transcript));
rec.start();
  1. share_target manifest field:允许 PWA 通过系统共享对话框接收来自其他应用程序共享的数据(文本、文件、URL)
"share_target": {
  "action": "/share",
  "method": "POST",
  "enctype": "multipart/form-data",
  "params": {
    "title": "title",
    "text": "text",
    "url": "url",
    "files": [{ "name": "image", "accept": ["image/*"] }]
  }
}
  1. 文件处理 API:允许 PWA 将自身注册为某些文件类型的处理程序
"file_handlers": [{
  "action": "/open-file",
  "accept": {
    "image/svg+xml": ".svg",
    "image/png": ".png"
  }
}]

无障碍 Top 5

开发者使用最多的无障碍功能 Top 5 分别是:

  1. 地标元素
  2. tabindex 属性:使 HTML 元素可聚焦,允许或阻止它们按顺序获得焦点
<div role="button" tabindex="0">I’m Tabbable</div>
  1. <search>:用于封装搜索用户界面的语义元素
<search>
  <form action="search.php">
    <label>Find: <input name="q" type="search" /></label>
    <button>Go!</button>
  </form>
</search>
  1. focusgroup 属性:使用键盘方向键在可聚焦元素之间进行键盘焦点导航
<div focusgroup="wrap horizontal">
  <!-- child elements -->
</div>

最后

我们通常认为最炫酷的功能会最吸引开发者,比如人工智能 API、3D/XR/AR 或设备 API。

然而,年复一年,最终脱颖而出的却往往是那些看似平淡无奇的功能,甚至是一些非常普通的功能:下拉菜单、组合框、弹出框、对话框、表单验证、文件加载和保存、模板、安全地显示用户生成内容、图标等等。

有人可能会问:“这些功能不是早就有了吗?”

确实是,但问题在于 ——当用户界面无法自定义或设置样式时,它实际上就等于无法使用。

于是你不得不重复造轮子,拼一堆第三方库。结果明明是基础需求,却搞得像 “高端操作”。

但好消息是:HTML 正在变好!

2023 年还在讨论的功能,现在已经在主流浏览器上线了;之前没法用的 Popover API,现在所有主流浏览器都支持了。

虽然开发者的信任要滞后很多……

比如 Popover API 明明已经全支持了,却还是开发者投诉 “浏览器不支持” 最多的功能 —— 不是浏览器没跟上,是我们还没反应过来 “这个功能已经能用了”。

此外,AI 也拖了后腿。

按理说,AI 懂现代 Web 功能,应该能帮我们更快应用新特性,但实际情况是 —— AI 太保守了,推荐的都是 “老办法”,反而让新功能的普及变慢了。

总的来说,HTML 的未来方向很清晰:更灵活、更能表达需求、更贴合开发者实际开发习惯。

最后使用报告中的一句话:

“Web 的进步很少轰轰烈烈,但都是累积的。每多一个基本功能,就少用一次变通方案、少依赖一个库、少写一个脆弱的 hack。等这些基础都到位了,整个 Web 开发都会变轻松。”

我是冴羽,10 年笔耕不辍,专注前端领域,更新了 10+ 系列、300+ 篇原创技术文章,翻译过 Svelte、Solid.js、TypeScript 文档,著有小册《Next.js 开发指南》、《Svelte 开发指南》、《Astro 实战指南》。

欢迎围观我的“网页版朋友圈”,关注我的公众号:冴羽(或搜索 yayujs),每天分享前端知识、AI 干货。

❌
❌