.this-one-class {
color: #ccc;
}
Facile à lire et à maintenir
.grandfather.is-deaf .grandfather .son .grandchild {
color: #ccc;
}
Difficile à lire et à maintenir
.grandfather .grandchild {
color: #ccc;
}
Plus léger, plus facile à déboguer, plus facile à maintenir
#section {
color: #ccc;
}
Spécificité élevé, difficile à surcharger
3
Étage
15
15e chambre
315
N° chambre
B.
Block
E.
Element
M.
Modifier
Exemple: .navigation
, .footer
, .carousel
Les blocs peuvent être imbriqués dans n'importe quel autre bloc !
Exemple: .nav__list
, .nav__item
, .nav__link
En BEM, toutes les classes CSS sans exception commencent nécessairement par le nom du bloc.
.menu
..menu__item
.menu__item--selected
Lorsque vous nommez un bloc, concentrez-vous sur la description de son objectif (c'est-à-dire ce que c'est) plutôt que son apparence (c'est-à-dire à quoi il ressemble).
.btn
.nav
Dit ce que c'est
.big
.bright-pink
Dit à quoi ça ressemble
<a class="btn">
<span class="btn__icon">…</span>
<span class="btn__text">…</span>
</a>
<article class="card">
<img src="..."/>
<h3>...</h3>
<p>...</p>
<a>...</a>
</article>
.card {...}
.card img {...}
.card h2 {...}
.card p {...}
.card a {...}
Utilser les sélecteurs de type n'est pas recommandé en BEM.
<article class="card">
<img class="card__img" src="..."/>
<h3 class="card__title">...</h3>
<p class="card__excerpt">...</p>
<a class="card__link">...</a>
</article>
.card {...}
.card__img {...}
.card__title {...}
.card__excerpt {...}
.card__link {...}
Chaque élément a une classe qui lui est propre. On n'utilise plus les sélecteurs de type.
<article class="card">
<div class="card__img">…</div>
<h3 class="card__title">
<a class="card__title-link" href="">…</a>
</h3>
<div class="card__caption">
<p class="card__date">…</p>
<p class="card__excerpt">…</p>
<a class="card__link" href="">…</a>
</div>
</article>
.card {...}
.card__img {...}
.card__title {...}
.card__title-link {...}
.card__caption {...}
.card__date {...}
.card__excerpt {...}
.card__link {...}
.block .block__element {
...
}
À ne pas faire
.block {
...
}
.block__element {
...
}
À faire
<div class="human">
<div class="human__arm human__arm--left">
<div class="human__arm__hand">
<div class="human__arm__hand__finger"></div>
</div>
</div>
</div>
Plusieurs niveaux d'éléments par bloc
<div class="human">
<div class="human__arm human__arm--left">
<div class="human__hand">
<div class="human__finger"></div>
</div>
</div>
</div>
Un seul niveau d'élément par bloc
<ul class="menu">
<li class="menu__item">…</li>
<li class="menu__item">…</li>
<li class="menu__item--selected">…</li>
</ul>
Tous les éléments ne sont pas identifiés de la même manière
<ul class="menu">
<li class="menu__item">…</li>
<li class="menu__item">…</li>
<li class="menu__item menu__item--selected">…</li>
</ul>
Tous les éléments sont identifiés et certains ont un modificateur en plus
<header class="header">
<div class="header__start">
<img class="header__logo" src="..."/>
</div>
<div class="header__end">
<ul class="header__menu">
...
</ul>
<button class="header__search">...</button>
</div>
</header>
<ul class="header__menu menu">
<li class="menu__item">
<a class="menu__link" href="...">...</a>
</li>
<li class="menu__item">
<a class="menu__link" href="...">...</a>
</li>
...
<li class="menu__item menu__item--dark">
<a class="menu__link" href="...">...</a>
</li>
</ul>