Utilisez :hover, :focus, :nth-child, ::before, ::after pour dynamiser vos styles sans JavaScript.
Introduction
Les pseudo-classes et pseudo-éléments permettent de styliser des éléments ou états SANS modifier le HTML. C'est puissant pour créer des interactions et des effets visuels sans JavaScript.
Différence pseudo-class vs pseudo-élément
Pseudo-classe (:) — Sélectionne UN ÉTAT de l'élément
/* L'élément quand on passe la souris dessus */
a:hover {
color: red;
}
/* Un input quand il a le focus */
input:focus {
border-color: blue;
}
Pseudo-élément (::) — Crée ou sélectionne UNE PARTIE de l'élément
/* La première lettre d'un paragraphe */
p::first-letter {
font-size: 2em;
font-weight: bold;
}
/* Le contenu avant un élément */
a::before {
content: "→ ";
}
- Pseudo-classe :
selector:pseudo-class(un seul:) - Pseudo-élément :
selector::pseudo-element(deux::)
Pseudo-classes utiles
:hover — Quand on passe la souris
a:hover {
color: #ff6600;
text-decoration: underline;
}
:active — Quand on clique (enfoncé)
button:active {
transform: scale(0.95);
}
:focus — Quand l'élément a le focus (clavier ou souris)
input:focus {
outline: 2px solid #3498db;
border-color: #3498db;
}
:visited — Pour les liens visités
a:visited {
color: #9370db;
}
:nth-child(n) — Le nième enfant
/* Tous les enfants pairs */
li:nth-child(2n) {
background: #f9f9f9;
}
/* Tous les enfants impairs */
li:nth-child(2n+1) {
background: white;
}
/* Le 3ème enfant */
li:nth-child(3) {
font-weight: bold;
}
:first-child et :last-child — Premier et dernier enfant
li:first-child {
border-top: none;
}
li:last-child {
border-bottom: none;
}
:disabled et :enabled — Pour les inputs
input:disabled {
background: #ddd;
cursor: not-allowed;
}
input:enabled {
background: white;
}
:checked — Checkbox ou radio coché
input[type="checkbox"]:checked {
border-color: #3498db;
}
input[type="checkbox"]:checked + label {
color: #3498db;
}
:not(selector) — Tout sauf cet élément
/* Tous les paragraphes sauf celui avec la classe "intro" */
p:not(.intro) {
font-size: 14px;
}
| Pseudo-classe | Signification |
|---|---|
:hover |
Souris passe dessus |
:active |
Élément enfoncé (clic) |
:focus |
Élément a le focus |
:visited |
Lien déjà visité |
:nth-child(n) |
Le nième enfant |
:first-child |
Premier enfant |
:last-child |
Dernier enfant |
:checked |
Input coché |
:disabled |
Input désactivé |
:not(sel) |
Tout sauf ce sélecteur |
Pseudo-éléments
::before — Crée du contenu AVANT l'élément
/* Ajoute une flèche avant chaque lien */
a::before {
content: "→ ";
color: #ff6600;
margin-right: 5px;
}
::after — Crée du contenu APRÈS l'élément
/* Ajoute une astérisque après les labels requis */
label.required::after {
content: " *";
color: red;
}
::first-letter — La première lettre
p::first-letter {
font-size: 2em;
font-weight: bold;
float: left;
margin-right: 5px;
}
::first-line — La première ligne
p::first-line {
font-weight: bold;
text-transform: uppercase;
}
::selection — Le texte sélectionné à la souris
p::selection {
background: #ff6600;
color: white;
}
| Pseudo-élément | Crée / Sélectionne |
|---|---|
::before |
Du contenu AVANT |
::after |
Du contenu APRÈS |
::first-letter |
Première lettre |
::first-line |
Première ligne |
::selection |
Texte sélectionné |
Pseudo-classes d'interaction avancées
:focus-visible — Focus uniquement au clavier (meilleur qu'outline)
button:focus-visible {
outline: 2px solid #3498db;
outline-offset: 2px;
}
:empty — Élément sans contenu
/* Cache les éléments vides */
div:empty {
display: none;
}
:target — L'élément visé par l'URL (#)
/* Quand URL = #section1, cet élément brille */
#section1:target {
background: #ffff99;
border-left: 4px solid #ff6600;
}
::before et ::after — Les plus puissants
Ces deux pseudo-éléments créent du contenu virtuel. Très utiles pour les décorations :
Créer des séparateurs
.breadcrumb a::after {
content: " / ";
color: #999;
}
.breadcrumb a:last-child::after {
content: ""; /* Pas de séparateur après le dernier */
}
Icônes sans images
.button::before {
content: "✓ ";
font-weight: bold;
}
Contenu avec attributs
/* Affiche l'attribut href d'un lien */
a[href]::after {
content: " (" attr(href) ")";
font-size: 0.8em;
color: #999;
}
Décorations complexes (gradients, ombres)
.fancy-box::before {
content: "";
position: absolute;
top: -10px;
left: -10px;
right: -10px;
bottom: -10px;
background: linear-gradient(135deg, #ff6600, #ff0099);
z-index: -1;
border-radius: 8px;
}
Exemples pratiques complets
Exemple 1 : Bouton avec effet au survol
<button class="button">Cliquez-moi</button>
<style>
.button {
background: #3498db;
color: white;
border: none;
padding: 12px 24px;
border-radius: 4px;
cursor: pointer;
transition: all 0.3s;
}
.button:hover {
background: #2980b9;
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
.button:active {
transform: translateY(0);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.button:focus-visible {
outline: 2px solid #fff;
outline-offset: 2px;
}
</style>
Exemple 2 : Liste avec lignes alternées
<ul class="list">
<li>Élément 1</li>
<li>Élément 2</li>
<li>Élément 3</li>
<li>Élément 4</li>
</ul>
<style>
.list li {
padding: 10px;
border-bottom: 1px solid #ddd;
}
.list li:nth-child(even) {
background: #f9f9f9;
}
.list li:hover {
background: #fffacd;
}
</style>
Exemple 3 : Checkbox stylisé sans JavaScript
<label class="checkbox">
<input type="checkbox">
<span>J'accepte les conditions</span>
</label>
<style>
.checkbox {
display: flex;
align-items: center;
cursor: pointer;
}
.checkbox input {
display: none;
}
.checkbox input + span::before {
content: "";
display: inline-block;
width: 20px;
height: 20px;
border: 2px solid #ddd;
border-radius: 4px;
margin-right: 10px;
}
.checkbox input:checked + span::before {
content: "✓";
background: #3498db;
border-color: #3498db;
color: white;
text-align: center;
line-height: 18px;
}
</style>
Exemple 4 : Badge numéroté avec ::before
<a href="#" class="link-with-counter">Notifications</a>
<style>
.link-with-counter {
position: relative;
}
.link-with-counter::before {
content: "5";
position: absolute;
top: -8px;
right: -8px;
background: #ff4444;
color: white;
width: 20px;
height: 20px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
}
</style>
Conclusion
Les pseudo-classes et pseudo-éléments sont vos meilleurs amis pour le CSS interactif. Utilisez-les au lieu de JavaScript quand possible.
- ✅
:hover, :active, :focus— Interactions souris/clavier - ✅
:nth-child(n)— Sélectionner des éléments spécifiques - ✅
::before, ::after— Créer du contenu virtuel - ✅
::first-letter, ::first-line— Styliser des parties de texte - ✅
::selection— Customiser la sélection
a:hover::before fonctionne. Créez des effets complexes en combina les deux.