Seleziona tutto 'tr' tranne il primo


257

Come posso selezionare tutti gli trelementi tranne il primo trin una tabella con CSS?

Ho provato a utilizzare questo metodo, ma ho scoperto che non funzionava.


1
A quali browser deve essere compatibile?
Pekka,


La domanda di @ Pekka è importante, perché non riesco a pensare ad alcun modo per farlo usando CSS standard che funzioneranno con varie versioni di IE. Se è necessario supportare IE, l'unica soluzione praticabile è una classe per la prima <tr>e una classe diversa per il resto.
Spudley,

non sono preoccupato per IE ma funzionerà in FF e GC

Risposte:


466

Aggiungendo una classe alla prima tro alla successiva tr. Non esiste un modo crossbrowser per selezionare le righe desiderate solo con CSS.

Tuttavia, se non ti interessa Internet Explorer 6, 7 o 8:

tr:not(:first-child) {
    color: red;
}

18
Vorrei anche indicare tr:not(:first-of-type)come potenziale soluzione, se stai cercando la prima istanza di un selettore specifico anziché il primo figlio generalizzato.
Joshua Burns,

2
Penso che nel 2019 abbiamo finito con IE (meno dello 0,5% degli utenti da IE6 a IE10
Webwoman

227

Sono sorpreso che nessuno abbia menzionato l'uso di combinatori di pari livello, che sono supportati da IE7 e versioni successive:

tr + tr /* CSS2, adjacent sibling */
tr ~ tr /* CSS3, general sibling */

Entrambi funzionano esattamente allo stesso modo (nel contesto delle tabelle HTML) come:

tr:not(:first-child)

1
Aspetta ... come dovrebbe essere questa la risposta accettata? Non è possibile ottenere "tutto tranne il primo" da tale affermazione, che è ciò che l'OP chiede. tr + tr ti darà un singolo elemento. Immagino che tr ~ tr ti prenderà tutti (suppongo che qualcosa come il genitore: primogenito ~ tr), ma non in modo sintatticamente leggibile come non lo è:
hairbo,

5
@hairbo: tr + tr ti darà qualsiasi tr che segue direttamente un'altra tr. Se hai una tabella con tre righe, la terza riga segue direttamente la seconda riga, quindi corrisponderà anche. Otterrai un singolo elemento solo se usi invece tr: first-child + tr. L'unica differenza tra + e ~ è che ~ consente qualsiasi numero di altri elementi tra i due citati.
BoltClock

Volevo solo aggiungere, elem + elemè un'ottima soluzione generale per quando gli elementi che vuoi colpire non sono i soli figli. Ad esempio, se a <h2>è seguito da più <p>tag, il primo <p>non è il primo figlio in quel caso.
DisgruntledGoat

27

soluzione ideale ma non supportata in IE

tr:not(:first-child) {css}

la seconda soluzione sarebbe quella di modellare tutte le tr e quindi sovrascrivere con css per il primo figlio:

tr {css}
tr:first-child {override css above}

10

sembra che la "prima riga" di cui stai parlando sia l'intestazione della tabella - quindi dovresti davvero pensare di utilizzare theade tbodynel tuo markup ( fai clic qui ) che si tradurrebbe in un markup "migliore" (semanticamente corretto, utile per cose come gli screen reader ) e possibilità più facili da usare su più browser per css-selection ( table thead ... { ... })


3

Sebbene la domanda abbia già una risposta decente, voglio solo sottolineare che il :first-childtag va sul tipo di elemento che rappresenta i bambini.

Ad esempio, nel codice:

<div id"someDiv">
     <input id="someInput1" /> 
     <input id="someInput2" />
     <input id="someInput2" />
</div

Se vuoi influenzare solo i secondi due elementi con un margine, ma non il primo, dovresti:

#someDiv > input {
     margin-top: 20px;
}
#someDiv > input:first-child{
     margin-top: 0px;
}

cioè, poiché gli inputs sono i figli, si posizionerebbe first-childsulla porzione di input del selettore.


1

Mi dispiace, so che questo è vecchio, ma perché non modellare tutti gli elementi tr nel modo desiderato tutti tranne il primo e usare la classe psuedo: first-child dove revochi ciò che hai specificato per tutti gli elementi tr.

Meglio descritto da questo esempio:

http://jsfiddle.net/DWTr7/1/

tr {
    border-top: 1px solid;
}
tr:first-child {
    border-top: none;   
}

/ Patrik


1

Poiché tr:not(:first-child)non è supportato da IE 6, 7, 8. È possibile utilizzare l'aiuto di jQuery. Puoi trovarlo qui



0

Potrebbe essere qualcuno che può beneficiare, di seguito è quello che ho usato

ol li:not(:first-child) {
    background: black;
    color: white;
}

-1

Puoi anche usare un selettore di pseudo-classe nel tuo CSS in questo modo:

.desc:not(:first-child) {
    display: none;
}

Ciò non applicherà la classe al primo elemento con la classe .desc.

Ecco un JSFiddle con un esempio: http://jsfiddle.net/YYTFT/ , e questa è una buona fonte per spiegare i selettori di pseudo-classi: http://css-tricks.com/pseudo-class-selectors/


1
Questo non applicherà lo stile al primo elemento, punto. first-childignora le classi.
Fez Vrasta,

-3

È possibile creare una classe e utilizzare la classe quando si definisce tutto il futuro che si desidera (o non si desidera) essere selezionato dal CSS.

Questo sarebbe fatto scrivendo

<tr class="unselected">

e poi nel tuo CSS con le linee (e usando il comando text-align come esempio):

unselected {
  text-align:center;
}



selected {
  text-align:right;
}

2
per favore capisci la domanda prima di rispondere
Ammar Bozorgvar
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.