Puis-je combiner :nth-child() ou :nth-of-type() avec l'arbitraire d'un sélecteur?
Est-il un moyen de sélectionner chaque nième enfant qui correspond à (ou ne correspond pas) l'arbitraire d'un sélecteur de? Par exemple, je veux sélectionner tous les impair de lignes de table, mais à l'intérieur d'un sous-ensemble de lignes:
table.myClass tr.row:nth-child(odd) {
...
}
<table class="myClass">
<tr>
<td>Row
<tr class="row"> <!-- I want this -->
<td>Row
<tr class="row">
<td>Row
<tr class="row"> <!-- And this -->
<td>Row
</table>
Mais :nth-child()
semble juste pour compter tous les tr
éléments indépendamment de si oui ou non ils sont de la "ligne" de la classe, donc je me retrouve avec une même "ligne" de l'élément à la place de les deux, je suis à la recherche pour. La même chose arrive avec :nth-of-type()
.
Quelqu'un peut m'expliquer pourquoi?
OriginalL'auteur atanamir | 2011-04-04
Vous devez vous connecter pour publier un commentaire.
C'est un problème très commun qui se pose en raison d'une mauvaise compréhension de la façon dont
:nth-child()
et:nth-of-type()
travail. Malheureusement, il n'existe actuellement pas de sélecteur de solution basée sur encore car les Sélecteurs ne fournit pas un moyen pour correspondre à la nième enfant qui correspond à l'arbitraire d'un sélecteur de fonction sur un motif tel que impaire, paire ou toutan+b
oùa != 1
etb != 0
. Cela s'étend au-delà des sélecteurs de classe, à sélecteur d'attribut, des négations, et des combinaisons plus complexes de sélecteurs simples.La
:nth-child()
pseudo-classe compte des éléments parmi tous de leurs frères et sœurs sous le même parent. Il ne compte pas seulement les frères et sœurs qui correspondent le reste de la sélection. De même, la:nth-of-type()
pseudo-classe compte frères et sœurs partageant le même type d'élément, qui désigne le nom de la balise dans le code HTML, et pas le reste de la sélection.Cela signifie également que si tous les enfants d'un même parent sont d'un même type d'élément, par exemple dans le cas d'un corps de table dont seuls les enfants sont
tr
éléments ou un élément de la liste dont seuls les enfants sontli
éléments, puis:nth-child()
et:nth-of-type()
va se comporter à l'identique, c'est à dire pour chaque valeur dean+b
,:nth-child(an+b)
et:nth-of-type(an+b)
trouvera le même ensemble d'éléments.En fait, tous les sélecteurs simples dans un composé sélecteur, y compris les pseudo-classes telles que
:nth-child()
et:not()
, travail indépendamment l'un de l'autre, plutôt que de regarder les sous-ensemble des éléments qui sont mis en correspondance par le reste de la sélection.Cela implique également que il n'y a pas de notion d'ordre entre les simples sélecteurs à l'intérieur de chaque composé sélecteur de1, ce qui signifie, par exemple, les deux sélecteurs sont équivalentes:
Traduit de l'anglais, les deux veulent dire:
(vous remarquerez mon utilisation d'une liste non ordonnée ici, juste pour enfoncer le clou)
Car il n'existe actuellement pas de pure CSS solution, vous devrez utiliser un script pour filtrer les éléments et appliquer des styles supplémentaires ou des noms de classe en conséquence. Par exemple, ce qui suit est une commune de la solution à l'aide de jQuery (en supposant qu'il existe un seul groupe de lignes rempli avec
tr
éléments dans le tableau):Avec le CSS correspondant:
Si vous utilisez des outils de test automatisés tels que le Sélénium ou le traitement de HTML avec des outils comme lxml, la plupart de ces outils permettent de XPath comme une alternative:
D'autres solutions à l'aide de différentes technologies sont laissé comme exercice au lecteur; c'est juste un bref exemple artificiel à des fins d'illustration.
Pour ce que ça vaut, il y a une proposition pour une extension pour le
:nth-child()
de la notation à être ajouté à des Sélecteurs de niveau 4 pour les fins de la sélection de chaque nième enfant correspondant à un sélecteur de donnée.2Le sélecteur de filtrage des matches est fourni comme argument pour
:nth-child()
, de nouveau en raison de la façon dont les sélecteurs de fonctionner indépendamment l'un de l'autre dans un ordre dicté par le sélecteur de syntaxe. Donc dans votre cas, il devrait ressembler à ceci:(Un lecteur attentif remarquera tout de suite que ce devrait être
:nth-child(odd of tr.row)
au lieu de cela, depuis le simple sélecteurstr
et:nth-child()
fonctionner indépendamment l'un de l'autre. C'est l'un des problèmes avec les pseudo-classes qui acceptent les sélecteurs, une boîte de pandore que je préfère ne pas l'ouvrir au milieu de cette réponse. Au lieu de cela, je vais aller avec l'hypothèse que la plupart des sites n'auront pas d'autres éléments quetr
éléments comme les frères et sœurs de l'un à l'autre dans un corps de table, ce qui en ferait l'une des options fonctionnellement équivalent.)Bien sûr, être une marque nouvelle proposition dans une toute nouvelle spécification, ce ne sera probablement pas voir la mise en œuvre jusqu'à quelques années en bas de la route. Dans le même temps, vous aurez à coller avec l'aide d'un script, comme ci-dessus.
1 Si vous spécifiez un type ou d'un sélecteur universel, il doit venir en premier. Cela ne change pas la façon dont les sélecteurs fondamentalement, cependant; il n'est rien de plus qu'un syntaxiques caprice.
2 c'est Ce qui a été proposé à l'origine comme
:nth-match()
, cependant, parce qu'elle compte encore un élément par rapport à ses frères et sœurs, et pas à chaque autre élément qui correspond au sélecteur de donnée, il a, depuis, à partir de 2014 été redéfini comme une extension de l'existant:nth-child()
à la place.Rouge Pois: Une de mes plus grandes HTML bêtes noires: "Dans l'ordre de plus haut/plus bas au plus bas/plus haut:" suivi d'une liste non ordonnée. Je veux dire allez, sérieusement?
OriginalL'auteur BoltClock
Pas vraiment..
citation de la documentation
C'est un sélecteur de sa propre et ne se combine pas avec les classes. Dans votre règle, il suffit de satisfaire à la fois le sélecteur dans le même temps, il affichera le
:nth-child(even)
lignes de la table si ils ont également la.row
classe.OriginalL'auteur Gabriele Petrioli
nth-of-type
fonctionne en fonction de l'indice du même type de l'élément, maisnth-child
fonctionne uniquement en fonction de l'indice de n'importe quel type de frères et sœurs éléments.Par exemple
Supposons que dans html ci-dessus que nous voulons cacher tous les éléments ayant reste de la classe.
Dans ce cas
nth-child
etnth-of-type
fonctionnera exactement le même que tous les éléments sont du même type, c'est-à<div>
donc css devrait êtreOU
Maintenant vous devez vous demander quelle est la différence entre
nth-child
etnth-of-type
c'est donc la différenceSupposons que le html est
Dans le html ci-dessus le type de
.rest
élément est différent des autres.rest
sont des paragraphes et les autres sont des div dans ce cas, si vous utiliseznth-child
vous avez à écrire comme celamais si vous utilisez nth-of-type css peut être ce
<tr>
tags?OriginalL'auteur Gaurav Aggarwal
Vous pourriez être en mesure de le faire avec xpath. quelque chose comme
//tr[contains(@class, 'row') and position() mod 2 = 0]
pourrait fonctionner. Il y a d'autres DONC les questions étendre sur les détails de la façon de faire correspondre les classes plus précisément.OriginalL'auteur the8472