# Cascading Style Sheet/Cascade, héritage et spécificité
## Introduction

On va s'attaquer dans ce chapitre au "Cascading" des CSS, un concept clé à connaître. Actuellement avec nos maigres connaissances, nous ne pouvons comprendre pourquoi les liens sont par défaut en bleu et soulignés, nous ne pouvons pas comprendre non plus pourquoi ce code ci-dessous :
donnera au final une couleur bleu au texte de notre paragraphe.

## Arbre de document et propriétés

Le parseur CSS construit un arbre de document avec tous les éléments et leur position (parent, enfant, descendant...). Il existe au moins une centaine de propriété CSS, il faut savoir que le parseur va assigner à chaque élément toutes les propriétés avec une certaine valeur. Certaines propriétés ne peuvent s'appliquer à un élément, par exemple la propriété "list-type" utile pour décorer nos listes ne peut être appliquée à l'élément body par exemple, mais le parseur va quand même l'assigner à l'élément body (on verra tout à l’heure pourquoi).
Imaginons un document comme celui-là :
Le parseur va faire un arbre :
* html : propriété1:valeur; propriété2:valeur; ...
* body : propriété1:valeur; propriété2:valeur; ...
* p : propriété1:valeur; propriété2:valeur; ...
Maintenant quelle valeur va t-il associer à la propriété ? Premièrement il va regarder si cette valeur n’est pas directement spécifiée dans les feuilles de styles.

## Feuilles de style à plusieurs niveaux

Il n'y a pas que les auteurs de documents qui utilisent des feuilles mais aussi ceux qui conçoivent le programme interprétant le CSS tel un navigateur graphique ou encore éventuellement les utilisateurs (les "user styles").

### Feuille navigateur

Si vous testez le code ci-dessus, vous apercevez les deux titres l'un en dessous de l'autre. Ceci est causé non pas par le retour à la ligne dans notre code mais par la feuille de style navigateur :
Les feuilles de style des navigateurs, bien que le W3C en recommande une, peuvent varier d'un navigateur à l'autre mais ce n’est pas le cas ici. Il est possible de lire voire modifier une feuille soit dans le programme d'installation du programme (c'est le cas pour Firefox), soit dans le code source (c'est le cas pour les programmes basés sur WebKit tel Safari ou Chrome).

### Feuille auteur

Nous voulons que ces titres soient côte à côte, donc nous faisons simplement

### Feuille utilisateur

Nous voulons remettre un titre par ligne, il nous faut ajouter le mot clé "!important" pour que notre déclaration prenne le dessus :

### Récapitulatif

Il y a donc un certain ordre de priorité croissante :
* CSS navigateur (!important ou non) ;
* CSS utilisateur ;
* CSS auteur ;
* CSS auteur !important ;
* CSS utilisateur !important.
De même, le poids de chaque sélecteur est différent, du moins au plus prioritaire :
* Balise ;
* Classe ;
* Identifiant ;
* Attribut style.
Et si tous les acteurs ne spécifient pas dans les feuilles quel doit être la valeur de display pour h1 ? Les h1 seront-il "inline" ou "block" ?

## Héritage

Le programme va déjà chercher si la propriété s'hérite, ce n’est pas le cas de display. On va prendre donc pour cette partie un autre exemple : la propriété list-style-type qui permet de définir le type de puce des items de liste (éléments li en (X)HTML).
Le fait qu’il y ait un 1 devant notre item est du à la feuille de style navigateur qui spécifie :
Or on a dit que cette propriété ne pouvait s'appliquer qu'aux éléments li, il y a donc un certain phénomène appelé héritage qui se produit. Comme le parseur CSS ne trouve pas cette propriété spécifiée sur la balise li, il va chercher si celle-ci est spécifiée dans les éléments parents de cette balise, c'est-à-dire ol, body et html dans notre cas simpliste. Il la trouve spécifiée sur la liste ol, on dit donc que l'item de liste li hérite de la valeur décimale.
Il nous reste encore une interrogation : si les parents ne donnent pas non plus une valeur spécifiée, comment va être notre puce ?

## Valeur initiale et récapitulatif

Il va associer en faite la valeur initiale de la propriété à l'élément. Dans notre cas de figure, il va donc associer la valeur "disc" ou rond plein. Toutes les propriétés ont des valeurs initiales qui sont définies dans la spécification.
Pour récapituler :
* Si le parseur trouve une valeur spécifiée dans les feuilles de style, il l'assigne à l'élément
* Sinon s'il trouve une valeur spécifiée associée aux ancêtres de l'élément, il va assigner cette valeur à l'élément.
* Sinon il assigne la valeur initiale à l'élément.