2012-02-16 77 views
5

据我所知,元素是最不具体的。 (元素与id)。 请帮助我理解选择器的特殊性。元素选择器如何比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/

+1

看一看http://www.w3.org/TR /CSS2/cascade.html#specificity。 – 2012-02-16 12:26:03

回答

11

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

所以,像#foo选择将有1,0,0特异性,而像p元素选择将有0,0,1特异性。在这两个中,ID选择器将“赢”,因为100大于1

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

+1

我究竟如何*不*见过这个?!这太棒了。 – BoltClock 2012-02-16 12:26:32

+0

在其公式中,直接子女的特异性不包括“>”? – 2012-02-16 12:34:48

+0

@ShawnTaylor没有。 – 2012-02-16 12:43:26

2

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

div 
#firstDiv 

但是你比较这两个选择:

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

这里,第一选择是更具体的,因为它有:

  • 一个ID选择,#container

  • A型(元素)选择器,div;和

  • 甲伪类,在这种情况下是:last-of-type;所述:not()伪类本身不朝向选择特异性

计数,而第二选择器仅包括ID的。请注意,第一个示例中的组合器本身如>不计入选择器特性。

有一个在Selectors spec整个截面覆盖如何计算选择特异性。

+0

@ShawnTaylor有。 [查看我的回答。](http://stackoverflow.com/a/9311237/96656) – 2012-02-16 12:29:44

+0

@Shawn:是的,请参阅我的评论中的链接。 '#container> div:not(:last-of-type)'是'0-1-0-2','#firstDiv'是'0-1-0-0'。 – 2012-02-16 12:30:22

+0

@FelixKling:儿童符号不计算在任何地方? “>” – 2012-02-16 12:36:20