Comme toujours en informatique, on cherche à factoriser au maximum son code CSS, c'est-à-dire à éviter les répétitions (principe DRY).
Objectif visé : principalement la facilité de maintenance
Voir le tutoriel sur la factorisation CSS de Jean-Marc Lecarpentier
De façon générale, on essaie d'éviter que le CSS dépende trop de la structure du HTML
Notamment, il faut faire attention aux sélecteurs trop génériques
Vous utilisez souvent directement les éléments suivants comme sélecteurs, parce qu'il n'y a pas d'ambiguïté dans vos pages :
header { /* ... */ } footer { /* ... */ } nav { /* ... */ } article { /* ... */ } section { /* ... */ } aside { /* ... */ }
header
, footer
, nav
, etc. dans une page HTML. Même si ce n'est pas le cas de votre page pour l'instant, il faut prévoir qu'elle puisse évoluer.
aside
en article
voire en div
)
#entete .menu ul li a
.menu a
(on sélectionne les liens du menu).
S'il y a plusieurs sortes de liens dans le menu, alors il vaut mieux leur donner des classes distinctes.Une stratégie pour éviter ces problèmes peut être de n'utiliser que des classes, c'est-à-dire de créer une classe à chaque fois qu'on a besoin de styler un élément, et de n'avoir que des sélecteurs avec une seule classe.
On évite effectivement la dépendance à la structure du HTML, mais cela devient vite très lourd à maintenir, et le CSS est moins facile à lire puisqu'il donne peu d'indications sur la structuration de la page et les éléments à styler. Exemple :
.lien-bibliographie { color: pink; text-decoration: none; }
pourquoi préciser ici text-decoration: none
? Il serait probablement plus approprié de mettre une classe au bloc englobant et d'utiliser celle-ci dans le CSS :
.bibliographie a { color: pink; text-decoration: none; }
Ici il est plus clair que l'on enlève le soulignement par défaut de l'élément a
.
Il n'est pas toujours évident de trouver un bon équilibre, et les critères peuvent être assez subjectifs ! Mais dans tous les cas il faut éviter les deux extrêmes (aucune classe / que des classes).
/**** BANNIÈRE ****/ .banniere { background-color: black; } .logo { color: white; background-color: blue; } /**** MENU ****/ .menu { border-radius: 1em; display: grid; grid-template-columns: 15em 15em 15em; } .menu a { border: 1px solid red; } /**** PRODUITS ****/ .produit { font-style: italic; } .produit h2 { font-family: YoupiSans; } .price-tag { color: red; }
<link rel="stylesheet">
dans le head
@import
…
@import url("mystyle.css");
pour importer une CSS@import
: empêche le téléchargement des CSS en parallèle, ce qui bloque le rendu<link rel="stylesheet">
dans le HTML :
les fichiers peuvent être chargés en parallèle.