Cascade CSS et priorité des sélecteurs

  • Profil : Débutant, Expert
  • Technologie : CSS
  • Thème : Mise en page
  • Auteur : Laurent Denis
  • Mise à jour : 26/06/2008

En bref

CSS signifie « feuilles de styles en cascade »... Mais au fait, la cascade, qu’est-ce que c’est, à quoi ça sert, comment cela fonctionne ? Plongez avec nous dans la cascade sans risque de noyade !


Les styles CSS appliqués finalement à un page Web ont de multiples origines simultanées : styles utilisateurs et styles par défaut de l'agent utilisateur s'ajoutent aux différentes feuilles de styles éventuellement prévues par l'auteur, pour structurer ses CSS en modules, offrir des styles alternatifs ou styler ses documents pour différents medias. La question-clé est donc le mode de combinaison de ce large éventail de styles possibles. C'est ici qu'interviennent le fonctionnement en cascade propre aux CSS et le calcul de la priorité respective des différents sélecteurs susceptibles de viser le même élément XHTML.

Les sources de style possibles

Trois séries de styles CSS d'origines différentes sont susceptibles d'être concurrentes ou combinées pour un même élément (X)HTML :

Les feuilles de style ont trois origines différentes : l'auteur, l'utilisateur et l'agent utilisateur (alias le navigateur).

Les champs d'action de ces trois feuilles de style vont se recouper, leur interaction dépendant des règles de la cascade.

La cascade de CSS définit un ordre de priorité, ou poids, pour chaque règle de style. Quand plusieurs règles sont mises en oeuvre, celle avec le plus grand poids a la préséance.

Prenons l'exemple des liens a d'un menu de navigation du type :

<ul id="menu">

<li><a href="...">lien 1</a></li>
<li><a href="...">lien 2</a></li>
<li><a href="...">lien 3</a></li>

</ul>
Voyons comment vont être déterminés la couleur de ces liens, celle de leur arrière-plan, leur graisse et leur soulignement éventuel pour un utilisateur donné ayant réglé son navigateur selon ses préférences personnelles, à partir des styles fixés par l'auteur de la page en question.

Commençons par établir la liste de tous les styles susceptibles de s'appliquer à ces liens :

Il apparaît immédiatement que plusieurs règles de styles, issues de l'agent utilisateur, de l'utilisateur lui-même ou de l'auteur de la page, entrent en concurrence pour déterminer :

Tout d'abord, une sélection en 3 étapes

Pour chaque élément de l'arbre du document, et donc en particulier pour les liens a de notre menu de navigation, les moteurs de rendu CSS des navigateurs procèdent à une sélection par étapes des styles à retenir :

Etape 1 : le tri par media

Les styles potentiels de nos liens seront tout d'abord sélectionnés en fonction du media de restitution de la page. Ce media peut être explicite dans le mode de liaison de la feuille de style (la feuille de style auteur screen ci-dessus), ou implicite (absence de type de media ou media all comme ci-dessus).

Pour l'affichage à l'écran (screen), tous les styles ci-dessus du navigateur, de l'auteur et de l'utilisateur seront pris en compte. En revanche, une feuille de style auteur print, handheld ou projection ne serait pas prise en compte. De même, une propriété voice-family, propre au media oral speech serait ici écartée.

A ce stade, les propriétés retenues pour nos liens sont donc, avec leurs différentes valeurs possibles :

Etape 2 : le tri par origine

Ces différents styles vont à présent être sélectionnés en fonction de leur origine : les styles auteur, utilisateur et agent utilisateur ont en effet des poids différents, qui dépendent également de l'utilisation de la propriété !important. Ils se placent dans l'ordre suivant, du plus faible au plus fort :

  1. Styles par défaut de l'agent utilisateur, qui seront écrasés par tous les styles suivants ;
  2. Styles normaux de l'utilisateur (c'est à dire qui n'ont pas été marqués !important) ;
  3. Styles normaux de l'auteur (idem) ;
  4. styles de l'auteur marqués !important ;
  5. styles de l'utilisateur marqués !important, qui écraseront tous les styles précédents.

Nous rencontrons ici la valeur !important, qui peut être ajoutée dans un document CSS à n'importe quelle propriété, sur le modèle PROPRIETE: VALEUR1 !important, lui donnant alors la priorité sur une règle PROPRIETE: VALEUR2. Notons que CSS2.0 modifie CSS1.0, en donnant une plus forte priorité aux règles !important de l'utilisateur qu'aux règles !important de l'auteur. L'utilisateur peut ainsi toujours imposer ses préférences stylistiques en dernier ressort.

Passons en revue les différents styles de nos liens, par propriété :

Etape 3 : le tri par priorité calculée des sélecteurs

Les styles restant en concurrence ont un degré de priorité variable, dépendant du sélecteur CSS utilisé et de sa syntaxe. Ce degré de priorité est calculé sous forme d'un nombre à 4 chiffres ABCD :

Voici quelques exemples de sélecteurs et de règles CSS classés par ordre croissant de spécificité :

  1. * {...} : 0000 (aucun idenfifiant, aucune classe, aucun élément) ;
  2. p {...} : 0001 (aucun idenfifiant, aucune classe, un élément) ;
  3. blockquote p {...} : 0002 (aucun idenfifiant, aucune classe, deux éléments) ;
  4. .class {...} : 0010 (aucun idenfifiant, une classe, aucun élément) ;
  5. p.class {...} : 0011 (aucun idenfifiant, une classe, un élément) ;
  6. blockquote p.class {...} : 0012 (aucun idenfifiant, une classe, deux éléments) ;
  7. #id {...} : 0100 (un idenfifiant, aucune classe, aucun élément) ;
  8. p#id {...} : 0101 (un idenfifiant, aucune classe, un élément) ;
  9. blockquote p#id {...} : 0102 (un idenfifiant, aucune classe, deux éléments) ;
  10. .class #id {...} : 0110 (un idenfifiant, une classe, aucun élément) ;
  11. .class p#id {...} : 0111 (un idenfifiant, une classe, un élément) ;
  12. blockquote.class p#id {...} : 0112 (un idenfifiant, une classe, deux éléments) ;
  13. <p style="..."> : 1000 (attribut HTML style qui ne sera supplanté que par un style utilisateur normal) ;
  14. <p style="... !important"> : 1000 (attribut HTML style marqué !important qui ne sera supplanté que par un style utilisateur lui-même marqué !important).

Si nous revenons à notre exemple des styles de liens, nous pouvons calculer le degré de priorité des deux sélecteurs qui restaient en concurrence :

Le deuxième sélecteur l'emporte, et les liens du menu seront donc en graisse normale.

Et en dernier ressort

Si, parvenu à ce stade, deux styles de même degré de priorité restent en concurrence, le dernier apparu dans l'ordre linéaire CSS-HTML l'emporte. Autrement dit, toutes choses étant égales par ailleurs :

Conclusion


Une question, une remarque ? Écrivez à l'auteur.

Répondre à cet article

Page valide XHTML 1 Strict, CSS2 et accessible AA.
Ce site s'affiche mieux dans un navigateur conforme aux standards, voici pourquoi.
Site hébergé par yterium (depuis 2010) et par l'APINC (2002-2010) . Propulsé par SPIP.