Composant "navigation" : nesting propre et maintenable
Un exemple classique : un menu de navigation avec des liens et un état "actif".
Nous voulons un nesting lisible, mais pas trop profond pour maintenir la flexibilité.
.nav {
display: flex;
gap: 12px;
list-style: none;
padding: 0;
margin: 0;
.nav__item {
position: relative;
.nav__link {
color: rgba(255, 255, 255, 0.85);
text-decoration: none;
padding: 8px 12px;
border-radius: 6px;
transition: all 0.2s ease;
display: block;
&:hover {
color: #7aa7ff;
background: rgba(122, 167, 255, 0.1);
}
&.is-active {
color: #7aa7ff;
font-weight: 700;
background: rgba(122, 167, 255, 0.15);
&::after {
content: '';
position: absolute;
bottom: -4px;
left: 12px;
right: 12px;
height: 2px;
background: #7aa7ff;
border-radius: 1px;
}
}
}
}
// Variante verticale
&--vertical {
flex-direction: column;
gap: 4px;
.nav__item {
.nav__link {
padding: 10px 16px;
}
}
}
}
Pourquoi c'est "propre" ?
- On reste à 2-3 niveaux maximum (raisonnable pour ce type de composant).
- Les classes (
.nav__link) restent réutilisables et compréhensibles.
- L'état actif est explicite (
.is-active) et regroupe ses styles.
- La variante verticale est définie dans le même bloc avec
&--vertical.
- Les pseudo-éléments (
::after) sont imbriqués là où ils ont du sens.
Quand éviter le nesting et préférer des classes indépendantes
Si tu écris quelque chose comme ci-dessous, tu risques de lier ton CSS
à une structure HTML trop précise. Au moindre changement de structure,
tu casses des styles et tu deviens dépendant d'une hiérarchie spécifique.
/* EXEMPLE À ÉVITER : nesting trop dépendant du HTML */
.page {
.layout {
.content {
.card {
.title {
font-size: 20px;
color: #333;
.icon {
margin-right: 8px;
}
}
.description {
.highlight {
background: yellow;
}
}
}
}
}
}
Le CSS généré serait extrêmement spécifique et difficile à réutiliser :
.page .layout .content .card .title .icon
Une meilleure approche est souvent de donner des classes claires
et de les styliser directement :
/* MEILLEURE APPROCHE : classes indépendantes */
.card__title {
font-size: 20px;
color: #333;
}
.card__icon {
margin-right: 8px;
}
.card__description {
line-height: 1.6;
}
.highlight {
background: rgba(255, 255, 0, 0.3);
padding: 0 2px;
border-radius: 2px;
}
Conseil terrain
Plus ton CSS est dépendant de la structure HTML, plus ton code devient fragile.
Préfère des classes sémantiques et réutilisables. Une bonne règle :
si ton nesting génère des sélecteurs de plus de 3 parties
(ex: .page .layout .content .card), c'est probablement
trop spécifique.