Sélectionnez tous les «tr» sauf le premier

257

Comment puis-je sélectionner tous les tréléments sauf le premier trdans un tableau avec CSS?

J'ai essayé d'utiliser cette méthode, mais j'ai constaté que cela ne fonctionnait pas.

Alexander Abakumov
la source
1
À quels navigateurs cela doit-il être compatible?
Pekka
@ La question de Pekka est importante, car je ne vois pas de moyen de le faire en utilisant du CSS standard qui fonctionnera avec différentes versions d'IE. Si vous devez prendre en charge IE, la seule solution réalisable est une classe pour la première <tr>et une classe différente pour les autres.
Spudley
je ne suis pas inquiet pour IE mais cela fonctionnera en FF et GC

Réponses:

466

En ajoutant une classe au premier trou au suivant trs. Il n'y a aucun moyen de sélectionner les lignes que vous souhaitez avec CSS seul.

Cependant, si vous ne vous souciez pas d'Internet Explorer 6, 7 ou 8:

tr:not(:first-child) {
    color: red;
}
Magnar
la source
18
Je voudrais également souligner tr:not(:first-of-type)une solution potentielle également, si vous recherchez la première instance d'un sélecteur spécifique plutôt que le premier enfant généralisé.
Joshua Burns du
2
Je pense qu'en 2019, nous avons terminé avec IE (moins de 0,5% des utilisateurs d'IE6 à IE10
Webwoman
227

Je suis surpris que personne n'ait mentionné l'utilisation de combinateurs frères, qui sont pris en charge par IE7 et versions ultérieures:

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

Ils fonctionnent tous deux exactement de la même manière (dans le contexte des tableaux HTML de toute façon) que:

tr:not(:first-child)
BoltClock
la source
1
Attendez ... comment cela devrait-il être la réponse acceptée? Vous ne pouvez pas obtenir "tout sauf le premier" de cette déclaration, ce que demande OP. tr + tr vous obtiendrez un seul élément. Je suppose que tr ~ tr vous obtiendrez tous (je suppose que quelque chose comme parent: premier enfant ~ tr), mais pas d'une manière syntaxiquement aussi lisible que non:
hairbo
5
@hairbo: tr + tr vous donnera tout tr qui suit directement un autre tr. Si vous avez un tableau à trois lignes, la troisième ligne suit directement la deuxième ligne, elle correspondra donc également. Vous n'obtiendrez qu'un seul élément si vous utilisez à la place tr: first-child + tr. La seule différence entre + et ~ est que ~ permet un nombre illimité d'autres éléments entre les deux mentionnés.
BoltClock
Je voulais juste ajouter, elem + elemest une excellente solution générale lorsque les éléments que vous souhaitez cibler ne sont pas les seuls enfants. Par exemple, si a <h2>est suivi de plusieurs <p>balises, la première <p>n'est pas le premier enfant dans ce cas.
DisgruntledGoat
27

solution idéale mais non prise en charge dans IE

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

la deuxième solution serait de styliser tous les tr, puis de remplacer avec css pour le premier enfant:

tr {css}
tr:first-child {override css above}
Mark Steggles
la source
10

sonne comme la `` première ligne '' dont vous parlez est votre en-tête de table - vous devriez donc vraiment penser à utiliser theadet tbodydans votre balisage ( cliquez ici ) ce qui entraînerait un `` meilleur '' balisage (sémantiquement correct, utile pour des choses comme les lecteurs d'écran ) et des possibilités plus faciles à utiliser pour tous les navigateurs pour la sélection css ( table thead ... { ... })

oezi
la source
3

Bien que la question ait déjà une réponse décente, je veux juste souligner que la :first-childbalise va sur le type d'élément qui représente les enfants.

Par exemple, dans le code:

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

Si vous souhaitez affecter uniquement les deux seconds éléments avec une marge, mais pas le premier, vous feriez:

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

c'est-à-dire, puisque les inputs sont les enfants, vous placeriez first-childsur la partie d'entrée du sélecteur.

CodyBugstein
la source
1

Désolé, je sais que c'est vieux mais pourquoi ne pas styler tous les éléments tr comme vous le souhaitez, sauf le premier et utiliser la classe psuedo: premier enfant où vous révoquez ce que vous avez spécifié pour tous les éléments tr.

Mieux décrit par cet exemple:

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

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

/ Patrik

Patrik
la source
1

Étant donné que tr:not(:first-child)n'est pas pris en charge par IE 6, 7, 8. Vous pouvez utiliser l'aide de jQuery. Vous pouvez le trouver ici

Tapos
la source
1

Une autre option:

tr:nth-child(n + 2) {
    /* properties */
}
Arman Yeghiazaryan
la source
0

Peut-être que quelqu'un peut en bénéficier, voici ce que j'ai utilisé

ol li:not(:first-child) {
    background: black;
    color: white;
}
Kokkonda Abhilash
la source
-1

Vous pouvez également utiliser un pseudo sélecteur de classe dans votre CSS comme ceci:

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

Cela n'appliquera pas la classe au premier élément avec la classe .desc.

Voici un JSFiddle avec un exemple: http://jsfiddle.net/YYTFT/ , et ceci est une bonne source pour expliquer les sélecteurs de pseudo-classe: http://css-tricks.com/pseudo-class-selectors/

James
la source
1
Cela n'appliquera pas le style au premier élément, le point. first-childignore les classes.
Fez Vrasta
-3

Vous pouvez créer une classe et utiliser la classe lorsque vous définissez tous vos futurs que vous voulez (ou ne voulez pas) être sélectionnés par le CSS.

Cela se ferait en écrivant

<tr class="unselected">

puis dans votre css ayant les lignes (et en utilisant la commande text-align comme exemple):

unselected {
  text-align:center;
}



selected {
  text-align:right;
}
user476033
la source
2
pleas comprendre la question avant de répondre
Ammar Bozorgvar