如何计算 CSS 选择器的优先级?
解析 CSS 选择器优先级的计算规则及如何确定样式声明的应用顺序。
CSS 选择器的优先级用于确定浏览器应用哪种样式声明到一个元素上,规则基于选择器特定性(specificity)计算,以避免冲突。以下是详细的规则解析:
- 特定性值表示
优先级通过一个四元组 (A, B, C, D) 来表示:A
: 内联样式的标志(如果存在行内样式style="property: value;"
,则 A = 1;否则为 0)。B
: ID 选择器出现的次数(如#id
)。C
: 类选择器(.class
)、属性选择器([attr]
)和伪类(:hover, :first-child
)的总出现次数。D
: 类型选择器(标签名称如div, p
)和伪元素(::before, ::after
)的总出现次数。
例如:- 选择器
.nav .item
: B=0 (no ID), C=2 (.nav and .item), D=0 (no elements) => (0,0,2,0) - 选择器
#main ul > li:hover
: A=0, B=1 (#main), C=1 (:hover), D=2 (ul, li) => (0,1,1,2)
- 计算与比较规则
如果多个样式声明的相同属性作用于一个元素,比较规则从左到右:- 比较高位序参数,跳过相等者:
① 先比较 A;
② 如 A 相等比较 B;
③ 如 B 相等比较 C;
④ 如 C 相等比较 D。 - 如果所有参数相同,后续声明的规则覆盖前面的。
例如:a
(0,0,0,1) vs.link
(0,0,1,0) — 当应用到同一元素时:.link
优先于a
(因为 C:1 > D:1),但真实比较时 C 高位优先。
- 比较高位序参数,跳过相等者:
- 附加规则与例外
!important
: 在任何声明中加!important
可强制最高优先级(相当于权重无穷大),覆盖其他规则包括内联样式。- 内联样式优先级: 如果直接写于元素的
style
属性,优先级最高(A=1,000 in simplified system),相当于 (1,0,0,0)。 - 特殊选择器优先级:
- 通用选择器
*
、通配符和继承规则:特定性均为 0,代表最低优先级(如 0,0,0,0)。 - 后代和分组选择器:通过拆分成分选择器累加计算。
- 通用选择器
- 冲突时避免出错:浏览器使用级联(cascade)确定优先级,参数值均相同时,最后加载的声明生效。
-
权重计算表(常见错误概念,用于参考)
权重数值常被误解为简化值(非正式参考,易用于记忆但不是精准标准):Category Weight value !important
∞ (无穷大) 内联样式 1000 ID 选择器 100 / each Class/Attr/Pseudo 10 / each Element/Pseudo-el 1 / each 但这仅是一种指导方法,真实系统依据上述四组优先级而非实际数字。