БЭМ-методология
Методология по наименованию css-классов относительно принадлежности по сложенности и уникальности.
Селекторы по БЭМ:
- Блок — независимый элемент страницы с собственным смыслом.
- Элемент — составная часть блока, имеющая смысл только внутри блока.
- Модификатор — модификация внешнего вида или поведения блока (или элемента).
Синтаксис БЭМ (именование css-классов)
- user - БЛОК.
- user__name - ЭЛЕМЕНТ БЛОКА.
- user--background - МОДИФИКАТОР БЛОКА.
- user__role--underline - МОДИФИКАТОР ЭЛЕМЕНТА БЛОКА.
<!-- БЛОК 1 -->
<section class="user">
<h2 class="user__name">Иван Иванов</h2>
<b class="user__role">Разработчик</b>
</section>
<!-- БЛОК 2 -->
<section class="user user--background">
<h2 class="user__name">Иван Иванов</h2>
<b class="user__role user__role--underline">Разработчик</b>
</section>
<!-- БЛОК 3 -->
<div class="block">
<div class="block__element"></div>
<div class="block__element--big"></div>
<div class="block__element--red"></div>
</div>
Основные принципы БЭМ:
- Минимум тегов без классов
- Каскадность свести к минимуму
- Блок независим от окружения (может быть размещён в любой части страницы и не сломается при этом).
- У разных блоков не должно быть общих классов (и в CSS — не группируем общие правила, а копируем их).
- У одного блока (элемента) может быть несколько модификаторов.
- Осторожно используем дочерний селектор (>), последовательность (+), псевдоклассы (:nth-child).
БЛОК
- Имя класса должно отвечать на вопрос «Зачем нужен этот блок?» (а не описывать его внешний вид).
- Сложные блоки собираем из простых. Только если нужный блок нельзя собрать из уже готовых (или получить модификацией готовых), создаём новый блок.
- Блок независим от окружения (может быть размещён в любой части страницы и не сломается при этом).
- У разных блоков не должно быть общих классов (и в CSS — не группируем общие правила, а копируем их). Примеры: «шапка» сайта, кнопка, главная навигация, пагинация, запись в блоге, блок товара в списке товаров.
- Блоки внутри блоков - обычное дело, селектор у нового блока может не описывать вложенность
ЭЛЕМЕНТ
- Это часть блока, которая вне этого блока не имеет смысла и не может быть использована.
- CSS-класс элемента формируется так: класс-блока__класс-элемента
- Могут отсутствовать (часть элементов не являются обязательными, в блоке может не быть элементов).
- Примеры: пункты основной навигации, заголовочная часть записи в блоге, ссылка пагинации. Нет, тольно внутри родителя — это элемент.
- Частая ошибка: в имени элемента пишут два сегмента __. Не надо так.
<!-- Неправильно -->
<div class="block__element1__element2">
<!-- Праильно -->
<div class="block__element1">
<div class="block__element2">
- В БЭМ плоская структура Блок → Элемент, максимально независимая от разметки.
МОДИФИКАТОР
- Дополнительный класс, изменяющий внешний вид блока (или элемента, если добавлен к элементу).
- CSS-класс модификатора формируется так: класс-блока--название-модификатора.
- Даёт возможность блокам выглядеть по-разному на разных страницах или в разных частях страницы.
- Классы-модификаторы не используются без тех классов, которые они модифицируют.
- Пример правильного нейминга:
<!-- Неправильно -->
<div class="header_big">
<!-- Праильно -->
<div class="header header_big">
- У одного блока (элемента) может быть несколько модификаторов.
- Можно модифицировать элементы от модификатора блока (это делает код неочевидным!).
- Избегайте модифицировать вложенные блоки от модификатора блока-родителя.
Название модификатора должно характеризовать:
- внешний вид — «размер»:
size_s
, «тему»:theme_island
; - состояние — «отключён»:
disabled
, «фокусированный»:focused
; - поведение — «направление»:
directions_left-top
.
Применение
/* блок */
.button { ... }
/* элементы */
.button__capture { ... }
.button__icon { ... }
/* модификаторы */
.button__size_big { ... }
.button__active_disabled { ... }
.button__capture_red { ... }
.button__capture_green { ... }