:not()自身不增加权重,其特异性由外部选择器与括号内选择器共同决定;例如div:not(.foo)为(0,1,1),高于.foo的(0,1,0);:is()取内部最高权重,:where()恒为0,多:not()不叠加权重。

:not() 本身不提高优先级,但它内部的选择器会参与权重计算——这是所有困惑的根源。
为什么 :not(.foo) 比 .foo 优先级还高?
不是 :not() 加了权重,而是整个选择器的 specificity(特异性)由「外部 + 内部」共同构成:div:not(.foo) 的权重是 div(1 个元素选择器 → c=1)加上 .foo(1 个类选择器 → b=1),合计为 (0,1,1);而单独的 .foo 是 (0,1,0)。前者 c 值更高,所以赢。
-
:not()自身不贡献任何权重,规范明确写 “:not()is not a pseudo-class for specificity calculation” - 真正计入的是括号里的那个简单选择器:类、ID、属性、伪类、标签,各自按规则加权
- 常见翻车点:
input:not([type="hidden"])权重 =input(c=1) +[type="hidden"](b=1) = (0,1,1),而input单独是 (0,0,1),所以它确实更高
:not() 和 :is()/:where() 混用时权重怎么算?
三者行为完全不同::is() 取内部最高权重,:where() 永远为 0,而 :not() 是「外部选择器权重 + 括号内选择器权重」的叠加。
-
button:is(.primary, .danger):not(.disabled)→ 权重 =button(c=1) +.primary(b=1) +.disabled(b=1) = (0,2,1) -
button:where(.primary):not([disabled])→:where()不加权,只计button(c=1) +[disabled](b=1) = (0,1,1) - 别指望用
:where()“抵消”:not()的权重——它不影响语法合法性,只影响最终数值
为什么写了两个 :not() 也没让权重翻倍?
button:not(.primary):not(.danger) 的权重仍是 (0,1,1),和 button:hover 一样。多个 :not() 是并列过滤条件,不是嵌套或叠加权重。
- 浏览器把每个
:not()当作独立原子处理:元素必须同时满足「是 button」「无 .primary」「无 .danger」 - 内部选择器只算一次权重,不会因重复出现而累加(比如
.foo出现两次,b 仍为 1) - 想“提升权重”去覆盖别人?不如直接加一个类或用 ID ——
:not()不是 hack 工具,它是逻辑过滤器
最容易被忽略的一点:权重计算不是十进制加法,(0,1,1) ≠ 11,它是一组独立位数;a > b > c 的比较是逐位进行的,高位一决胜负。哪怕你写了 20 个 :not(),只要 a 位是 0、b 位没超、c 位不够高,照样输给一个 #id。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











