Pseudo-éléments CSS modernes : ::before, ::after et typographie avancée

CSS

Les pseudo-éléments CSS sont des outils d’une puissance remarquable, pourtant souvent méconnus des développeurs débutants. Ils permettent de cibler et styler des portions spécifiques d’un élément, ou même d’insérer du contenu sans toucher au HTML. Une lettrine élégante, une icône décorative, un effet visuel subtil… tout devient possible sans alourdir le DOM.

Apparus progressivement avec CSS2 et enrichis par CSS3, les pseudo-éléments ont évolué en syntaxe et en capacités. En 2025, ils constituent un arsenal essentiel pour tout développeur souhaitant maîtriser la séparation entre structure (HTML) et présentation (CSS).

Pseudo-éléments vs pseudo-classes : Distinction fondamentale

Avant d’explorer les pseudo-éléments en détail, clarifions une confusion fréquente. Les pseudo-classes (:hover, :focus, :nth-child) ciblent des états ou positions d’éléments existants. Les pseudo-éléments (::before, ::after, ::first-letter) ciblent des parties d’éléments ou créent du contenu virtuel.

La distinction syntaxique est claire en CSS3 : un seul deux-points pour les pseudo-classes (:hover), deux deux-points pour les pseudo-éléments (::before). Cette notation double a été introduite précisément pour différencier visuellement les deux concepts. Bien que les navigateurs tolèrent encore :before avec un seul deux-points pour raisons de compatibilité, la syntaxe moderne recommande systématiquement le double deux-points.

/* ❌ Ancienne syntaxe (tolérée mais déconseillée) */
p:before { content: "→ "; }
p:first-letter { font-size: 2em; }

/* ✅ Syntaxe moderne (recommandée 2025) */
p::before { content: "→ "; }
p::first-letter { font-size: 2em; }

::first-letter – L’art de la lettrine

La lettrine, cette première lettre majuscule surdimensionnée qui ouvre un chapitre ou un article, traverse les siècles. Des manuscrits médiévaux enluminés aux magazines contemporains, elle signale visuellement le début d’une section importante. CSS offre un moyen élégant de recréer cet effet typographique sans intervention manuelle.

Le pseudo-élément ::first-letter cible automatiquement la première lettre d’un élément de type bloc. Cette simplicité cache une subtilité : seuls certains éléments acceptent ce pseudo-élément. Les conteneurs de texte comme paragraphes, divs, ou titres fonctionnent. Les éléments inline comme <span> ou <a> l’ignorent, sauf s’ils sont transformés en bloc via display: block.

Lettrine classique

/* Lettrine simple */
p.intro::first-letter {
  font-size: 3em;
  font-weight: 700;
  line-height: 1;
  float: left;
  margin-right: 0.1em;
  color: #8300e9;
}

/* HTML correspondant */
<p class="intro">
  Le Lorem Ipsum est simplement du faux texte employé dans 
  la composition et la mise en page avant impression.
</p>

L’utilisation de float: left est cruciale. Elle permet au texte suivant de s’enrouler autour de la lettrine, recréant l’effet typographique traditionnel. Sans ce flottement, la lettre agrandie repousserait simplement le reste du texte vers le bas, créant un espace vertical disgracieux plutôt qu’une lettrine élégante.

Lettrines avancées et décoratives

/* Lettrine avec background */
article p:first-of-type::first-letter {
  font-size: 4em;
  font-weight: 900;
  line-height: 0.8;
  float: left;
  margin: 0.1em 0.2em 0 0;
  padding: 0.2em 0.3em;
  background: linear-gradient(135deg, #8300e9, #a64ff2);
  color: white;
  border-radius: 8px;
  font-family: 'Georgia', serif;
}

/* Lettrine ornementale avec bordure */
.decorative::first-letter {
  font-size: 5em;
  float: left;
  margin: 0.05em 0.1em 0 0;
  padding: 0.1em 0.2em;
  border: 3px solid #8300e9;
  border-radius: 50%;
  line-height: 0.8;
  text-align: center;
}

/* Lettrine avec ombre */
.shadow-letter::first-letter {
  font-size: 3.5em;
  float: left;
  margin-right: 0.15em;
  color: #8300e9;
  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.2);
  font-family: 'Playfair Display', serif;
}

La propriété line-height mérite attention. Une lettrine de 4em avec line-height: 1 occuperait une hauteur excessive, créant un espace vertical inesthétique. Réduire le line-height à 0.8-0.9 compresse verticalement la lettre, permettant au texte de mieux s’aligner autour d’elle.

Propriétés applicables et limites

Contrairement à un élément complet, ::first-letter accepte un sous-ensemble limité de propriétés CSS. Les propriétés de police (font-size, font-family, font-weight), de couleur (color, background), de bordure (border, border-radius), de margin et padding fonctionnent. Les propriétés de layout comme display (sauf float), position, ou width sont ignorées.

/* ✅ Propriétés autorisées */
p::first-letter {
  font-size: 3em; /* ✅ */
  color: red; /* ✅ */
  background: yellow; /* ✅ */
  margin: 10px; /* ✅ */
  padding: 5px; /* ✅ */
  border: 2px solid black; /* ✅ */
  float: left; /* ✅ */
  text-transform: uppercase; /* ✅ */
}

/* ❌ Propriétés ignorées */
p::first-letter {
  width: 50px; /* ❌ Ignoré */
  height: 50px; /* ❌ Ignoré */
  position: absolute; /* ❌ Ignoré */
  display: inline-block; /* ❌ Ignoré (sauf float) */
}

::first-line – Mettre en valeur l’accroche

Le pseudo-élément ::first-line cible la première ligne de texte d’un élément de bloc. Contrairement à ::first-letter qui vise une seule lettre, ::first-line s’applique à une longueur variable : la ligne complète telle qu’affichée à l’écran.

Cette variabilité est à la fois sa force et sa subtilité. La « première ligne » change dynamiquement selon la largeur du conteneur, la taille de police, le zoom utilisateur. Un paragraphe dont la première ligne contient 15 mots sur desktop n’en contiendra peut-être que 8 sur mobile. Le pseudo-élément s’adapte automatiquement, recalculant ce qui constitue la première ligne à chaque reflow.

Accroche éditoriale

/* Première ligne en gras (style journal) */
article p:first-of-type::first-line {
  font-weight: 700;
  font-size: 1.15em;
  letter-spacing: 0.02em;
  color: #1f2937;
}

/* Première ligne avec petites capitales */
.editorial::first-line {
  font-variant: small-caps;
  font-weight: 600;
  letter-spacing: 0.05em;
  color: #8300e9;
}

/* Combinaison lettrine + première ligne */
.premium-intro::first-letter {
  font-size: 4em;
  float: left;
  margin-right: 0.1em;
  color: #8300e9;
}

.premium-intro::first-line {
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  font-size: 0.9em;
}

La combinaison ::first-letter + ::first-line crée un effet typographique riche rappelant les magazines haut de gamme. La lettrine capte l’attention, la première ligne en capitales guide l’œil, puis le texte normal prend le relais. C’est une hiérarchie visuelle subtile mais efficace.

Propriétés restreintes

Comme ::first-letter, ::first-line accepte un ensemble limité de propriétés. Les propriétés de police, couleur et background fonctionnent. Les propriétés de layout comme margin, padding, border sont ignorées. Cette restriction évite les comportements imprévisibles : que signifierait un margin-bottom sur la première ligne ?

/* ✅ Propriétés autorisées */
p::first-line {
  color: blue; /* ✅ */
  font-size: 1.2em; /* ✅ */
  font-weight: bold; /* ✅ */
  text-transform: uppercase; /* ✅ */
  letter-spacing: 0.05em; /* ✅ */
  background: yellow; /* ✅ */
}

/* ❌ Propriétés ignorées */
p::first-line {
  margin: 20px; /* ❌ Ignoré */
  padding: 10px; /* ❌ Ignoré */
  border: 1px solid black; /* ❌ Ignoré */
  width: 300px; /* ❌ Ignoré */
}

::before et ::after – Contenu généré dynamiquement

Les pseudo-éléments ::before et ::after sont probablement les plus puissants et polyvalents de tous. Ils créent des éléments virtuels, insérés respectivement avant et après le contenu d’un élément. Ces éléments n’existent pas dans le HTML, mais se comportent comme des enfants normaux dans le DOM visuel.

Leur force réside dans la séparation des préoccupations. Un contenu purement décoratif (icône, ornement, effet visuel) n’a pas sa place dans le HTML sémantique. ::before et ::after permettent d’ajouter ces éléments visuels depuis le CSS, gardant le HTML propre et accessible.

Propriété content : Obligatoire et polyvalente

La propriété content est absolument obligatoire pour ::before et ::after. Sans elle, le pseudo-élément n’apparaît tout simplement pas. Même pour un pseudo-élément purement décoratif sans texte, content: '' (chaîne vide) doit être déclaré.

/* Contenu textuel simple */
h1::before {
  content: "→ ";
  color: #8300e9;
  margin-right: 0.5em;
}

/* Contenu vide pour élément décoratif */
.decorated::before {
  content: '';
  display: block;
  width: 50px;
  height: 3px;
  background: #8300e9;
  margin-bottom: 1rem;
}

/* Contenu depuis attribut HTML */
a[data-tooltip]::after {
  content: attr(data-tooltip);
  position: absolute;
  background: #1f2937;
  color: white;
  padding: 0.5rem;
  border-radius: 4px;
}

/* Contenu depuis URL (image) */
h2::before {
  content: url('/icons/star.svg');
  margin-right: 0.5rem;
  vertical-align: middle;
}

/* Contenu avec guillemets */
blockquote::before {
  content: open-quote;
  font-size: 3em;
  color: #8300e9;
}

blockquote::after {
  content: close-quote;
  font-size: 3em;
  color: #8300e9;
}

La fonction attr() est particulièrement élégante. Elle récupère la valeur d’un attribut HTML pour l’injecter dans le CSS. C’est le pont entre structure (HTML) et présentation (CSS), permettant du contenu semi-dynamique sans JavaScript.

Cas d’usage créatifs

/* Icônes avant liens externes */
a[href^="http"]::after {
  content: ' ↗';
  font-size: 0.8em;
  color: #8300e9;
  margin-left: 0.2em;
}

/* Badges de statut */
.article[data-status="new"]::before {
  content: attr(data-status);
  display: inline-block;
  padding: 0.25em 0.75em;
  background: #10b981;
  color: white;
  border-radius: 9999px;
  font-size: 0.75em;
  text-transform: uppercase;
  margin-right: 0.5rem;
}

/* Clearfix moderne (rare maintenant avec flexbox/grid) */
.clearfix::after {
  content: '';
  display: table;
  clear: both;
}

/* Overlay décoratif */
.card::before {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(
    135deg,
    rgba(131, 0, 233, 0.1),
    transparent
  );
  pointer-events: none;
  border-radius: inherit;
}

/* Compteur automatique */
body {
  counter-reset: section;
}

h2::before {
  counter-increment: section;
  content: counter(section) ". ";
  color: #8300e9;
  font-weight: 700;
}

/* Effet de ligne décorative */
.section-title::after {
  content: '';
  display: block;
  width: 60px;
  height: 4px;
  background: linear-gradient(to right, #8300e9, #a64ff2);
  margin-top: 1rem;
  border-radius: 2px;
}

Les compteurs CSS (counter-reset, counter-increment) combinés à ::before permettent une numérotation automatique sans JavaScript. Les titres, sections, listes personnalisées s’incrémentent seuls. C’est une fonctionnalité méconnue mais puissante pour les documents structurés.

Accessibilité et pseudo-éléments

Point crucial : le contenu inséré via ::before et ::after n’est PAS accessible aux lecteurs d’écran par défaut. Il est purement visuel. Pour du contenu décoratif (icônes, ornements), c’est parfait. Pour du contenu informatif, c’est problématique.

/* ❌ Mauvaise pratique : info importante en ::before */
.error::before {
  content: "Erreur : ";
  /* Non lu par lecteurs d'écran */
}

/* ✅ Bonne pratique : info en HTML, style en CSS */
<div class="error">
  <span class="sr-only">Erreur :</span>
  Message d'erreur
</div>

.error::before {
  content: '';
  display: inline-block;
  width: 20px;
  height: 20px;
  background: url('/icons/error.svg');
  margin-right: 0.5rem;
}

/* Classe sr-only (screen reader only) */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

La règle d’or : pseudo-éléments pour décoration, HTML pour information. Une icône purement esthétique va en ::before. Un label informatif crucial va en HTML, éventuellement masqué visuellement mais accessible aux technologies d’assistance.

Pseudo-éléments modernes : ::marker, ::selection, ::placeholder

Au-delà des classiques, CSS moderne introduit de nouveaux pseudo-éléments pour cibler des parties spécifiques des éléments. Leur support navigateur, longtemps limité, atteint désormais 95%+ en 2025.

::marker – Styliser les puces de listes

/* Personnaliser puces de listes */
ul li::marker {
  color: #8300e9;
  font-size: 1.5em;
  content: "→ ";
}

ol li::marker {
  color: #8300e9;
  font-weight: 700;
  font-size: 1.2em;
}

/* Compteur personnalisé */
ol {
  counter-reset: custom-counter;
}

ol li {
  counter-increment: custom-counter;
}

ol li::marker {
  content: "[" counter(custom-counter) "] ";
  color: #8300e9;
  font-weight: 600;
}

::selection – Couleur de sélection

/* Sélection personnalisée globale */
::selection {
  background: #8300e9;
  color: white;
}

/* Firefox nécessite préfixe */
::-moz-selection {
  background: #8300e9;
  color: white;
}

/* Sélection par élément */
code::selection {
  background: #1f2937;
  color: #fbbf24;
}

::placeholder – Texte d’indication inputs

/* Placeholder personnalisé */
input::placeholder {
  color: #9ca3af;
  font-style: italic;
  opacity: 0.7;
}

textarea::placeholder {
  color: #6b7280;
  font-size: 0.875rem;
}

/* Focus : placeholder disparaît progressivement */
input:focus::placeholder {
  opacity: 0;
  transition: opacity 0.2s ease;
}

Performance et bonnes pratiques

Bien que puissants, les pseudo-éléments peuvent impacter les performances s’ils sont surutilisés. Chaque ::before et ::after ajoute un nœud virtuel au render tree, augmentant la charge de calcul du navigateur.

Optimisations recommandées

/* ⚠️ Éviter pseudo-éléments sur TOUS les éléments */
* ::before,
* ::after {
  /* Crée potentiellement milliers de nœuds */
}

/* ✅ Limiter à classes spécifiques */
.decorated::before {
  /* Cible uniquement éléments nécessaires */
}

/* Performance : will-change pour animations */
.animated::before {
  will-change: transform, opacity;
  transition: transform 0.3s ease;
}

.animated:hover::before {
  transform: scale(1.1);
}

/* Désactiver will-change après animation */
.animated:not(:hover)::before {
  will-change: auto;
}

Checklist bonnes pratiques

  • Double deux-points (::before) plutôt que simple (:before)
  • content obligatoire, même vide (content: '')
  • Contenu décoratif en pseudo-éléments, informatif en HTML
  • ::first-letter nécessite float: left pour lettrine
  • line-height réduit (0.8-0.9) pour lettrines
  • Pseudo-éléments ignorés par lecteurs d’écran
  • Limiter usage global (*::before), privilégier classes ciblées
  • Propriétés restreintes sur ::first-letter et ::first-line
  • attr() pour contenu semi-dynamique
  • Compteurs CSS pour numérotation automatique

Conclusion : Les pseudo-éléments, outils de précision CSS

Les pseudo-éléments CSS incarnent l’élégance de la séparation des préoccupations. Ils permettent d’enrichir visuellement une interface sans polluer le HTML de balises décoratives. Une lettrine majestueuse, une icône contextuelle, un ornement subtil… tout se définit depuis les feuilles de style, gardant le balisage propre et sémantique.

Leur évolution reflète la maturation de CSS. Les premiers pseudo-éléments (::first-letter, ::first-line) visaient la typographie print, transposant au web des conventions éditoriales séculaires. ::before et ::after ont ouvert un champ créatif immense, permettant effets et décorations sans alourdir le DOM. Les nouveaux pseudo-éléments (::marker, ::selection, ::placeholder) affinent encore le contrôle, ciblant des portions toujours plus spécifiques.

Mais avec cette puissance vient une responsabilité. Les pseudo-éléments sont invisibles aux technologies d’assistance. Un contenu informatif crucial placé en ::before exclut les utilisateurs de lecteurs d’écran. La règle demeure simple : décoration en CSS, information en HTML.

Maîtriser les pseudo-éléments, c’est comprendre où tracer la frontière entre structure et présentation. C’est savoir quand un effet mérite son propre élément HTML, et quand il peut élégamment se glisser en CSS. Cette discernement distingue le développeur occasionnel du craftsman attentif.

Les pseudo-éléments ne créent pas le design à eux seuls, mais ils le peaufinent, l’affinent, le polissent. Ils sont les touches finales qui transforment une interface fonctionnelle en expérience soignée.

Besoin d’accompagnement pour affiner les détails typographiques de vos interfaces ? Chez Itamde, nous créons des expériences web où chaque lettre, chaque ornement, chaque micro-détail contribue à l’harmonie globale. Découvrez nos services de design éditorial et développement web, et explorez nos autres guides CSS pour approfondir votre maîtrise des standards modernes.

« 

Itamde est également une école de programmation en ligne.

Itamde

Apprenez ce que vous voulez, à votre rythme

0 commentaires

Soumettre un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pourriez être intéressé par…

Pourquoi créer un SaaS sans audience mène droit à l’échec

Pourquoi créer un SaaS sans audience mène droit à l’échec

La fièvre entrepreneuriale autour des SaaS (Software as a Service) n'a jamais été aussi intense. L'arrivée des intelligences artificielles a décuplé cette tendance en rendant le développement plus accessible que jamais. ChatGPT, GitHub Copilot et consorts permettent...

Restez informé des dernières actualités et mises à jour

Accédez au contenu réservé

Découvrez les coulisses de nos projets, des ressources exclusives et l’avancée de nos créations en temps réel.

Inscrivez-vous à la newsletter

Recevez nos actualités, nos réflexions créatives et les nouveautés de l’atelier directement dans votre boîte mail.

Suivez-nous

Rejoignez notre communauté sur les réseaux pour suivre nos projets au quotidien et échanger avec nous.