当两条 CSS 规则指向同一个元素、又设定同一个属性时,浏览器需要一个裁判:特异性。每个选择器得到一个以三个数字 a, b, c 表示的权重。由左而右比较,高者胜。只有完全相同时,才由源码顺序(或 !important)决定。这就是为什么一条更具体的规则会悄悄盖掉你刚写的那条。
a 栏数 ID 选择器,b 栏数 class、属性与 pseudo-class,c 栏数元素类型与 pseudo-element。通用选择器、组合子与 :where() 不加分。:is()、:not()、:has() 贡献其内部最具体参数的特异性。本工具替每个 token 标色,让你看见它灌进哪一栏。
关于这个主题的常见疑问与实用解答。
通常是另一条指向同一元素的规则特异性更高,所以就算你的写在后面也是它赢。把两个选择器粘进来比较 (a, b, c) 权重,就能看出是哪一栏决定的。
:where() 就是设计成不加特异性,让里面的东西容易被覆盖。通用选择器 * 与组合子也不加分。相对地 :is() 与 :not() 会取其内部最具体参数的特异性。
不会。所有解析与比较完全在你的浏览器中执行,你输入的任何内容都不会离开你的设备。