Deux règles ciblent le même élément et lui donnent deux couleurs différentes. Le navigateur doit choisir. Il ne tire pas au sort : il pèse les sélecteurs, et le plus lourd l’emporte. Cette leçon apprend à faire la pesée.
Voici un paragraphe, et deux règles qui le ciblent toutes les deux.
<p class="intro">Bienvenue sur mon site.</p>
.intro {
color: blue;
}
p {
color: red;
}
Le paragraphe ne peut pas être bleu et rouge à la fois. Pourtant, il n’y a pas d’erreur : le navigateur choisit une règle, et le texte s’affiche en bleu.
On pourrait croire que la dernière règle gagne. Ce n’est pas le cas ici : la règle .intro est plus spécifique que la règle p. Elle vise un groupe plus précis d’éléments, ceux qui portent la classe intro, là où p vise tous les paragraphes.
Avant de donner la réponse, demandez à la classe de quelle couleur sera le paragraphe, et faites voter.
Il nous manque un sélecteur pour faire la pesée. L’attribut id donne un nom à un élément, comme class, mais ce nom doit être unique dans la page : un seul élément peut le porter.
<nav id="menu">…</nav>
En CSS, l’id s’écrit précédé d’un dièse.
#menu {
background: gold;
}
Une classe se partage entre plusieurs éléments, un id désigne un élément et un seul. C’est ce qui le rend si spécifique.
Pour départager deux règles qui ciblent le même élément, on pèse leurs sélecteurs. Chaque morceau du sélecteur a un poids.
| Morceau | Exemple | Poids |
|---|---|---|
| Un id | #menu |
1000 |
| Une classe | .intro |
1 |
| Une balise | p |
0,1 |
| L’étoile, qui cible tous les éléments | * |
0 |
Le poids d’un sélecteur, c’est la somme des poids de ses morceaux.
| Sélecteur | Calcul | Poids |
|---|---|---|
p |
0,1 | 0,1 |
nav a |
0,1 + 0,1 | 0,2 |
.menu a |
1 + 0,1 | 1,1 |
.carte .titre |
1 + 1 | 2 |
#menu a |
1000 + 0,1 | 1000,1 |
La règle dont le sélecteur pèse le plus l’emporte, quel que soit l’ordre dans lequel les règles sont écrites. Dans le premier exemple, .intro pèse 1 et p pèse 0,1 : le bleu l’emporte.
Le navigateur compte autrement, mais il arrive au même résultat tant qu’un sélecteur a moins de dix balises et moins de mille classes, ce qui n’arrive jamais.
Quand deux sélecteurs ont le même poids, c’est la dernière règle écrite qui l’emporte.
.important {
color: blue;
}
.intro {
color: orange;
}
Un paragraphe <p class="intro important"> s’affiche en orange. Les deux sélecteurs pèsent 1, et .intro est écrit après.
L’ordre des classes dans l’attribut class ne compte pas. Seul compte l’ordre des règles dans le CSS.
Ces poids ne sont pas qu’un calcul. Ils disent comment écrire une feuille de style qui reste facile à modifier.
p touche tous les paragraphes du site, y compris ceux qu’on avait oubliés. On la garde pour les réglages généraux, la police ou les marges par défaut.Dans ce jeu, deux règles ciblent le même élément. À vous de dire laquelle l’emporte, ou s’il y a égalité. Les duels sont tirés au hasard et ne s’arrêtent jamais.
Ouvrez le Duel de sélecteurs et enchaînez les duels. Comptez de tête avant de répondre, puis vérifiez avec les poids affichés sous chaque règle. Visez dix victoires d’affilée.