这是由特异性决定的。在这种情况下,由于它们都同样具体,因此文件中最后出现的声明获胜。
特异性计算
特异性是通过对选择器的不同部分进行排名来计算的。
从最具体到最不具体的排名:
- 样式属性 - 如果在样式属性中找到规则,则此排名为 1。
- ID - 对于在选择器中找到的每个 ID,此排名会额外增加 1。
- 类、伪类、属性选择器 - 对于在选择器中找到的每个选择器,此等级会额外增加 1。
- 元素 - 对于在选择器中找到的每个元素,此排名会额外增加 1。
在哪里rank n > rank n+1
,无论每个等级有多少分。
例子
ul#nav li.active a
要点是:
- 0 - 不是样式属性。
- 找到 1 - 1 个 ID。
- 找到 1 - 1 个类名。
- 找到 3 - 3 个元素。
因此,该选择器中的每个属性都有一个特异性值[0,0,1,1,3]
(我们将在一分钟内得到那个额外的零)。该值比任何选择器都更具体,只要它可能是,例如,没有 ID。
比较算法:
- 在行列上从左到右。
- 比较两个选择器的排名。
- 得分较高的等级获胜。
- 如果排名相等,则继续向右下一个(不太具体的)排名。
- 如果所有等级都相等,则在 CSS 文档中较晚出现的那个将获胜。
更重要的注意事项:
- 通用选择器
(*)
没有特异性值 (0,0,0,0) 伪元素(例如:first-line
)0,0,0,1
与它们的
伪类兄弟不同0,0,1,0
- 伪类
:not()
本身并没有添加任何特殊性,只有括号内的内容。
- 该
!important
指令可以应用于单个声明,并在“0th”等级上添加一个点,这比其他任何东西都更具体
。因此,在上面的示例中,添加!important
任何规则只会将该规则
的特异性值提高到[1,0,1,1,2]
,
从而使其立即胜过没有 的任何其他规则!important
。
额外参考
请参阅有关该主题的这篇精彩文章
如何确定哪些样式转到哪些元素
浏览器这样做的方式是从右到左遍历选择器,并在元素移动时从 DOM 中过滤元素。
回到前面的例子:
ul#nav li.active a
浏览器执行以下操作:
- 取一个
a
元素。
- 现在检查它是否有一个
li
带有.active
类的元素的祖先(这是通过后代组合器:)ancestor descendant
。
- 现在检查它是否有一个更高的祖先,它
ul
的 ID 为#nav
(同样,使用了后代组合器)。
如果某个元素满足所有这些条件,则将样式应用于它。
你可以阅读它:
选择
具有类为 的祖先的任何a
元素,该类也是 a ,
而后者又具有 ID 为 的祖先,这也是 a 。
.active
li
#nav
ul
您需要拥有一个功能齐全且完整的 DOM 树,才能成功确定哪个元素具有哪些 CSS 样式。