Il s'agit d'un problème très courant qui résulte d'une mauvaise compréhension de la manière dont le système d'information est utilisé. :nth-child(An+B)
y :nth-of-type()
travail.
Dans les sélecteurs de niveau 3, l'option :nth-child()
pseudo-classe compte les éléments parmi les tous de leurs frères et sœurs sous le même parent. Il ne compte pas uniquement les frères et sœurs qui correspondent au reste du sélecteur.
De même, le :nth-of-type()
pseudo-classe compte les frères et sœurs partageant le même type d'élément, ce qui fait référence au nom de la balise en HTML, et non au reste du sélecteur.
Cela signifie également que si tous les enfants d'un même parent sont du même type d'élément, par exemple dans le cas d'un corps de tableau dont les seuls enfants sont des tr
ou un élément de liste dont les seuls enfants sont li
éléments, alors :nth-child()
y :nth-of-type()
se comporteront de manière identique, c'est-à-dire pour chaque valeur de An+B, :nth-child(An+B)
y :nth-of-type(An+B)
correspondra au même ensemble d'éléments.
En fait, tous les sélecteurs simples d'un sélecteur composé donné, y compris les pseudo-classes telles que :nth-child()
y :not()
, travail de manière indépendante des uns et des autres, plutôt que de regarder les sous-ensemble d'éléments auxquels correspond le reste du sélecteur.
Cela implique également que il n'y a pas de notion d'ordre entre les sélecteurs simples à l'intérieur de chaque sélecteur composé individuel 1 ce qui signifie, par exemple, que les deux sélecteurs suivants sont équivalents :
table.myClass tr.row:nth-child(odd)
table.myClass tr:nth-child(odd).row
Traduits en anglais, ils signifient tous deux :
Sélectionnez n'importe quel tr
qui remplit toutes les conditions indépendantes suivantes :
- il s'agit d'un enfant impair de son parent ;
- il appartient à la classe "rangée" ; et
- il s'agit d'un descendant d'un
table
qui a la classe "myClass".
(vous remarquerez que j'utilise ici une liste non ordonnée, juste pour enfoncer le clou)
Le niveau 4 des sélecteurs vise à remédier à cette limitation en autorisant :nth-child(An+B of S)
2 pour accepter un argument de sélecteur arbitraire S, toujours en raison de la façon dont les sélecteurs fonctionnent indépendamment les uns des autres dans un sélecteur composé, comme le dicte la syntaxe existante des sélecteurs. Dans votre cas, cela donnerait donc ceci :
table.myClass tr:nth-child(odd of .row)
Bien entendu, comme il s'agit d'une toute nouvelle proposition dans une toute nouvelle spécification, elle ne sera probablement pas mise en œuvre avant le mois d'octobre. dans quelques années .
En attendant, vous devrez utiliser un script pour filtrer les éléments et appliquer des styles ou des noms de classe supplémentaires en conséquence. Par exemple, voici une solution de contournement courante utilisant jQuery (en supposant qu'il n'y ait qu'un seul groupe de lignes peuplé de tr
dans le tableau) :
$('table.myClass').each(function() {
// Note that, confusingly, jQuery's filter pseudos are 0-indexed
// while CSS :nth-child() is 1-indexed
$('tr.row:even').addClass('odd');
});
Avec le CSS correspondant :
table.myClass tr.row.odd {
...
}
Si vous utilisez des outils de test automatisés tels que Selenium ou des outils de scraping HTML tels que BeautifulSoup, beaucoup de ces outils permettent d'utiliser XPath comme alternative :
//table[contains(concat(' ', @class, ' '), ' myClass ')]//tr[contains(concat(' ', @class, ' '), ' row ')][position() mod 2)=1]
D'autres solutions utilisant des technologies différentes sont laissées à l'appréciation du lecteur ; il ne s'agit ici que d'un exemple bref et artificiel à titre d'illustration.
1 Si vous spécifiez un type ou un sélecteur universel, il doit être placé en premier. Cela ne modifie pas le fonctionnement fondamental des sélecteurs ; il s'agit simplement d'une bizarrerie syntaxique.
2 Il a été proposé à l'origine <code>:nth-match()</code> Cependant, comme il ne compte un élément que par rapport à ses frères et sœurs, et non par rapport à tous les autres éléments qui correspondent au sélecteur donné, il a depuis 2014 été réaffecté en tant qu'extension de l'outil existant <code>:nth-child()</code> au lieu de cela.