优先级

浏览器通过优先级(也称为特殊性)来判断哪一些属性值与一个元素最为相关,从而在该元素上应用这些属性值。优先级是基于不同种类选择器组成的匹配规则。

优先级顺序

选择符优先级:

  1. !important
  2. 行内样式
  3. ID 选择符
  4. 类选择符
  5. 标签选择符 | 伪类选择符 | 属性选择符
  6. 伪元素选择符
  7. 通配选择符 | 关系选择符 | 否定伪类

选择符权重值
行内样式[1,0,0,0] A
ID 选择符[0,1,0,0] B
类选择符、伪类选择符和属性选择符[0,0,1,0] C
标签选择符和伪类对象选择符[0,0,0,1] D
通配符、关系选择符和否定选择符[0,0,0,0] E
继承样式无权重值

权重值比较规则

  • CSS 优先级是根据由每种选择符类型构成的级连字符串计算而成的,它不是一个对应相应匹配表达式的权重值;
  • [1,0,0,0] > [0,99,99,99] 从左往右逐个等级比较,前一个等级相等才往后比较;
  • 无论是行内样式、内联样式表和外链样式表,都是按照这个规则来进行比较。而不是简单的 行内样式 > 内联样式表 > 外链样式表。之所以有这样的错觉,是因为确实行间样式为第一等的权重,所以它的权重是最高的。而内联样式可能一般写在了外链样式引用了之后,所以覆盖掉了之前的;
  • 当 CSS 选择器权重相同,则最后的声明的 CSS 选择器覆盖靠前的 CSS;
  • 相同 CSS 表达式,在 DOM 结构中的距离是不会对元素优先级计算产生影响的。

!important

当在一个样式生命中使用 !import 规则时,此声明将覆盖任何其他声明。

注意:使用 !important 是一个坏习惯,应该尽量避免,因为这破坏了样式表中的固有的级联规则 使得调试找 BUG 变得更加困难了。当两条相互冲突的带有 !important 规则的声明被应用到相同的元素上时,拥有更大优先级的声明将会被采用。

经验法则

  • 一定要优先考虑使用样式规则的优先级来解决问题而不是 !important
  • 只有在需要覆盖全站或外链 CSS 的特定页面中使用 !important
  • 永远不要再全站范围的 CSS 上使用 !import
  • 永远不要在你的插件中使用 !import

参考资料