Login

Bienvenue sur le site de Jef

Les bases du CSS

Priorité des sélecteurs et héritage

Les feuilles de style ont plusieurs origines, telles que l'auteur, l'utilisateur et le navigateur.
Les champs d'action de ces feuilles de style vont se recouper et leur interaction dépende 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.

Calcul de la spécificité d'un sélecteur

Le calcul de la spécificité d'un sélecteur est calculé comme suit: ABCD

La concaténation des quatre nombres A-B-C-D donne la spécificité.

Quelques exemples

  • * {}/* a=0 b=0 c=0 d=0 -> specificity = 0,0,0,0 */
  • li {}/* a=0 b=0 c=0 d=1 -> specificity = 0,0,0,1 */
  • p {}/* a=0 b=0 c=0 d=1 -> specificity = 0,0,0,1 */
  • li:first-line {}/* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
  • ul li {}/* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
  • blockquote p {}/* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
  • ul ol+li {}/* a=0 b=0 c=0 d=3 -> specificity = 0,0,0,3 */
  • h1 + *[rel=up] {}/* a=0 b=0 c=1 d=1 -> specificity = 0,0,1,1 */
  • ul ol li.red {}/* a=0 b=0 c=1 d=3 -> specificity = 0,0,1,3 */
  • li.red.level {}/* a=0 b=0 c=2 d=1 -> specificity = 0,0,2,1 */
  • #mon-id {}/* a=0 b=1 c=0 d=0 -> specificity = 0,1,0,0 */
  • p#mon-id {}/* a=0 b=1 c=0 d=1 -> specificity = 0,1,0,1 */
  • blockquote p#mon-id {}/* a=0 b=1 c=0 d=2 -> specificity = 0,1,0,2 */
  • .ma-classe {}/* a=0 b=0 c=1 d=0 -> specificity = 0,0,1,0 */
  • .ma-classe #mon-id {}/* a=0 b=1 c=1 d=0 -> specificity = 0,1,1,0 */
  • .ma-classe p#mon-id {}/* a=0 b=1 c=1 d=1 -> specificity = 0,1,1,1 */
  • blockquote.ma-classe p#mon-id {}/* a=0 b=1 c=1 d=2 -> specificity = 0,1,1,2 */
  • p.ma-classe {}/* a=0 b=0 c=1 d=1 -> specificity = 0,0,1,1 */
  • blockquote p.ma-classe {}/* a=0 b=0 c=1 d=2 -> specificity = 0,0,1,2 */
  • style="" /* a=1 b=0 c=0 d=0 -> specificity = 1,0,0,0 */
  • propriété: valeur !important; /* a=1 b=0 c=0 d=0 -> specificity = 1,0,0,0 */

Nous rencontrons ici la valeur !important, qui peut être ajoutée à n'importe quelle propriété, dans un document CSS et qui lui donne alors la priorité sur une règle

Exemples par démonstration

Pour comprendre la hiérarchie de l'héritage, nous allons définir un id (#boite-a) et une classe (.boite-b) dans une feuille de style externe (heritage.css), que nous lions avec la balise html:

<link rel="stylesheet" type="text/css" href="/heritage.css" />

Dans le conteneur #boite-a, nous définissons la couleur rouge aux titres <h1> et la couleur verte aux paragraphes <p>

Voici le code CSS externe:
#boite-a    { width:500px; border:3px solid purple; }
.boite-b    { width:auto; border:3px solid green; }

#boite-a h1 { color:red; }
#boite-a p  { color:green; }

Jusque là pas de problème, mais nous allons redéfinir la couleur du titre et du paragraphe dans une feuille de style interne.

Voici le style CSS interne:
<style type="text/css">
#boite-a h1 { color:purple; }
#boite-a p  { color:blue; }
.boite-b h1 { color:green; }
.boite-b p  { color:orange; }
</style>

Voici le code html:

<div id="boite-a">
  <h1>Titre</h1>  
  <p>Paragraphe</p>  
<div class="boite-b">
  <h1>Titre</h1>  
  <p>Paragraphe</p>
</div>
</div>
Et voici le résultat:

Titre

Paragraphe

Titre

Paragraphe

Nous pouvons constater que le titre et le paragraphe de la classe boite-b a hérité de la couleur de #boite-a et n'a pas tenu compte de la couleur redéfinie pour .boite-b

Si maintenant nous rajoutons dans la feuille de style interne la valeur !important à la classe boite-b, nous allons forcer la couleur qui ne sera alors pas héritée du parent #boite-a car la proriété marquée par !important devient prioritaire.

Code CSS interne:
<style type="text/css">
#boite-a h1 { color:purple; }
#boite-a p  { color:blue; }
.boite-b h1 { color:green !important; }
.boite-b p  { color:orange !important; }
</style>

Le code html ne change pas, mais le résultat est le suivant:

Et voici le résultat:

Titre

Paragraphe

Titre

Paragraphe

Ainsi, nous constatons que le titre est bien vert au lieu de pourpre et le paragraphe orange au lieu de bleu.

Mais, si l'on place le style directement dans la balise, au lieu d'utiliser !important, alors la priorité est maximum et la couleur de la feuille de style externe ET interne ne sera pas prise en compte.

Code CSS externe:
#boite-a    { width:500px; border:3px solid purple; }
.boite-b    { width:auto; border:3px solid green; }
#boite-a h1 { color:red;}
#boite-a p  { color:green;}
Code CSS interne:
<style type="text/css">
#boite-a h1 { color:purple; }
#boite-a p  { color:blue; }
.boite-b h1 { color:green; }
.boite-b p  { color:orange; }
</style>
Code html:
<div id="boite-a">
  <h1>Titre</h1>  
  <p>Paragraphe</p>  
<div class="boite-b">
  <h1 style="color:indigo; ">Titre</h1>  
  <p style="color:deeppink; ">Paragraphe</p>
</div>
</div>
Et le résultat est le suivant:

Titre

Paragraphe

Titre

Paragraphe

Bien que cette méthode ne soit pas recommandée, nous pouvons contater que le titre est désormais indigo et le paragraphe deeppink