Ce que font ::before et ::after
::before insère une boîte comme premier enfant d'un élément et ::after comme dernier enfant. Le contenu de la boîte est défini par la propriété content. Rien n'est ajouté au HTML : le navigateur la génère à partir du CSS.
Le HTML ne contient que 9 et Tests pass. Le signe dollar, l'étiquette « / month » et la coche viennent tous du CSS. Ils héritent des styles de l'élément (police, couleur) sauf si vous les surchargez, comme le font les exemples ci-dessus.
Syntaxe
selector::before {
content: "text"; /* required */
/* any other styles */
}
selector::after {
content: ""; /* empty string: a box with no text */
}
Valeur de content | Résultat |
|---|---|
"text" | Une chaîne. Utilisez "\A" pour un retour à la ligne (avec white-space: pre), "\2192" pour un caractère Unicode (→) |
"" | Une boîte vide, pour les formes et les décorations |
attr(data-label) | La valeur d'un attribut de l'élément |
counter(step) | La valeur d'un compteur CSS |
open-quote / close-quote | Les guillemets adaptés à la langue de l'élément |
none ou normal | Pas de pseudo-élément (normal est la valeur par défaut) |
content est obligatoire. Sans lui, ::before et ::after ne sont jamais créés, quel que soit le nombre d'autres propriétés que vous leur donnez.
Formes décoratives avec content: ""
Avec content: "", le pseudo-élément est une boîte vide que vous pouvez dimensionner et colorer. Il est inline par défaut, et une boîte inline ignore width et height : donnez-lui display: block, inline-block ou position: absolute :
Positionner un pseudo-élément
Pour une décoration placée par-dessus ou autour de l'élément, utilisez position: absolute sur le pseudo-élément et position: relative sur l'élément lui-même, afin que les décalages soient mesurés depuis l'élément :
Attention à l'ordre quand vous combinez avec une pseudo-classe : l'état vient d'abord, puis le pseudo-élément, .link:hover::after, jamais .link::after:hover.
Lire des attributs avec attr() : une infobulle
attr() place la valeur d'un attribut dans content, si bien qu'une seule règle peut afficher un texte différent sur chaque élément :
Une infobulle qui n'apparaît qu'au survol est invisible pour les utilisateurs du clavier et des écrans tactiles. Pour tout ce qui est important, mettez le texte dans la page, ou affichez-le aussi sur :focus avec tabindex="0" sur l'élément.
Numéroter avec des compteurs
Les compteurs CSS et ::before numérotent des éléments sans taper les numéros :
Ajoutez ou supprimez une étape et les numéros se mettent à jour tout seuls.
Où ::before et ::after ne fonctionnent pas
Les pseudo-éléments sont insérés à l'intérieur de l'élément, entre ses balises. Les éléments qui n'ont pas d'intérieur pour eux ne peuvent pas les afficher :
<img>,<video>,<iframe>(éléments remplacés)<input>,<select>,<textarea>(contrôles de formulaire), et<br>
Certains navigateurs les dessinent sur une case à cocher ou une image cassée, mais ce n'est pas constant. Placez plutôt le pseudo-élément sur un conteneur : <span class="field"><input></span> et stylisez .field::after.
Erreurs courantes
- Pas de
content. La raison la plus fréquente pour laquelle rien ne s'affiche. Ajoutezcontent: "". - Dimensionner un pseudo-élément inline.
widthetheightn'ont aucun effet tant que vous n'avez pas définidisplay: block,inline-blockouposition: absolute. - Mauvais ordre avec un état.
a:hover::afterfonctionne ;a::after:hovernon. - Une position absolue sans parent positionné. Le pseudo-élément s'aligne alors sur un ancêtre lointain. Ajoutez
position: relativeà l'élément. - Mettre du vrai contenu dans le CSS. Le texte de
contentne peut pas être sélectionné ni copié. Gardez l'information dans le HTML.
Questions fréquentes
À quoi sert ::before en CSS ?
Il crée un pseudo-élément qui devient le premier enfant de l'élément sélectionné, rempli avec ce qu'indique la propriété content. ::after fait la même chose comme dernier enfant. Aucun des deux n'existe dans le HTML, ce qui les rend pratiques pour les icônes, les étiquettes et les décorations.
Pourquoi mon ::before ou ::after ne s'affiche-t-il pas ?
La cause la plus fréquente est une propriété content manquante : sans elle, le pseudo-élément n'est pas généré. Utilisez content: "" pour une boîte décorative vide. Autres causes : un pseudo-élément inline avec une largeur et une hauteur (donnez-lui display: block ou inline-block), ou un élément comme <img> ou <input> qui ne peut pas en contenir.
Quelle est la différence entre :before et ::before ?
Aucune en termes de comportement. ::before avec deux fois deux-points est la syntaxe actuelle qui distingue les pseudo-éléments ; :before avec un seul deux-points est l'ancienne écriture de CSS2, que les navigateurs acceptent encore pour before, after, first-line et first-letter.
Peut-on utiliser ::before sur un img ou un input ?
Pas de façon fiable. Les pseudo-éléments sont insérés dans le contenu de l'élément, et les éléments remplacés comme <img> ou les contrôles de formulaire comme <input> n'ont pas de boîte de contenu pour eux. Entourez l'élément d'un <span> ou d'un <div> et placez le pseudo-élément sur ce conteneur.
Les lecteurs d'écran lisent-ils le contenu de ::before ?
En général oui : le texte de content fait le plus souvent partie du nom accessible, mais il ne peut pas être sélectionné ni copié. Gardez les vraies informations dans le HTML et utilisez les pseudo-éléments pour la décoration et les petits repères visuels.