Ce qu'est une pseudo-classe
Une pseudo-classe est un mot-clé placé après deux-points, qui sélectionne des éléments selon leur position dans le document ou leur état. Vous l'accrochez à un sélecteur normal : li:first-child, input:focus, a:hover.
Les pseudo-classes d'état pour les liens et la souris (:hover, :active, :visited) ont leur propre page, hover en CSS.
:nth-child() et la formule an+b
:nth-child() accepte un nombre, un mot-clé ou une formule an+b. Le navigateur essaie n = 0, 1, 2, ... et cible chaque position produite par la formule (les positions commencent à 1).
| Formule | Positions ciblées | Sens |
|---|---|---|
3 | 3 | Le troisième enfant |
odd ou 2n+1 | 1, 3, 5, ... | Lignes impaires |
even ou 2n | 2, 4, 6, ... | Lignes paires |
3n | 3, 6, 9, ... | Un sur trois |
n+4 | 4, 5, 6, ... | Le quatrième et les suivants |
-n+3 | 1, 2, 3 | Les trois premiers |
3n+1 | 1, 4, 7, ... | Un sur trois, en partant du premier |
Tapez une formule et regardez quels éléments sont ciblés :
Essayez odd, even, 4, n+7, -n+5 et 2n+3. Une formule invalide ne cible rien.
Son jumeau qui compte depuis la fin est :nth-last-child() : li:nth-last-child(-n+2) sélectionne les deux derniers éléments.
nth-child ou nth-of-type
:nth-child() compte tous les éléments frères, quelle que soit leur balise, et ne vérifie qu'ensuite le reste du sélecteur. :nth-of-type() ne compte que les frères de la même balise. La différence apparaît dès que les frères sont mélangés :
Les mêmes paires existent pour les extrémités : :first-child / :first-of-type, :last-child / :last-of-type, :only-child / :only-of-type.
:not(), :is() et :where()
| Pseudo-classe | Exemple | Cible |
|---|---|---|
:not(X) | li:not(.done) | Les éléments qui ne correspondent pas à X |
:is(X, Y) | :is(h1, h2, h3) a | Les éléments qui correspondent à un élément de la liste |
:where(X, Y) | :where(ul, ol) li | Comme :is(), avec une spécificité nulle |
:has(X) | li:has(> input:checked) | Les éléments qui contiennent une correspondance de X |
:not() est celle que l'on utilise tous les jours, par exemple pour placer un séparateur entre les éléments mais pas après le dernier :
Pseudo-classes d'état : focus, checked, disabled, invalid
| Pseudo-classe | Cible |
|---|---|
:focus | L'élément qui a le focus clavier ou souris |
:focus-visible | Un élément qui a le focus, quand le navigateur juge qu'un contour doit s'afficher (en général au clavier) |
:focus-within | Un élément qui contient l'élément ayant le focus |
:checked | Une case à cocher ou un bouton radio coché, ou une <option> sélectionnée |
:disabled / :enabled | Les contrôles de formulaire désactivés (ou non) |
:required / :optional | Les champs avec ou sans required |
:invalid / :valid | Les champs dont la valeur échoue ou réussit la validation |
:user-invalid | Invalide, mais seulement après une interaction de l'utilisateur |
:placeholder-shown | Un champ qui affiche actuellement son placeholder |
:empty | Un élément sans enfant, pas même du texte |
:target | L'élément dont l'id correspond au #fragment de l'URL |
Cliquez dans le champ e-mail : son label devient bleu grâce à :focus-within. Tapez quelque chose qui n'est pas un e-mail et quittez le champ : :user-invalid passe la bordure en ambre. Un simple :invalid aurait marqué en ambre le champ obligatoire vide avant même que vous y touchiez.
Quoi que vous fassiez avec :focus, gardez un style de focus visible. Supprimer le contour sans le remplacer empêche les utilisateurs du clavier de voir où ils se trouvent.
:has(), le sélecteur de parent
:has() cible un élément selon ce qu'il contient. C'est le « sélecteur de parent » réclamé depuis longtemps, et il fonctionne dans les versions actuelles de Chrome, Firefox et Safari.
Choisissez l'autre formule : toute la carte suit le bouton radio, sans JavaScript.
Erreurs courantes
- Un espace avant les deux-points.
li :first-childsignifie « un premier enfant à l'intérieur d'un li ». Écrivezli:first-child. - Croire que
p:nth-child(1)veut dire « le premier p ». Cela veut dire « le premier enfant, si c'est un p ». Utilisez:first-of-typepour le premier p. - Compter à partir de 0. Les positions commencent à 1 :
:nth-child(0)ne cible rien. - Supprimer les contours de focus.
:focus { outline: none }sans remplacement casse la navigation au clavier. - Confondre
:et::.:beforeest une ancienne écriture du pseudo-élément::before; les pseudo-classes utilisent toujours un seul deux-points.
Questions fréquentes
Qu'est-ce qu'une pseudo-classe en CSS ?
Un mot-clé placé après deux-points, qui sélectionne des éléments selon leur état ou leur position plutôt que selon leur nom, comme a:hover, li:first-child ou input:focus. Il s'ajoute à un sélecteur normal, et la plupart des pseudo-classes comptent comme une classe pour la spécificité (:where() compte zéro).
Comment fonctionne nth-child en CSS ?
:nth-child(an+b) cible les éléments dont la position parmi leurs frères vaut a×n+b pour n = 0, 1, 2 et ainsi de suite, en comptant à partir de 1. :nth-child(3) est le troisième enfant, :nth-child(odd) ou 2n+1 chaque enfant impair, et :nth-child(n+4) le quatrième et les suivants.
Quelle est la différence entre nth-child et nth-of-type ?
:nth-child() compte tous les éléments frères, puis vérifie le reste du sélecteur ; :nth-of-type() ne compte que les frères du même type d'élément. Dans une liste formée d'un h2 suivi de paragraphes, p:nth-child(1) ne cible rien alors que p:nth-of-type(1) cible le premier paragraphe.
Comment utiliser :not() en CSS ?
Mettez le sélecteur à exclure entre les parenthèses : li:not(.done) cible tous les éléments de liste sans la classe done. Il accepte aussi une liste, input:not([type="checkbox"], [type="radio"]).
Quelle est la différence entre une pseudo-classe et un pseudo-élément ?
Une pseudo-classe (un seul deux-points, :hover) sélectionne un élément existant entier dans un certain état. Un pseudo-élément (deux fois deux-points, ::before) cible une partie d'un élément ou crée du contenu généré.