2010-11-12 14 views
6

ho questo (semplificato) markup:Confusing regole CSS la precedenza

<ul id="topnav"> 
    <li>one</li> 
    <li>two</li> 
    <li id="last-nav">last</li> 
</ul> 

e queste regole CSS:

#topnav li { 
    list-style-type: none; 
    float: left; 
} 

#last-nav { 
    float: right; 
} 

Con mia grande sorpresa, la seconda regola è annullata dal primo. Se cambio il selettore su li#last-nav, funziona. Perché?

(Disclaimer: ho provato solo questo in Firefox)

+0

wow, grazie ragazzi per tutti questi grandi risposte! A volte odio il fatto che io possa accettare solo una risposta. –

risposta

8

La cascata funziona così:

  1. applica la regola più importante.
  2. Se ugualmente importante, la regola più specifica si applica.
  3. Se ugualmente specifico, si applica quest'ultima regola.

Qui, #topnav li ha un specificity di 101, e #last-nav ha una specificità del 100, in modo che il primo vince. Un selettore di li#last-nav o #topnav #last-nav sarebbe più specifico.

+0

Risposta solida +1 – annakata

+3

li # last-nav sarebbe ugualmente specifico, ma avrebbe la precedenza poiché viene più tardi nell'ordine top-down, ma a parte questo, questo è per lo più corretto. Non mi piace mostrare i valori di specificità CSS come un numero singolo, perché in realtà non lo è. È una combinazione di 4 (quando conti gli stili in linea), quindi è più simile a 1 | 0 | 1 e 1 | 0 | 0. – RussellUresti

+0

@Russell buon punto; Penso che l'ultima volta che ho letto sulla specificità (era così tanto tempo fa?) Stava usando la vecchia notazione con solo tre valori e nessun separatore. –

1

L'ultima regola ha una specificità inferiore. Provare a passare a:

li#last-nav { } 

FYI: È possibile utilizzare questo strumento calc specificità: Specificity Calculator

0

Usa:

#topnav #last-nav { 
    float: right; 
} 

o

#last-nav { 
    float: right !important; 
} 
2

si può spiegare questo con specificità.

Pensate a come questo:

Elements etc: 0, 0, 0, 1 
Classes: 0, 0, 1, 0 
IDs: 0, 1, 0, 0 
Inline: 1, 0, 0, 0 

#topnav li = 0, 1, 0, 1 
#last-nav = 0, 1, 0, 0 

Quindi #topnav Li è più specifico e quindi guadagni la precedenza.

Naturalmente cascata e inhertence e anche l'uso di! Importante può assumere altri effetti sul CSS ma in questo caso, #topnav Li è solo più preciso

0

Non sono sicuro, anche se ho il sospetto, che la prima regola ha la precedenza perché viene applicata a un elemento specifico (li, in questo caso). La seconda regola potrebbe teoricamente applicarsi a qualsiasi elemento con un ID dell'ultimo nav.

regole

specificità possono essere entrando in gioco: http://www.w3.org/TR/CSS2/cascade.html#specificity

Browser moderni probabilmente permetterà di ottenere via con:

#topnav li:last-child { 

float: right; }

... e ottenere lo stesso risultato per quello desiderato.

HTH,

G

0

Ha a che fare con il vostro primo stile hanno più la specificità del vostro secondo. Controlla this site per maggiori dettagli. Per ottenere il secondo stile funziona correttamente, provare a utilizzare:

#topnav #last-nav 
6

Regole di selezione: Calcolare la specificità

I fogli di stile può anche ignorare i fogli di stile in conflitto in base al loro livello di specificità, in cui uno stile più specifico sarà vincere sempre su uno meno specifico. È semplicemente un gioco di conteggio per calcolare la specificità di un selettore.

  • Contare il numero di attributi ID nel selettore.
  • Contare il numero di attributi CLASS nel selettore.
  • Contare il numero di nomi di tag HTML nel selettore.

Infine, scrivere i tre numeri nell'ordine esatto senza spazi o virgole per ottenere un numero di tre cifre. (Nota, potrebbe essere necessario convertire i numeri in una base più grande per finire con tre cifre.) L'elenco finale dei numeri corrispondenti ai selettori determinerà facilmente la specificità con i numeri più alti che si vincono su numeri più bassi. Di seguito è riportato un elenco di selettori ordinati per specificità:

#id1   {xxx} /* a=1 b=0 c=0 --> specificity = 100 */ 
UL UL LI.red {xxx} /* a=0 b=1 c=3 --> specificity = 013 */ 
LI.red  {xxx} /* a=0 b=1 c=1 --> specificity = 011 */ 
LI   {xxx} /* a=0 b=0 c=1 --> specificity = 001 */ 

Nel tuo esempio #topnav li è 101 e #last-nav si trova a soli 100, quindi 101 vittorie.

Citata da http://htmlhelp.com/reference/css/structure.html

+0

Penso che tu intenda che '#topnav è 100', non che' #topnav li sia 100'. (L'ultima ma una frase.) – KajMagnus

+0

Penso che intendesse '# last-nav' - Ho modificato la risposta per riflettere questo. – Tom