【问题标题】:How element selector is more specific than id selector?元素选择器如何比 id 选择器更具体?
【发布时间】:2012-03-07 20:15:49
【问题描述】:

据我了解,元素最不具体。 (元素与 ID)。 请帮助我理解选择器的一般特性。

<div id="container">
    <div id="firstDiv">FIRST Div inside CONTAINER</div>
    <div id="secondDiv">SECOND Div inside CONTAINER</div>
</div>
body{
    width: 780px;
    margin: 20px auto;
}
#container > div:not(:last-of-type){
    margin-bottom: 0px; /*How its more specific than ID selector below? */
}
#container {
    border: 15px solid orange;
    padding: 10px;
}
#firstDiv{
    margin: 50px; /*This is not taking effect*/
    border: 5px solid blueviolet;
}
#secondDiv{
    border: 5px solid brown;    
}

http://jsfiddle.net/t2RRq/

【问题讨论】:

标签: css css-selectors css-specificity


【解决方案1】:

在应用规则时,选择器的特异性是通过计算所有个简单选择器(由任何组合器链接)来计算的,而不仅仅是键选择器。这意味着您不只是比较这两个选择器:

div
#firstDiv

但是您正在比较这两个选择器:

#container > div:not(:last-of-type)
#firstDiv

这里,第一个选择器更具体,因为它有:

  • 一个 ID 选择器,#container

  • 一个类型(元素)选择器,div;和

  • 一个伪类,在本例中为:last-of-type:not() 伪类本身不计入选择器特异性

而第二个选择器仅包含一个 ID。请注意,在您的第一个示例中,像 &gt; 这样的组合器本身不计入选择器特异性。

Selectors spec 中有一个完整的部分介绍了如何计算选择器特异性。

【讨论】:

  • @ShawnTaylor 有。 See my answer.
  • @Shawn:是的,请参阅我评论中的链接。 #container &gt; div:not(:last-of-type)0-1-0-2#firstDiv0-1-0-0
  • @FelixKling:子符号在任何地方都不算数? ">"
  • 请注意,选择器规范没有提到 style 属性如何影响特异性。
  • @Mathias:不在本规范中,但在 this one.
【解决方案2】:

要了解 CSS 的特殊性,请阅读 The Specificity Wars。还有一个方便的参考表:

因此,像#foo 这样的选择器将具有1,0,0 特异性,而像p 这样的元素选择器将具有0,0,1 特异性。在这两者中,ID 选择器将“获胜”,因为 100 大于 1

可以在此处找到还包括伪元素和伪类的更具体 (heh) 版本:http://www.standardista.com/css3/css-specificity/

【讨论】:

  • 我到底怎么没有看到这个?!这太棒了。
  • 特异性不计算 ">" 对于其公式中的直接子项?
  • @Shawn:看看最后一张图片,上面写着:*,+,>,~:通用选择器没有价值,组合器不会增加特异性。 另外,我假设您现在已经查看了规范,并且明确定义了如何计算特异性,所以不,它不算数。
  • @FelixKling:感谢您让我轻松理解所有这些概念。
猜你喜欢
  • 2016-05-02
  • 2019-05-21
  • 2023-03-09
  • 2015-12-28
  • 1970-01-01
  • 2020-02-05
  • 2015-05-01
  • 2011-01-05
  • 1970-01-01
相关资源
最近更新 更多