Module CSS.2 – Cascade & spécificité
Objectif
Comprendre la cascade CSS, l'héritage, la spécificité et quand utiliser !important pour contrôler précisément l'application des styles.
Théorie
La cascade CSS
Cascade = Ordre dans lequel les styles sont appliqués quand plusieurs règles s'appliquent au même élément.
Ordre d'application :
- Source : Auteur > Utilisateur > Navigateur
- Spécificité : Plus spécifique gagne
- Ordre : Dernière règle dans le code gagne (à spécificité égale)
Exemple :
/* Règle 1 */
p {
color: blue;
}
/* Règle 2 (appliquée car plus tard dans le code) */
p {
color: red;
}
/* Résultat : texte rouge */
Spécificité
Spécificité = Poids d'un sélecteur. Plus le sélecteur est spécifique, plus il a de poids.
Calcul de spécificité (a, b, c, d) :
- a : Styles inline (1000 points)
- b : IDs (100 points chacun)
- c : Classes, attributs, pseudo-classes (10 points chacun)
- d : Éléments, pseudo-éléments (1 point chacun)
Exemples :
/* Spécificité : 0,0,0,1 (1 point) */
p { color: blue; }
/* Spécificité : 0,0,1,0 (10 points) */
.texte { color: red; }
/* Spécificité : 0,0,1,1 (11 points) */
p.texte { color: green; }
/* Spécificité : 0,1,0,0 (100 points) */
#header { color: purple; }
/* Spécificité : 0,1,1,1 (111 points) */
#header p.texte { color: orange; }
Résultat : Le sélecteur avec la spécificité la plus élevée gagne.
Ordre d'importance
Quand la spécificité est égale, l'ordre compte :
/* Appliqué en premier */
p {
color: blue;
}
/* Appliqué en dernier (gagne) */
p {
color: red;
}
/* Résultat : texte rouge */
Héritage
Héritage = Les éléments enfants héritent des propriétés de leurs parents.
Propriétés héritées :
colorfont-familyfont-sizeline-heighttext-align- etc.
Propriétés non héritées :
marginpaddingborderwidthheightbackground- etc.
Exemple d'héritage :
body {
color: blue;
font-family: Arial;
}
<body>
<p>Texte bleu en Arial (hérité)</p>
<div>
<p>Texte bleu en Arial (hérité aussi)</p>
</div>
</body>
Forcer l'héritage :
.enfant {
color: inherit; /* Hérite de la couleur du parent */
}
!important
!important = Force une déclaration, ignore la cascade et la spécificité.
p {
color: blue !important;
}
.texte {
color: red; /* Ignoré à cause de !important */
}
/* Résultat : texte bleu */
⚠️ Dangers de !important :
- ❌ Difficile à surcharger
- ❌ Rend le CSS difficile à maintenir
- ❌ Masque les problèmes de spécificité
- ❌ Crée des conflits
Quand utiliser (rarement) :
- Override de styles tiers (frameworks)
- Styles critiques (accessibilité)
- En dernier recours
Meilleure pratique : Éviter !important, corriger la spécificité à la place.
Règles de cascade complètes
Ordre de priorité (du plus faible au plus fort) :
- Règles normales (spécificité normale)
- Règles avec
!important(spécificité normale) - Règles inline (spécificité normale)
- Règles inline avec
!important(spécificité normale)
Exemple :
/* 1. Règle normale */
p { color: blue; }
/* 2. Règle avec !important (gagne sur 1) */
p { color: red !important; }
/* 3. Inline (gagne sur 1 et 2) */
<p style="color: green;">Texte</p>
/* 4. Inline avec !important (gagne sur tout) */
<p style="color: orange !important;">Texte</p>
Calculer la spécificité
Méthode :
- Compter les IDs : (0, nombre d'IDs, 0, 0)
- Compter les classes/attributs/pseudo-classes : (0, 0, nombre, 0)
- Compter les éléments/pseudo-éléments : (0, 0, 0, nombre)
Exemples détaillés :
/* 0,0,0,1 = 1 point */
p { }
/* 0,0,1,0 = 10 points */
.texte { }
/* 0,0,1,1 = 11 points */
p.texte { }
/* 0,1,0,0 = 100 points */
#header { }
/* 0,1,1,1 = 111 points */
#header p.texte { }
/* 0,0,3,1 = 31 points */
.texte.important.urgent p { }
Bonnes pratiques
1. Éviter la sur-spécificité
❌ Mauvais :
body div.container section article p.texte {
color: blue;
}
✅ Bon :
.texte {
color: blue;
}
2. Utiliser des classes plutôt que des IDs
❌ Mauvais :
#header { }
#content { }
#footer { }
✅ Bon :
.header { }
.content { }
.footer { }
Pourquoi : Classes = réutilisables, spécificité plus faible.
3. Éviter !important
❌ Mauvais :
p {
color: blue !important;
}
✅ Bon :
p.texte-important {
color: blue;
}
4. Organiser le CSS par spécificité croissante
/* Spécificité faible d'abord */
p { }
/* Puis plus spécifique */
.texte { }
/* Enfin très spécifique */
#header .texte { }
Exercices guidés
Exercice 1 : Comprendre la cascade
Créez plusieurs règles pour le même élément :
- Règle 1 :
p { color: blue; } - Règle 2 :
p { color: red; } - Observez quelle règle est appliquée (dernière)
Exercice 2 : Calculer la spécificité
Calculez la spécificité de ces sélecteurs :
p.texte#headerp.texte#header p.textediv.container section p
Exercice 3 : Héritage
Créez un parent avec color: blue et observez :
- Les enfants héritent-ils de la couleur ?
- Testez avec
margin(non hérité)
Exercice 4 : !important
Testez !important :
- Créez un conflit de spécificité
- Utilisez
!importantpour forcer - Comprenez pourquoi c'est dangereux
Exercice 5 : Résolution de conflits
Créez un conflit de styles et résolvez-le :
- Sans utiliser
!important - En ajustant la spécificité
- En réorganisant le CSS
❌ Erreurs fréquentes
Erreur 1 : Sur-spécificité
❌ Mauvais :
body div.container section article p.texte {
color: blue;
}
✅ Bon :
.texte {
color: blue;
}
Pourquoi : Plus simple, plus maintenable.
Erreur 2 : Utiliser !important partout
❌ Mauvais :
p { color: blue !important; }
.texte { font-size: 16px !important; }
✅ Bon :
p { color: blue; }
.texte { font-size: 16px; }
Pourquoi : !important rend le CSS difficile à maintenir.
Erreur 3 : Confondre héritage
❌ Mauvais :
body {
margin: 20px; /* margin n'est pas hérité */
}
/* Pense que tous les enfants auront margin */
✅ Bon :
body {
margin: 20px;
}
/* Utiliser * ou reset si besoin */
* {
margin: 0;
}
Pourquoi : Comprendre quelles propriétés sont héritées.
Erreur 4 : IDs pour le style
❌ Mauvais :
#header { }
#content { }
✅ Bon :
.header { }
.content { }
Pourquoi : IDs = unique, difficile à réutiliser, spécificité élevée.
Erreur 5 : Ignorer l'ordre
❌ Mauvais :
/* Règle spécifique en premier */
#header p { color: blue; }
/* Règle générale après (ne fonctionne pas) */
p { color: red; }
✅ Bon :
/* Règle générale d'abord */
p { color: red; }
/* Règle spécifique après */
#header p { color: blue; }
Pourquoi : Organisation logique (général → spécifique).
🚀 Mini-projet
Mission : Maîtriser la cascade et la spécificité
Créez une page avec plusieurs niveaux de styles :
Styles à créer :
- Styles généraux (
body,p,h1) - Styles de classes (
.texte-important,.centré) - Styles spécifiques (
.container .texte) - Conflits de styles à résoudre
- Test d'héritage
Défis :
- Créer des conflits et les résoudre sans
!important - Calculer la spécificité de chaque sélecteur
- Comprendre quel style est appliqué et pourquoi
Critères :
- ✅ Compréhension de la cascade
- ✅ Calcul correct de la spécificité
- ✅ Résolution de conflits sans !important
- ✅ Code organisé (général → spécifique)
Objectif : Maîtriser la cascade, la spécificité et l'héritage pour contrôler précisément vos styles.
Validation : Vous pouvez passer au module suivant quand vous comprenez la cascade, pouvez calculer la spécificité, et résolvez les conflits sans !important.