Adloun

Cascade, spécificité et héritage

Cours · CSS : mettre en forme le Web (école d'ingénieur), chapitre 3 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun

Le chapitre précédent s'est terminé sur une énigme. La feuille de la Librairie du Campus contient deux règles qui donnent une couleur aux liens du menu :


header a {
  color: white;
}

a:hover {
  color: #e07a1f;
}

Quand on survole un lien de l'en-tête, les deux s'appliquent. La première est pourtant écrite pour l'en-tête, et la seconde pour tous les liens du site ; on s'attend à ce que la plus précise gagne. C'est la seconde qui l'emporte, et le lien devient ocre sur bleu nuit.

Ce n'est ni un hasard ni un caprice du navigateur. Chaque fois que plusieurs déclarations donnent une valeur à la même propriété d'un même élément, un algorithme précis, la cascade, choisit la gagnante. Et lorsqu'aucune déclaration ne concerne une propriété, un second mécanisme, l'héritage, peut fournir la valeur du parent. Ce sont les deux mots qui font la réputation de CSS ; ce chapitre les rend prévisibles.

Objectifs du chapitre

  • Connaître les critères de la cascade, dans l'ordre : origine et importance, couche, spécificité, ordre d'apparition.
  • Calculer la spécificité de n'importe quel sélecteur, y compris avec :is(), :not(), :has() et :where().
  • Savoir quand !important est justifié — presque jamais.
  • Savoir quelles propriétés s'héritent, et utiliser inherit, initial, unset, revert.
  • Organiser une feuille en couches avec @layer.
  • Trouver, dans les outils de développement, pourquoi une déclaration ne s'applique pas.

3.1 Plusieurs règles pour une même propriété

Partons d'un conflit minimal : trois règles donnent une couleur au même paragraphe.


<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Un conflit de règles</title>
  <link rel="stylesheet" href="conflit.css">
</head>
<body>
  <main>
    <p class="accroche">Trois livres arrivés cette semaine.</p>
    <p>Retrait gratuit en boutique.</p>
  </main>
</body>
</html>

body {
  font-family: system-ui, sans-serif;
}

main p {
  color: #1f3a68;
}

.accroche {
  color: #a8520a;
  font-weight: bold;
}

p {
  color: #222;
}

Illustration

Le paragraphe accroche est concerné par les trois règles. Il s'affiche en ocre foncé : la règle .accroche l'emporte, bien qu'elle ne soit ni la première ni la dernière. Le second paragraphe, qui n'a pas de classe, est bleu nuit : main p l'emporte sur p, pourtant écrite après elle. L'ordre d'écriture n'est donc pas le premier critère.

Définition 3.1Cascade

Pour chaque élément et chaque propriété, le navigateur rassemble toutes les déclarations qui s'appliquent (celles dont le sélecteur désigne l'élément). La cascade les départage en comparant, dans cet ordre, et en ne passant au critère suivant qu'en cas d'égalité :

  • l'origine et l'importance de la déclaration ;
  • la couche (@layer) à laquelle elle appartient ;
  • la spécificité de son sélecteur ;
  • son ordre d'apparition : la dernière l'emporte.

La valeur retenue est la valeur en cascade de la propriété. Si aucune déclaration ne s'applique, la propriété reçoit sa valeur par héritage ou sa valeur initiale (section 3.6).

Dans l'exemple, les trois règles ont la même origine (la feuille de l'auteur), aucune n'est importante, aucune n'est dans une couche : c'est la spécificité qui tranche. Les sections suivantes reprennent les critères un par un.

3.2 Origine et importance

Une page reçoit des déclarations de trois origines :

Une déclaration suivie de !important est importante. L'importance renverse l'ordre des origines.

Proposition 3.2Ordre des origines

De la plus forte à la plus faible :

  • déclarations importantes du navigateur ;
  • déclarations importantes de l'utilisateur ;
  • déclarations importantes de l'auteur ;
  • déclarations normales de l'auteur ;
  • déclarations normales de l'utilisateur ;
  • déclarations normales du navigateur.

L'auteur l'emporte normalement sur l'utilisateur et le navigateur ; mais un utilisateur qui a besoin d'une présentation (très grands caractères, fort contraste) peut toujours l'imposer avec !important. Les animations et transitions (chapitre 10) s'intercalent dans cette liste, ce qui n'a pas d'importance pour l'instant.

C'est pourquoi la moindre de nos règles remplace la feuille du navigateur : h1 { font-size: 40px; } l'emporte sur la règle par défaut font-size: 2em sans considération de spécificité, car elle appartient à une origine plus forte.

Proposition 3.3L'attribut style

Les déclarations de l'attribut style appartiennent à l'origine auteur. Elles l'emportent sur toutes les règles des feuilles de l'auteur, quelle que soit leur spécificité — sauf sur les déclarations importantes. C'est la raison profonde pour laquelle on les évite : la seule façon de les contredire depuis une feuille est !important.

3.3 La spécificité

Définition 3.4Spécificité

La spécificité d'un sélecteur est un triplet :

  • : le nombre de sélecteurs d'identifiant (#menu) ;
  • : le nombre de sélecteurs de classe (.prix), d'attribut ([type="email"]) et de pseudo-classes (:hover, :nth-child(2n)) ;
  • : le nombre de sélecteurs de type (p) et de pseudo-éléments (::before).

Le sélecteur universel * et les combinateurs (espace, >, +, ) ne comptent pas.

Proposition 3.5Comparer deux spécificités

On compare d'abord les ; le plus grand l'emporte. À égalité, on compare les , puis les . C'est l'ordre du dictionnaire (ordre lexicographique) : .

Ce n'est pas un nombre

On lit parfois que la spécificité « vaut » . C'est faux : onze classes, , ne battent pas un identifiant, . Il n'y a aucune retenue d'une colonne à l'autre. Écrivez toujours le triplet.

Proposition 3.6Pseudo-classes logiques
  • :is(), :not() et :has() ne comptent pas elles-mêmes ; elles prennent la spécificité de l'argument le plus spécifique de leur liste, même si c'est un autre argument qui correspond à l'élément.
  • :where() a toujours une spécificité nulle, , quels que soient ses arguments.

La suite du cours est sur Adloun

Le chapitre en entier, formules et figures comprises, avec le tuteur, les fiches, les QCM et les exercices.

Lire la suite du cours

En accès libre, sans inscription.

Exercices corrigés de ce chapitre

Lire la suite du cours →