Introduction aux feuilles de style

Introduction : pourquoi, comment... ?

Qu'est-ce qu'une feuille de style ?

Les feuilles de style en cascade (en anglais cascading style sheets, ou CSS) sont des documents permettant un affichage "intelligent" du contenu d'une page HTML. Elles permettent de définir clairement l'apparence d'une (ou plusieurs) page(s) en modifiant les caractèristiques visuelles des différentes balises. Ceci fait, elles permettent de modifier assez radicalement cette apparence en ne changeant que quelques lignes de la feuille de style.

Intégration d'une feuille de style

Avant de se lancer dans l'écriture d'une feuille de style, voyons comment faire savoir au navigateur qu'elle existe et qu'il lui faut l'employer. Il existe quatre méthodes d'intégrations :

  1. En utilisant la balise LINK pour faire référence à une ou plusieurs feuille(s) de style extérieure(s) au document :
    <HTML> <HEAD> <LINK rel="stylesheet" type="text/css" href="style.css"> <LINK rel="stylesheet" type="text/css" href="http://un.site/style2.css"> </HEAD> <BODY>...</BODY> </HTML>
    Cette méthode est la meilleure, puisqu'elle permet au navigateur d'éviter de recharger la style à chaque fois. Cependant, pour cette même raison, elle est déconseillée pour faire des tests : il faut recharger la page plusieurs fois de suite pour que la feuille de style soit de nouveau chargée et que d'éventuelles modifications soient prises en compte.
  2. En utilisant la balise STYLE pour faire référence à une ou plusieurs feuille(s) de style extérieure(s) au document :
    <HTML> <HEAD> <STYLE type="text/css"> @import url(http://un.site/style.css) @import url(http://un.site/style2.css) </STYLE> </HEAD> <BODY>...</BODY> </HTML>
  3. En utilisant la balise STYLE pour déclarer une feuille de style valable uniquement pour la page actuelle :
    <HTML> <HEAD> <STYLE> Déclarations de style </STYLE> </HEAD> <BODY>...</BODY> </HTML>
  4. En utilisant l'attribut "style" pour déclarer uniquement le style de la balise associée :
    <HTML> <BODY> ... <balise style="Description d'un style">...</balise> ... </BODY> </HTML>
    Cette dernière méthode est hautement déconseillée, puisqu'elle est trop similaire à l'approche HTML, reniant ainsi les principaux avantages des feuilles de style.

Syntaxe d'une feuille de style

Modification du style d'une ou plusieurs balises

On peut, par exemple, redéfinir la balise HTML "EM" pour que son contenu soit en rouge en écrivant :

Feuille de style :
EM {color: red}

Source HTML :
Ainsi, le <EM>contenu de la balise EM</EM> est rouge.

Résultat :
Ainsi, le contenu de la balise EM est rouge.

Comme on peut le voir sur cet exemple, il ne s'agit pas vraiment d'une redéfinition : on ajoute le style (ici, le fait que le texte soit en rouge) à l'effet normal de la balise, qui est de mettre le texte en italique. (À noter que l'on pourrait passer outre cette mise en italique et forçant le texte à apparaître normalement.)

On peut ainsi changer le style de plusieurs balises à la fois :

Feuille de style :
B, EM {color: red}

Source HTML :
Ainsi, le <EM>contenu de la balise EM</EM>, de même que <B>celui de la balise B</B>, est rouge.

Résultat :
Ainsi, le contenu de la balise EM, de même que celui de la balise B, est rouge.

On peut bien sûr faire plusieurs changements de style dans une déclaration :

Feuille de style :
B {text-decoration: underline; color: red}

Source HTML :
Ainsi, le <B>contenu de la balise B</B> est rouge souligné.

Résultat :
Ainsi, le contenu de la balise B est rouge souligné.

Déclarer et utiliser une classe

Les classes permettent de déclarer un style qu'on ne désire pas appliquer à toutes les occurences d'une balise, permettant ainsi une plus grande liberté dans le contrôle des différents éléments d'un document. On peut déclarer et utiliser une classe de la manière suivante :

Feuille de style :
.gras {font-weight: bold}

Source HTML :
Ainsi, le <SPAN class="gras">contenu</SPAN> des <EM class="gras">balises</EM> auxquelles on donne cette classe est en gras.

Résultat :
Ainsi, le contenu des balises auxquelles on donne cette classe est en gras.

Il est également possible de limiter la déclaration de la classe à une seule balise, en écrivant par exemple :

Feuille de style :
SPAN.gras {font-weight: bold}

Source HTML :
Ainsi, seul le <SPAN class="gras">contenu de la balise SPAN</SPAN> sera en gras, mais pas (a priori) <EM class="gras">celui des autres</EM>.

Résultat :
Ainsi, seul le contenu de la balise SPAN sera en gras, mais pas (a priori) celui des autres.

On peut remarquer que ce n'est pas à proprement parler une erreur d'employer l'attribut "class" avec la valeur "gras" sur les autres balises ; les classes non définies sont simplement ignorées. De même, les éventuelles erreurs dans la feuille de style ne sont pas catastrophiques : les règles incorrectes sont ignorées.

Pseudo-classes

Il existe plusieurs pseudo-classes de liens : :link, :visited, :hover, et :active, qui correspondent respectivement aux liens ayant une balise "href" quand ils ne sont pas visités, quand ils le sont, quand la souris les survole et quand on clique dessus, ce qui permet de changer le style des liens selon la situation.

Feuille de style :
A:link {color: red}
A:visited {color: blue}
A:hover {color: yellow}
A:active {color: green}

Source HTML :
Voici un <A href="./">lien visité</A> et un <A href="rien.html">lien non visité</A>.

Résultat :
Voici un lien visité et un lien non visité.

Remarques :

La pseudo-classe :hover n'existe en fait pas en CSS1, mais on peut s'attendre à ce que les navigateurs la comprenne nénmoins, bien qu'on puisse avoir quelques surprises au niveau des priorités des règles.

Attention à l'ordre dans lequel vous mettez ces définitions ; le plus souvent, la souris survole un lien pour cliquer dessus, et les règles de priorités ont tendance à imposer de mettre la déclaration concernant :active après celle concernant :hover.

Multi-classage

On peut aussi multi-classer les balises, et définir des styles particuliers pour les multi-classages en question.

Feuille de style :
.rouge {color: red; text-decoration: underline}
.bleu {color: blue; font-weight: bold}
.rouge.bleu {color: purple}

Source HTML :
Voici du <SPAN class="rouge">rouge</SPAN>, du <SPAN class="bleu">bleu</SPAN>, et du <SPAN class="rouge bleu">violet</SPAN> !

Résultat :
Voici du rouge, du bleu, et du violet !

On peut également multi-classer avec des pseudo-classes.

Les sélecteurs, ou comment définir un style selon le contexte

Nous avons déjà vu comment modifier une balise ou créer une classe. Les feuilles de style permettent cependant des modifications contextuelles beaucoup plus puissantes : il est possible de ne modifier les styles ou de créer une classe uniquement valable que dans le domaine compris entre certaines balises ou à l'intérieur d'éléments d'une classe particulière.

La description de style associée à un sélecteur ne s'applique qu'à son élément le plus à droite, s'il est bien dans la situation décrite par le sélecteur. Ainsi :

  1. TABLE TABLE {...} désigne les tableaux qui sont eux-mêmes dans des tableaux
  2. .exemple TABLE {...} désigne les tableaux qui sont dans un élément de classe "exemple"
  3. TABLE .exemple {...} désigne les éléments de classe "exemple" qui sont dans des tableaux
  4. DIV.exemple .gras TABLE {...} désigne bien ce que vous imaginez

Avant de se lancer dans la liste des propriétés...

Cascade et priorité

Si l'on parle de feuilles de style en cascade, ce n'est pas pour rien. Ce terme de cascade fait référence à la possibilité d'intégrer et d'appliquer plusieurs feuilles de style à un document. Se pose alors le problème de savoir laquelle est appliquée en cas de déclarations désignant les mêmes éléments.

En règle générale, toutes les déclarations désignant un même élément s'appliquent. Ainsi, un tableau de classe "exemple" aura à la fois le style défini pour les tableaux et pour les éléments de classe "exemple". En ce qui concerne les styles en désaccord entre les deux, déterminer lequel s'applique est une chose relativement facile. En règle générale, c'est le style dont la déclaration est la plus spécifique qui prend le dessus.

Pour chaque élément, il suffit de regarder les nombre d'IDs (un truc dont je ne parle pas ici), de classes et de balises qui apparaissent dans chacune des règles qui s'y applique. La règle qui s'applique alors est la dernière des règles faisant intervenir un maximum de balises parmi celles qui ont le plus de classes parmi celles qui ont le plus d'IDs... ce qui est moins clair que je l'espèrais. Relisez la phrase en oubliant la partie sur les IDs, et vous devriez déjà y voir plus clair.

Par "dernière" règle, on entend celle qui, parmi les candidates maximisant ce qu'il faut, à été écrite/importée en dernier dans l'ordre de la cascade. Les règles écrites en ligne au moyen de l'attribut "style" sont toujours appliquées en priorité sur les autres. De même, dans les cas où certains attributs HTML sont déclarés et en contradiction avec la feuille de style, ce sont eux qui sont prioritaires.

Héritage et valeurs initiales

Les propriétés ont chacunes deux caractèristiques importantes sur lesquelles je ne m'étends pas : il s'agit de leur valeur initiale, qui le plus souvent est "évidente", et du fait qu'elles héritent ou non leur valeur de l'élément parent quand elles ne sont pas définies, ce qui est assez souvent le cas pour les propriétés d'apparence du texte, par exemple, mais pas toujours. Les raisons pour lesquelles je ne les ai pas détailées sont simples : la première, c'est que c'est très pénible à documenter, et la seconde, c'est que le caractère hérité ou non est très facile à déterminer. (Par contre, les valeurs initales peuvent parfois être difficiles à récupérer si l'on veut les utiliser pour y revenir.)

Longueurs, largeurs, hauteurs...

Les différentes longueurs, largeurs et hauteur qui peuvent être mises comme valeurs de propriétés peuvent être exprimées notemment en pixels (par exemple, 14px) et en pourcentage de la longueur/largeur/hauteur du bloc parent (par exemple, 80%). Elles peuvent également être exprimées dans d'autres unités. (Je crois que les pouces et les centimètres sont admis.) Ces dimensions peuvent parfois être négatives, dans les cas de positionnement relatif par exemple.

À propos des couleurs

Les couleurs peuvent être désignés de plusieurs façons :

  1. Par leur code hexadécimal, sous la forme d'un dièse suivi de 3 ou 6 chiffres hexadécimaux correspondant à une valeur RGB (#rgb ou #rrggbb). #xyz correspond à #xxyyzz.
  2. En employant la notation rgb([nombre entre 0 et 255],[nombre entre 0 et 255],[nombre entre 0 et 255])
  3. En employant la notation rgb([pourcentage entre 0% et 100%],[pourcentage entre 0% et 100%],[pourcentage entre 0% et 100%])
  4. Au moyen de l'un des mots-clés :
    Mot-cléCode hexadécimalCouleur
    Black#000000Noir
    Navy#000080Bleu foncé
    Blue#0000FFBleu
    Green#008000Vert foncé
    Teal#008080Bleu-vert
    Lime#00FF00Vert clair
    Aqua#00FFFFBleu clair
    Maroon#800000Marron
    Purple#800080Violet
    Olive#808000Vert olive
    Gray#808080Gris
    Silver#C0C0C0Argent
    Red#FF0000Rouge
    Fuchsia#FF00FFRouge fuchsia
    Yellow#FFFF00Jaune
    White#FFFFFFBlanc

On peut aussi s'attendre à ce que d'autres noms de couleurs (en anglais), tels que orange et gold, marchent, mais ils ne sont pas par contre valides vis-à-vis des spécifications.

Insertion de commentaires

Des commentaires peuvent être insérés à peu près partout dans une feuille de style ; ils ont valeur d'espace. Il suffit de mettre le commentaire entre /* et */, de la même manière qu'en C.

Propriétés de police et de texte

Les propriétés de police et de texte sont celles qui permettent de modifier l'apparence du texte d'un document, et sont donc primordiales.

PropriétéValeursDétails
font-familynom d'une police ou d'une "famille" de policesIl peut être nécessaire de disposer la police en question dans le répertoire contenant le document s'il ne s'agit pas d'une police "standard".
font-stylenormal, italic, obliqueStyles respectivement usuel (dit romain), italique ou oblique.
font-variantnormal, small-capsLa variante "small-caps" désigne un style où les minuscules sont des versions réduites des majuscules correspondantes.
font-weightnormal, bold ...Épaisseur de trait : trait normal ou gras.
Il existe un certain nombre de mots-clés désignant des valeurs absolues ou relatives.
font-sizehauteur ...Il existe un certain nombre de mots-clés désignant des valeurs absolues ou relatives.
font...Raccourci pour les propriétés de police.
text-decorationnone, ou des combinaisons de underline, overline, line-through et blinkTexte respectivement normal, souligné, avec une ligne au dessus, qui passe à travers, ou qui clignote.
text-transformcapitalize, uppercase, lowercase, noneForce l'apparence du texte avec la première lettre en majuscule seulement, tout en majuscule, tout en minuscule, ou tel quel.
text-alignleft, center, rightAligne le texte à gauche, au centre ou à droite.
text-identlongueurCrée un alinéa de la longueur choisie.

Propriétés de couleurs de texte et d'arrière-plan

Les couleurs des différents éléments d'une page, et en particulier de son texte et de son arrière-plan, sont ce qui ressortira en premier d'un document, et sont donc particulièrement importantes.

PropriétéValeursDétails
colorcouleurCouleur du texte.
background-colorcouleur, transparentCouleur de l'arrière-plan.
Par défaut, sa valeur est transparent, ce qui laisse apparaître l'arrière-plan de l'élément parent.

Propriétés des blocs

Qu'est-ce qu'un bloc ?

Les blocs sont des éléments particuliers qui, à l'inverse des éléments "normaux" ou "linéaires", sont implicitement précédé et suivi d'un retour à la ligne (sauf sous certaines conditions faisant intervenir un élément parent qui soit lui-même un bloc), ce qui les met à part. Les balises TABLE (ainsi que TR, TH et TD) et DIV sont les principales balises HTML qui créent des blocs, mais ce ne sont pas les seules : la balise FORM en crée aussi, ce qui m'a déjà posé problème.

Heureusement, ce formatage particulier n'est pas une fatalité : il existe une propriété permettant de changer le statut de bloc :

PropriétéValeursDétails
displayblock, inline, noneDisposition en bloc, disposition "linéaire", élément non retranscrit à l'écran.

Il vaut mieux employer cette propriété avec prudence, la plupart des balises étant assez heureuses telles qu'elles sont. Ainsi, il vaut mieux en général, quand on veut employer SPAN ou DIV, employer directement celui qui correspond à l'usage voulu. (La seule différence entre les balises SPAN et DIV est que SPAN est une balise linéaire, alors que DIV crée un bloc ; c'est pour cela qu'on utilise en général SPAN pour quelques mots dans un paragraphe, et DIV pour des paragraphes entiers.)

Les différentes régions d'un bloc

Un bloc est séparé en 4 régions : de l'intérieur vers l'extérieur, il y a son contenu, son "padding", son bord et sa marge. Son contenu est ce que vous mettez dedans. Son padding est l'espace supplémentaire entre le contenu et le bord. Sa marge est un espace supplémentaire autour du bord, qui n'est pas forcément vide : sur cette page, la barre de navigation à gauche "flotte" dans la marge.

Ici, la partie bleu entre ce texte et le bord correspond à un padding de 20 pixels, le bord jaune fait trois pixels de large, et la marge fait également 20 pixels de large. Comme vous pouvez le voir, la marge ne fait pas vraiment partie du bloc : elle laisse apparaître le fond du bloc parent.

Il existe des propriétés permettant de modifier ces différentes régions. Dans ce tableau, * est à remplacer par top (haut), left (gauche), right (droite), ou bottom (bas) selon le côté qui vous intéresse.

PropriétéValeursDétails
marginlargeurSpécifie l'épaisseur de la marge.
margin-*largeurSpécifie l'épaisseur de la marge du côté choisi uniquement.
paddinglargeurSpécifie l'épaisseur du "padding".
padding-*largeurSpécifie l'épaisseur du "padding" du côté choisi uniquement.
border-widthlargeurSpécifie l'épaisseur du bord.
border-*-widthlargeurSpécifie l'épaisseur du bord du côté choisi uniquement.
border-colorcouleurSpécifie la couleur du bord.
border-stylesolid ...Spécifie le style du bord.
border-*...Raccourci pour les propriétés du bord concerné.
border...Raccourci pour les propriétés du bord.

Dimensions et positionnement

Il existe des propriétés permettant de modifier directement les dimensions d'un bloc :

PropriétéValeursDétails
widthlargeur, autoDéfinit la largeur du bloc, ou laisse la navigateur la déterminer.
heigthlargeur, autoDéfinit la hauteur du bloc, ou laisse la navigateur la déterminer.

Il existe une propriété très intéressante pour positionner "automatiquement" un bloc. Celle-ci "force" le contenu du bloc parent (dans lequel se trouve donc l'élément qui l'emploie), en général du texte, à se déformer pour lui laisser de la place, comme le montre l'exemple.

PropriétéValeursDétails
floatleft, right, noneFait flotter le bloc concerné à gauche, ou à droite, ou ne fait rien.
Feuille de style :
.gauche {float: left; color: white; background-color: black}

Source HTML :
Voici du texte qui ne sert à rien d'autre que combler l'espace du bloc <DIV class="gauche">Coucou !</DIV> dans lequel il est contenu, pour illustrer l'effet de la propriété float.

Résultat :
Voici du texte qui ne sert à rien d'autre que combler l'espace du bloc
Coucou !
dans lequel il est contenu, pour illustrer l'effet de la propriété float.

Il existe également des propriétés permettant de définir directement la position d'un bloc. Celles-ci ne sont pas CSS1, mais semblent assez implémentées. Soyez prudents en utilisant ces propriétés, elles ont tendance à donner des résultats différents de ce que l'on peut imaginer avant de les avoir testées.

PropriétéValeursDétails
positionabsolute, relativeDéfinit si les propriétés suivantes sont considérés comme absolues (c'est-à-dire exprimées par rapport au bord de la fenêtre), ou relatives (par rapport à la position normale du bloc).
toplongueurExprime la distance entre le bord haut de référence et le bord haut du bloc.
leftlongueurExprime la distance entre le bord gauche de référence et le bord gauche du bloc.
rightlongueurExprime la distance entre le bord droit de référence et le bord droit du bloc.
bottomlongueurExprime la distance entre le bord bas de référence et le bord bas du bloc.

Attention, les propriétés top et bottom sont mutuellement exclusives, de même que les propriétés left et right.

Ce que je ne vous dis pas...

Ce document est loin d'être complet vis-à-vis des CSS1, et ce n'est d'ailleurs pas son but. Un certain nombre de choses ont été omises, soit parce que je les trouve inutiles ou trop complexes, soit parce que j'ignore simplement leur existence ou leur usage, soit parce que je n'y ai simplement pas pensé, soit parce que, euh..., c'est quand même pas facile d'écrire un document de ce genre et que la fainéantise a eu raison de moi sur certains points.

Voici une liste non-exhaustive de ce dont je ne parle pas ici :

  1. Les IDs
  2. Les pseudo-éléments
  3. Un certain nombre de propriétés
  4. Un certain nombre de valeurs disponibles pour certaines propriétés
  5. Les valeurs des propriétés-raccourcis
  6. Les valeurs initiales et le caractère hérité ou non des différentes propriétés

Tout cela peut bien sûr se trouver dans la spécification officielle des CSS1 (en anglais).