:is() 不能一键统一样式,它仅合并选择器;h1–h6 的 font-size、line-height 等需逐级定义以保语义与可访问性,仅宜用于 margin、font-family 等通用属性重置。

:is() 不能批量“设置”标题层级样式,它只是把多个选择器合并成一条规则的语法糖,h1–h6 的 font-size、line-height 等差异属性仍需单独定义。
为什么 :is(h1, h2, h3, h4, h5, h6) 不等于“一键统一样式”
浏览器解析 :is(h1, h2, h3, h4, h5, h6) 时,实际等价于展开六个独立选择器。你写一条 font-size: 1.5rem,它会无差别应用到 h6 上——而 h6 原本该是 1rem,语义和可访问性就乱了。
- 它不改变 CSS 级联逻辑:每个标题仍按自身默认样式 + 继承 + 规则顺序叠加
- 它不支持范围写法:
h[1-6]或h1..h6是非法的,必须显式枚举 - 它不提供继承优化:父级设
font-family就够了,没必要塞进:is()里重复声明
真正该用 :is() 的地方:复用公共基础样式
只把那些「所有标题都该有、且值完全相同」的属性放进 :is() 块里,比如重置 margin、启用文本换行、统一字体栈。
- 推荐写法:
h1, h2, h3, h4, h5, h6 { margin: 0; font-family: system-ui, sans-serif; text-wrap: balance; } - 更简洁等效写法:
:is(h1, h2, h3, h4, h5, h6) { margin: 0; font-family: system-ui, sans-serif; text-wrap: balance; } - 别往里塞
font-size、line-height、margin-bottom这类依赖层级的属性
:is() 和 :where() 在标题场景下的关键区别
如果你后续要覆盖某些标题的 margin(比如 h1 需要额外顶部留白),:where() 更安全——它的特异性为 0,不会干扰已有规则。
-
:is(h1, h2, h3) { margin: 1em 0; }特异性 = h1 的特异性(0,0,1) -
:where(h1, h2, h3) { margin: 1em 0; }特异性 = 0,会被h1 { margin-top: 2em; }干净覆盖 - 但
:where()不适合做基础重置,因为太容易被意外忽略或覆盖
兼容性和真实收益:别为省几行代码牺牲可维护性
目前(2026 年 4 月):is() 在 Chrome/Firefox/Safari/Edge 中已全量支持,但它的价值不在“炫技”,而在减少重复路径。
- 有效场景:
.article > :is(h2, h3, h4) { color: var(--heading-color); }—— 路径长、选择器多,压缩明显 - 无效场景:
:is(h1, h2, h3, h4, h5, h6) { font-size: clamp(1rem, 4vw, 2.5rem); }—— 强制响应式值破坏层级语义 - 真正省体积的方式:抽离通用 class(如
.heading-reset),比依赖:is()更可控
最常被忽略的一点::is() 解决的是书写冗余,不是设计混乱。标题层级的视觉节奏必须靠逐级定义来维持,语法糖不能替代语义思考。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











