БЭМ: Как сделать жизнь разработчика чуть лучше
БЭМ компонентный подход (Блок - Элемент - Модификатор), ставший мировым стандартом в CSS, позволяет разрабатывать масштабируемые интерфейсы легкие в чтении и понимании
В основе подхода БЭМ лежит принцип разделения компонента на независимые блоки. Он позволяет легко и быстро разрабатывать интерфейсы любой сложности и повторно использовать существующий код, не прибегая к ненужному копированию.
Почему БЭМ?
У данного подхода есть, как минимум два преимущества:
- использование БЭМ не вызывает затруднений,
- созданные масштабируемые структуры легки в понимании.
Что такое БЭМ?
Имена классов при использовании БЭМ состоят из трех частей (Блок - Элемент - Модификатор):
[block]__[element]--[modifier]
- Блок: самый внешний родительский элемент, в HTML это класс, определяющий основные функции компонента. Название блока должно определять смысл, а не состояние.
- Элемент: в компоненте может быть определен один или несколько элементов. Элементы добавляют блоку новые функции и не используются в отрыве от него. Свойства элемента не заменяют все свойства блока.
- Модификатор: блок или элементы может иметь различные варианты, определяемые модификаторами. Модификатор определяет внешний вид, состояние или поведение блока или элемента.
Примеры
Блок без элементов и модификаторов
Самые простые компоненты включают в себя только один класс, который и будет являться блоком
Компонент с простым модификатором
Как мы уже знаем, компонент может иметь различные варианты. Вариант может определяться классом модификатора. Модификатор не может существовать сам по себе, без блока. Классы модификаторов предназначены для расширения базовых классов, а не для их замещения.
Вот пример правильного использования класса модификатора:
А так делать нельзя:
Компоненты с элементами
Более сложные компоненты имеют вложенные элементы. Название класса каждого дочернего элемента в составе компонента должно начинаться с имени блока. Одной из основных задач БЭМ является сохранение последовательностей. Поэтому корректно именуйте классы элементов. Для вложенных элементов, имеющих CSS свойства, необходимо создавать классы с корректными именами.
Вот пример правильного именования элементов:
А такой подход будет неверным:
Относительно родительского блока, элементы могут иметь несколько уровней вложенности. В таком случае не пытайтесть создавать многоуровневые имена классов. БЭМ не поддерживает такие многоуровневые структуры. Имя класса, определяющего CSS свойства вложенного элемента, должно содержать только название элемента и родительского блока, независимо от уровне вложенности элементов.
Такой подход будет верным:
А такой - нет:
Элементы с модификаторами
Иногда необходимо изменить только один элемент в компоненте. В таком случае модификатор необходимо добавить к элементу, а не к блоку:
Изменения элементов модифицированных блоков
Если Вы преобразуете элементы компонента одинаковым образом, имеет смысл добавить модификатор для блока, а стили элементов изменять вторично уже на основе этого модификатора. Такой подход сделает код более специфичным и понятным, упростит сам процесс модификации родительского блока.
Так будет правильно:
А так неправильно:
Как быть с именами, состоящими из нескольких слов?
Двойное подчеркивание и двойной дефис в БЭМ созданы как раз для этого: они разделяют смысловые структуры компонента:
[block]__[element]--[modifier]
Таким образом, простые одинарные дефисы используются как разделители слов.
Имена классов должны быть понятными и легкочитаемыми. Использование аббревиатура нежелательно, за исключением тех случаев, когда она является общепризнанной.
Дополнительная информация
- БЭМ (язык: русский и английский),
- getBEM.com (язык: английский),
- БЭМ. Технологии Яндекса (язык: русский)
Спасибо за внимание.