:is()取括号内最高权重选择器以实现“统一提权”,:where()权重恒为0-0-0以实现“彻底归零”;前者展开计算最高权重,后者必须依赖外层选择器提供基础权重才生效。

因为它们的设计目标完全相反::is() 是为了“统一提权”,:where() 是为了“彻底归零”——不是计算方式不同,而是根本就不是同一类权重机制。
为什么 :is() 取括号内最高权重选择器?
这是它作为“增强型分组”的核心逻辑。浏览器不把 :is() 当作一个独立单元,而是把它展开后取所有合法分支中权重最高的那个参与整体计算。
- 写
:is(.btn, #header, [data-id]),整条规则权重就是#header的(0,1,0),哪怕你只打算匹配按钮 - 写
:is(div, p, span),权重是(0,0,0,1)(纯标签链),比.wrapper .content span((0,0,2,1))还低,反而更难覆盖 - 任意一个子选择器非法(比如
:is(.a, )多逗号、或:is(.a::before)含伪元素),整条 CSS 规则被静默丢弃 - Safari 15.3 及更早不支持嵌套
:is(:is(...)),会直接失效
为什么 :where() 权重恒为 0-0-0?
它不是“降权”,是“清权”。:where() 的唯一使命就是让括号内所有选择器不贡献任何权重,只靠外部选择器“借力”生效。
-
nav :where(a, button)的权重只算nav那部分((0,0,1)),括号里全是摆设 -
:where(.btn)单独写,权重(0,0,0),连button标签选择器((0,0,0,1))都压不过,样式必然不生效 -
:where()里塞#id或.high-weight-class没用——整条规则仍为0-0-0,但可能因语法非法被丢弃 -
!important对:where()无效:权重为 0 的声明加!important,仍会被任何非 0 权重规则覆盖
:where() 必须搭配外层命名空间才真正可用
单写 :where() 几乎没意义。它的安全用法永远需要一个“锚点”来提供基础权重。
立即学习“前端免费学习笔记(深入)”;
- ✅ 安全:
.ui-kit :where(button, .btn)→ 权重来自.ui-kit((0,0,1)) - ✅ 扩展性好:
.theme-dark :where(.btn, .card)→ 主题切换时统一接管,不干扰其他主题 - ❌ 危险:
:where(.ui-kit .btn)→ 复合选择器进括号,整条规则可能被 Safari 静默丢弃 - ❌ 无效:
:where(*)虽能重置 margin,但对表单控件 UA 样式干预力极弱,不如button, input { all: unset; }明确
最常被忽略的一点:权重归零不是为了让样式“更安全”,而是为了让样式“可被轻松覆盖”。如果你发现 :where() 没生效,第一反应不该是加 !important,而该检查外层有没有提供哪怕最低限度的权重支撑。


















