2012-02-16 10 views
5

Jak rozumiem, elementy są najmniej szczegółowe. (element vs id). Proszę mi pomóc w zrozumieniu specyfiki selektorów ogólnie.Jak selektor elementów jest bardziej szczegółowy niż selektor 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

Zapraszamy do obejrzenia http://www.w3.org/TR /CSS2/cascade.html#specificity. –

Odpowiedz

11

Aby zrozumieć specyfikę CSS, przeczytaj The Specificity Wars. Jest przydatny arkusz odniesienia, za:

Więc selektor jak #foo musiałby 1,0,0 specyfikę, podczas gdy selektor elementu jak p musiałby 0,0,1 specyfikę. Spośród tych dwóch, selektor ID "wygrał", ponieważ 100 jest większy niż 1.

Bardziej szczegółowe (heh) wersja, która zawiera również pseudo-elementy i pseudoklas można znaleźć tutaj: http://www.standardista.com/css3/css-specificity/

+1

Jak u licha * nie * to widziałem ?! To jest genialne. – BoltClock

+0

Swoistość nie liczy się ">" dla bezpośredniego dziecka w jego formule? –

+0

@ShawnTaylor Nope. –

2

Przy stosowaniu zasady, swoistość selektor jest obliczana przez zliczanie wszystkie selektorów prostych (związany żadnymi kombinatorów), a nie tylko przycisk wyboru. Oznacza to, że nie jesteś tylko porównanie tych dwóch selektorów:

div 
#firstDiv 

Ale masz porównanie tych dwóch selektorów:

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

Tu, pierwszy selektor jest bardziej szczegółowy, ponieważ ma:

  • Przełącznik wyboru ID, #container

  • Selektor rodzaju (elementu), div; i

  • Pseudoklasą, która w tym przypadku jest :last-of-type; :not() sobie pseudo-klasa nie liczą selektora specyfiki

Podczas gdy drugi selektor składa się tylko z identyfikatorem. Zauważ, że kombinatory takie jak > w twoim pierwszym przykładzie nie liczą się do specyficzności selektora.

W sekcji Selectors spec znajduje się cała sekcja opisująca sposób obliczania specyficzności selektora.

+0

@ShawnTaylor There is. [Zobacz moją odpowiedź.] (Http://stackoverflow.com/a/9311237/96656) –

+0

@Shawn: Tak, zobacz link w moim komentarzu. '#container> div: not (: last-of-type)' to '0-1-0-2', a' # firstDiv' to '0-1-0-0'. –

+0

@FelixKling: Symbol dziecka się nie liczy? ">" –

Powiązane problemy