Guidelines pour CSS — Bonnes pratiques

Modèle de boite

Si le projet permet de coder pour Internet Explorer 8 a minima, exploiter le modèle de boite border-box en ajoutant ceci au début du fichier CSS :

*,
*::before,
*::after {
	box-sizing: inherit;
}

html {
	box-sizing: border-box;
}

Cela permet à la propriété width de prendre en compte les padding et border d’un élément, et évite donc les dépassements inutiles, les calculs préalables ou à la volée…

Flux

Éviter de sortir les éléments du flux autant que possible.

Pas bien :

div {
	float: left;
	width: 100%;
	clear: both;
}

Bien:

div {
	float: none;
}

Pas bien :

div {
	position: absolute;
	right: 0;
}

/* ou */

div {
	float: right;
}

Bien :

div {
	margin-left: auto;
}

Si on est sur un projet “navigateurs modernes”, alors le module flexbox résoudra la majorité des problèmes qui nécessitaient auparavant l’emploi hasardeux de position: absolute;.

Positionnement

Utiliser les méthodes de positionnement dans cet ordre de préférence :

  1. display: block | inline;
  2. display: flex | inline-flex; / display: grid;
  3. display: inline-block | table-cell;
  4. float: left | right;
  5. position: relative | absolute | sticky | fixed;

Dans le meilleur des mondes, chaque type a un rôle bien précise :

Déclarations

Déclarations légères

Ne jamais utiliser d’ID dans le CSS. Les classes et les sélecteurs d’attributs suffisent à couvrir la très large majorité des cas. Et si on doit quand même cibler un ID, utiliser le sélecteur d’attribut :

[id="monId"] {
	color: red;
}

Ceci pour une question de poids des déclaration.

Des déclarations légères sont la clé d’un CSS propre, puissant, réutilisable et maintenable. Un “poids” maximum de 20 est une bonne limite, un poids de 10 (une classe ou un sélecteur d’attributs est une bonne moyenne).

De la même façon, moins une déclaration est spécifique, plus elle est pratique et facile à surcharger en cas de besoin.

Pas bien :

input[type="submit"] {}

Bien :

[type="submit"] {}

Ainsi, je n’ai pas à me soucier que mon élément soit un input, un button, ou n’import quel élément fantaisiste qui ne devrait pas être là.

Déclarations de structure

De manière générale, il faut éviter une déclaration qui serait trop dépendante d’une structure html rigide (pour la simple et bonne raison que le moindre changement dans le html peut entrainer de gros chamboulements dans le CSS).

Pas bien :

article > h1 + p {
}

Bien :

.article-intro {
}

Factorisation

Il est utile, lisible (et plus propre) de rassembler les propriétés identiques sur des éléments similaires.

Pas bien :

div::before {
	content: "";
	position: absolute;
	top: 5%;
	background: #fff;
}

div::after {
	content: "";
	position: absolute;
	top: 20%;
	background: #fff;
}

Bien :

div::before,
div::after {
	content: "";
	position: absolute;
	top: 5%;
	background: #fff;
}

div::after {
	top: 20%;
};

Surcharges

Éviter de créer des règles pour annuler des règles précédentes.

Pas bien :

li {
	display: none;
}

li:first-child {
	display: block
}

Bien :

li + li {
	display: none;
}

/* ou */

li:not(:first-child) {
	display: none;
}

Unités

Les différentes unités disponibles en CSS devraient être exploitées. Les pourcentages et les pixels ne sont pas les seules unités existantes, et sont loin d’être les meilleures.