2012-09-05 11 views
513

Ho tag div contenente diversi tag ul.Come posso usare un selettore no: first-child?

Se io cercando di impostare le proprietà CSS solo per il primo ul tag, e questo codice funziona:

div ul:first-child { 
    background-color: #900; 
} 

quando voglio impostare le proprietà CSS per ogni ul tag eccetto il primo, ho provato questo:

div ul:not:first-child { 
    background-color: #900; 
} 

anche questo:

div ul:not(:first-child) { 
    background-color: #900; 
} 

e questo:

div ul:first-child:after { 
    background-color: #900; 
} 

Ma a nessun effetto. Come devo scrivere in CSS: "ogni elemento, tranne il primo"?

+6

li: non (: first-child) – zloctb

risposta

886

Una delle versioni che hai postato actually works per tutti i browser moderni (dove CSS selectors level 3 sono supported):

div ul:not(:first-child) { 
    background-color: #900; 
} 

Se è necessario supportare i browser legacy, o se si sono ostacolati dal selettore del limitation:not (solo accetta un simple selector come argomento) quindi è possibile utilizzare un'altra tecnica:

Definire una regola che ha un ambito maggiore rispetto a quello che si intende e quindi "revocarla" in modo condizionale, limitando il suo ambito a ciò che si intende:

div ul { 
    background-color: #900; /* applies to every ul */ 
} 

div ul:first-child { 
    background-color: transparent; /* limits the scope of the previous rule */ 
} 

Quando limitando la portata utilizzare il default value per ciascun attributo CSS che si sta impostando.

+0

@OTARIKI: In realtà ': non (: first-child)' lavora - si prega di dare un'occhiata al l'aggiornamento. – Jon

+1

Ups, per qualche motivo questo non funzionava nel mio chrome, (prima sto testando questo codice solo in chrome), ora lo collaudo in altri browser e codice funzionante. problema risolto, grazie :) – RIKI

+0

sai esattamente su quali versioni non è supportato? –

51

Beh visto :not non è accettato da IE6 ~ 8, vorrei suggerire questo:

div ul:nth-child(n+2) { 
    background-color: #900; 
} 

Quindi cogliere ogni ul nel suo elemento genitore eccezione della prima.

riferimento all'articolo "Useful :nth-child Recipes" di Chris Coyer per più nth-childexamples.

+7

In realtà dovrebbe essere (n + 2) per ottenere il 2 ° elemento e in avanti AKA salta il primo elemento – stuyam

+1

@Yamartino ha ragione, dovrebbe essere n + 2, sarebbe buono per ottenere questa risposta modificata. –

+2

@ ed1nk0 Ho modificato la tua risposta per correggere il selettore, non esitare a effettuare il rollback se ho sovvertito le tue intenzioni qui :) Altrimenti, +1 - questo è il modo migliore per selezionare tutto tranne il primo elemento. – jammypeach

126

Questa soluzione CSS2 ("qualsiasi ul dopo un altro ul") funziona anche ed è supportata da altri browser.

div ul + ul { 
    background-color: #900; 
} 

differenza :not e :nth-sibling, il adjacent sibling selector è supportato da IE7 +.

Se hai JavaScript cambia queste proprietà dopo il caricamento della pagina, si dovrebbe guardare alcuni bug noti nel IE7 e IE8 implementazioni di questo. See this link.

Per qualsiasi pagina Web statica, questo dovrebbe funzionare perfettamente.

+0

Il selettore "+" non sembra funzionare in IE7. – Leven

+3

@Leven: Quel [link quirksmode] (http://www.quirksmode.org/css/selectors/) dice che dovrebbe funzionare in IE7, ma solo staticamente. Se il tuo JS posiziona un altro elemento, potrebbe non essere aggiornato correttamente. È questo il problema che hai visto? –

+0

potrebbe valere la pena notare che in una sequenza di elementi come: 'ul ul div ul' (dove questi elementi sono fratelli), verrà selezionato solo il secondo ul, poiché l'ultimo non ha un' ul' precedente a se stesso –

14
div li~li { 
    color: red; 
} 

Supporta IE7

0

not(:first-child) sembra non funzionare più. Almeno con le versioni più recenti di Chrome e Firefox.

Invece, provate questo:

ul:not(:first-of-type) {} 
+0

Entrambi funzionano, ma hanno un significato diverso. 'ul: not (: first-child)' significa letteralmente "qualsiasi elemento' ul' che non è il primo figlio del suo genitore ", quindi non corrisponderà nemmeno al primo' ul' se è preceduto da un altro elemento ('p ', voce ecc.). Al contrario, 'ul: not (: first-of-type) 'significa" qualsiasi elemento 'ul' tranne il primo' ul' nel contenitore ". Hai ragione sul fatto che OP probabilmente ha bisogno del secondo comportamento, ma la tua spiegazione è piuttosto fuorviante. –

Problemi correlati