not: selettore del primo figlio


811

Ho un divtag contenente diversi ultag.

Sono in grado di impostare le proprietà CSS per la prima ul tag:

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

Tuttavia, i seguenti tentativi di impostare le proprietà CSS per ogni altro ultag tranne il primo non funzionano:

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

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

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

Come posso scrivere in CSS: "ogni elemento, tranne il primo"?

Risposte:


1415

Una delle versioni che hai pubblicato funziona effettivamente per tutti i browser moderni (dove sono supportati i selettori CSS livello 3 ):

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

Se è necessario supportare i browser legacy o se si è ostacolati dalla limitazione:not del selettore (accetta solo un selettore semplice come argomento), è possibile utilizzare un'altra tecnica:

Definisci una regola che ha una portata maggiore di quella che intendi e poi "revoca" in modo condizionale, limitandone la portata a ciò che intendi:

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

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

Quando si limita l'ambito, utilizzare il valore predefinito per ciascun attributo CSS che si sta impostando.


conosci esattamente su quali versioni non è supportato?
Simon_Weaver,

9
@Simon_Weaver: in pratica tutto tranne IE <9 lo supporta. Una grande risorsa per ottenere questo tipo di informazioni è caniuse.com .
Jon

2
Hmm .. attenzione alle restrizioni della prima soluzione: caniuse.com/#feat=css-not-sel-list La seconda sembrava più ragionevole per me. Grazie!
Iorra,

@iorrah il tuo link caniuse è per un elenco di selettori, e sì, il supporto è ancora molto limitato. L'OP non utilizza un elenco di selettori. Quindi penso che https://caniuse.com/#feat=css-sel3 sia più appropriato con un ottimo supporto oltre i giorni di IE8.
segrete il

Funziona anche senza l'elemento div all'inizio in chrome.
Achraf JEDAY

158

Questa soluzione CSS2 ("any ulafter another ul") funziona anche ed è supportata da più browser.

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

Diversamente da :note :nth-sibling, il selettore fratello adiacente è supportato da IE7 +.

Se JavaScript modifica queste proprietà dopo il caricamento della pagina, è necessario esaminare alcuni bug noti nelle implementazioni di IE7 e IE8 . Vedi questo link .

Per qualsiasi pagina Web statica, questo dovrebbe funzionare perfettamente.


4
@Leven: Quel link quirksmode dice che dovrebbe funzionare in IE7, ma solo staticamente. Se il tuo JS posiziona un altro elemento davanti, potrebbe non essere aggiornato correttamente. È questo il problema che hai visto?
Alex Quinn,

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 ulprecedente a se stesso
Brian H.

79

Dal momento che :notnon è accettato da IE6-8 , ti suggerirei questo:

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

Quindi scegli tutti ulnel suo elemento genitore tranne il primo .

Per ulteriori esempi, consultare l'articolo "Utile: ricette nth-child" di Chris Coyernth-child .


chi utilizza ancora IE6-8 nel 2019?
oldboy,

15
Considerando la risposta dal 2013?
aasukisuki,


14

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

Invece, prova questo:

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

6
Entrambi funzionano, ma hanno un significato diverso. ul:not(:first-child)significa letteralmente "qualsiasi ulelemento che non sia il primo figlio del suo genitore", quindi non corrisponderà nemmeno al 1 ° ulse è preceduto da un altro elemento ( ptitolo, ecc.). Al contrario, ul:not(:first-of-type)significa "qualsiasi ulelemento tranne il 1 ° ulnel contenitore". Hai ragione sul fatto che l'OP probabilmente aveva bisogno di quest'ultimo comportamento, ma la tua spiegazione è piuttosto fuorviante.
Ilya Streltsyn,

9

È possibile utilizzare qualsiasi selettore con not

p:not(:first-child){}
p:not(:first-of-type){}
p:not(:checked){}
p:not(:last-child){}
p:not(:last-of-type){}
p:not(:first-of-type){}
p:not(:nth-last-of-type(2)){}
p:not(nth-last-child(2)){}
p:not(:nth-child(2)){}

4

Non ho avuto fortuna con alcuni dei precedenti,

Questo è stato l'unico che ha funzionato per me

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

Questo ha funzionato per me quando stavo cercando di far sì che il primo pulsante visualizzato sulla pagina non venisse effettuato da un'opzione margin-left.

questa è stata l'opzione che ho provato prima ma non ha funzionato

ul:not(:first-child)


4

Puoi usare il tuo selettore con :notun soffietto simile, puoi usare qualsiasi selettore all'interno di:not()

any_CSS_selector:not(any_other_CSS_selector){
    /*YOUR STYLE*/
}

puoi usare anche :notsenza il selettore genitore.

   :not(:nth-child(2)){
        /*YOUR STYLE*/
   }

Più esempi

any_CSS_selector:not(:first-child){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:first-of-type){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:checked){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:last-child){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:last-of-type){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:first-of-type){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:nth-last-of-type(2)){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:nth-last-child(2)){
    /*YOUR STYLE*/
}
any_CSS_selector:not(:nth-child(2)){
    /*YOUR STYLE*/
}

0

Come ho usato ul:not(:first-child)è una soluzione perfetta.

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

Perché questo è perfetto perché ul:not(:first-child), usando , possiamo applicare CSS su elementi interni. Come li, img, span, atag ecc.

Ma quando vengono utilizzate altre soluzioni:

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

e

div li~li {
    color: red;
}

e

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

e

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

Questi limitano solo i CSS di livello ul. Supponiamo che non possiamo applicare CSS licome `div ul + ul li '.

Per gli elementi a livello interno la prima soluzione funziona perfettamente.

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

e così via ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.