Menu

Pseudo-classes CSS : nth-child, not, first-child, focus

Les pseudo-classes sélectionnent des éléments selon leur position ou leur état : :nth-child(), :first-child, :not(), :focus, :checked, :has() et d'autres. Découvrez la syntaxe, la formule an+b avec un testeur en direct et la différence entre nth-child et nth-of-type.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

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).

FormulePositions cibléesSens
33Le troisième enfant
odd ou 2n+11, 3, 5, ...Lignes impaires
even ou 2n2, 4, 6, ...Lignes paires
3n3, 6, 9, ...Un sur trois
n+44, 5, 6, ...Le quatrième et les suivants
-n+31, 2, 3Les trois premiers
3n+11, 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-classeExempleCible
:not(X)li:not(.done)Les éléments qui ne correspondent pas à X
:is(X, Y):is(h1, h2, h3) aLes éléments qui correspondent à un élément de la liste
:where(X, Y):where(ul, ol) liComme :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-classeCible
:focusL'élément qui a le focus clavier ou souris
:focus-visibleUn élément qui a le focus, quand le navigateur juge qu'un contour doit s'afficher (en général au clavier)
:focus-withinUn élément qui contient l'élément ayant le focus
:checkedUne case à cocher ou un bouton radio coché, ou une <option> sélectionnée
:disabled / :enabledLes contrôles de formulaire désactivés (ou non)
:required / :optionalLes champs avec ou sans required
:invalid / :validLes champs dont la valeur échoue ou réussit la validation
:user-invalidInvalide, mais seulement après une interaction de l'utilisateur
:placeholder-shownUn champ qui affiche actuellement son placeholder
:emptyUn élément sans enfant, pas même du texte
:targetL'é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-child signifie « un premier enfant à l'intérieur d'un li ». Écrivez li: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-type pour 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 ::. :before est 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é.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER