В мире веб-разработки каждый проект стремится к четкости и структурированности кода, которые обеспечивают не только легкость в поддержке, но и высокое качество пользовательского опыта. BEM-методология (Block, Element, Modifier) является мощным инструментом для достижения этих целей. Что такое BEM, как её применять и почему она становится неотъемлемой частью эффективной верстки в современной веб-разработке – расскажем в статье.
Что такое BEM
BEM (Block, Element, Modifier) — это методология в веб-разработке, предназначенная для создания структурированной и многократно используемой вёрстки. Она позволяет разработчикам создавать независимые компоненты интерфейса с помощью системы именования, которая упрощает поддержку, расширение и масштабирование кода.
Блок — это самостоятельная часть, которую можно использовать в разных местах страницы.
Элемент — это часть блока, которая не может существовать отдельно от него и зависит от его контекста.
Модификатор — это свойство блока или элемента, которое изменяет их внешний вид или поведение.
Вот пример HTML-кода и CSS-стилей, использующих BEM-нейминг:
| <div class="menu"> | 
HTML
| .menu {  | 
CSS
В данном случае menu — это блок, menu__item — элемент, а menu__item--active — модификатор.

Зачем он нужен
BEM используют веб-разработчики и дизайнеры для создания и поддержки структурированных и легко расширяемых веб-приложений и корпоративных сайтов.
Лучше всего применять BEM с самого начала проекта или при рефакторинге уже существующего кода. Это позволяет обеспечить повторное использование компонентов и их модификацию, что особенно полезно для крупных проектов с адаптивными интерфейсами.
BEM основан на чётком разделении стилей для блоков, элементов и модификаторов. Такой подход делает код предсказуемым и легко поддерживаемым.
Зачем он нужен:
Организация кода:
- BEM помогает структурировать HTML и CSS, что делает код более читаемым, предсказуемым и легким в поддержке.
- Четкая система нейминга позволяет легко идентифицировать и управлять различными частями интерфейса, минимизируя ошибки и упрощая модификации.
Уменьшение конфликта стилей:
- Избегает пересечения стилей благодаря уникальным именам блоков, элементов и модификаторов.
- Повышает предсказуемость и стабильность интерфейса.
Переиспользуемость компонентов:
- Компоненты, созданные с использованием BEM, можно легко переиспользовать в различных частях приложения или проекта.
- Повышает эффективность разработки за счет модульности.
Гибкость и масштабируемость:
- Подходит как для небольших проектов, так и для крупных приложений с сложной структурой.
- Облегчает добавление новых компонентов и стилей.
Плюсы и минусы
| Плюсы BEM | Минусы BEM | 
| Код становится более читаемым и структурированным, что облегчает его поддержку и развитие. | Имена классов могут быть длинными и менее удобными для быстрого написания. | 
| Компоненты легко переиспользовать в различных частях проекта, что повышает эффективность разработки. | Для небольших проектов применение BEM может оказаться излишне сложным. | 
| Уникальные имена блоков, элементов и модификаторов предотвращают пересечение стилей. | Больше кода для написания, так как каждая часть интерфейса имеет свой уникальный класс. | 
| С помощью модификаторов можно легко изменять внешний вид и поведение компонентов. | Новичкам может потребоваться время для изучения и освоения методологии BEM. | 
| Подходит для проектов любого размера, облегчая добавление новых компонентов и стилей. | Требуется продуманное планирование структуры классов и компонентов. | 
| Обеспечивает единообразие в коде, что особенно полезно при работе в команде. | Длинные и сложные классы могут затруднить визуальное восприятие кода. | 
Как работать с BEM: настройка и установка
Для работы с BEM не нужно устанавливать специальное программное обеспечение, поскольку это методология написания кода. Однако, чтобы лучше организовать проект и использовать все преимущества BEM, можно применять определённые инструменты и подходы.
- Организация проекта- Создайте структуру папок проекта:
 Создайте основные папки для вашего проекта, такие как css, js, images, components, чтобы организовать код и ресурсы. - Создайте файлы для компонентов:
 В папке components создайте отдельные папки для каждого блока. Например: button, header, footer. 
- Настройка HTML- Структурируйте HTML согласно BEM:
 Начните с создания блоков и элементов в HTML-файлах. <div class="menu"> 
 <div class="menu__item menu__item--active">Главная</div>
 <div class="menu__item">Новости</div>
 <div class="menu__item">Контакты</div>
 </div>HTML 
- Настройка CSS- Создайте CSS файлы для блоков:
 В каждой папке блока создайте отдельные CSS файлы. Например: button/button.css, header/header.css. - Организуйте стили согласно BEM:
 Используйте уникальные классы для блоков, элементов и модификаторов: /* button/button.css */ 
 .button {
 background-color: gray;
 padding: 10px;
 }
 .button--primary {
 background-color: blue;
 }
 .button__text {
 color: white;
 }CSS 
- Инструменты автоматизации (необязательно)- Используйте препроцессоры CSS:
 Препроцессоры, такие как Sass или LESS, могут значительно упростить работу с BEM, позволяя использовать вложенность, переменные и другие мощные возможности: /* button/button.scss */ 
 .button {
 background-color: gray;
 padding: 10px;
 &--primary {
 background-color: blue;
 }
 &__text {
 color: white;
 }
 }CSS - Настройка сборки:
 Используйте инструменты сборки, такие как Gulp или Webpack, для автоматической компиляции, объединения и оптимизации ваших CSS файлов. 
- Документация и поддержка- Документируйте компоненты:
 Ведите документацию для каждого блока, описывая его структуру и назначение классов. - Следите за консистентностью:
 При добавлении новых компонентов или изменении существующих, следуйте BEM-методологии, чтобы поддерживать единообразие и предсказуемость кода. Пример структуры проекта: project/ 
 │
 ├── css/
 │ └── main.css
 │
 ├── components/
 │ ├── button/
 │ │ ├── button.html
 │ │ └── button.scss
 │ ├── header/
 │ │ ├── header.html
 │ │ └── header.scss
 │ └── footer/
 │ ├── footer.html
 │ └── footer.scss
 │
 ├── images/
 │
 ├── js/
 │ └── main.js
 │
 └── index.htmlCSS 
Блоки
Блок — это самостоятельная и независимая часть проекта, которая имеет значение сама по себе и может многократно использоваться в разных частях проекта. Блоки могут содержать элементы и модификаторы, которые изменяют их функциональность и внешний вид.
| <div class="menu"> | 
HTML
Особенности блоков
- Независимость:
Блоки могут быть использованы автономно, без зависимости от других частей кода.
- Переиспользуемость:
Один и тот же блок может быть использован в разных частях проекта, что способствует модульности и уменьшению дублирования кода.
- Модульность:
Блоки могут включать в себя элементы (части блока) и модификаторы (варианты блока или его элементов), что делает их гибкими и настраиваемыми.
Элементы
Элемент — это часть блока, которая выполняет конкретную функцию внутри этого блока. Элементы обозначаются двойным подчёркиванием (__) после названия блока.
Пример блока с элементами в HTML:
| <div class="card"> | 
card — это блок
card__header, card__title, card__body, card__text, card__footer, card__button — это элементы этого блока.
Особенности элементов
- Зависимость от блока:
Элементы не могут существовать самостоятельно, они всегда являются частью блока.
- Уникальность именования:
Имя элемента состоит из имени блока и имени элемента, разделённых двойным подчёркиванием (__), что исключает конфликты имен.
- Функциональность:
Элементы выполняют конкретные функции внутри блока, помогая структурировать и организовывать внутренние части блока.
Модификаторы
Модификатор — это признак, который изменяет внешний вид, состояние или поведение блока или элемента. Модификаторы обозначаются одним символом подчёркивания (_). Они могут быть двух видов: булевыми или типа «ключ-значение».
Типы модификаторов
- Булевые модификаторы:
- Используются для указания состояния или присутствия определённого стиля.
- Пример: block_modifier.
- Ключ-значение модификаторы:
- Используются для указания различных вариантов блока или элемента.
- Пример: block_modifier_value.
Пример блока с модификаторами в HTML:
| <div class="button button_primary button_large"> | 
Здесь button — это блок, а button_primary и button_large — модификаторы этого блока, которые изменяют его внешний вид.
Особенности модификаторов
- Изменение поведения и стиля:
Модификаторы позволяют изменять внешний вид или поведение блоков и элементов без необходимости создавать новые блоки или элементы.
- Комбинирование модификаторов:
Один блок или элемент может иметь несколько модификаторов одновременно, что позволяет создавать различные комбинации стилей и состояний.
- Уникальность именования:
Модификаторы добавляются к имени блока или элемента через одинарное подчёркивание (_), что исключает конфликты имен.
Миксы
Микс — это способ объединения классов разных блоков или элементов в одном HTML-элементе для использования их стилей или функциональности.
Микс осуществляется путем добавления нескольких классов напрямую в атрибут class HTML-элемента. Например:
| <div class="block1 block2 block3__element"> | 
Пример использования миксов в HTML:
| <div class="card"> | 
Особенности миксов
- Независимость стилей:
Позволяют комбинировать стили и функциональность блоков и элементов, избегая необходимости в наследовании или дублировании кода.
- Читаемость и поддерживаемость:
Делают код более читаемым, сохраняя явную связь между использованными компонентами.
- Гибкость и масштабируемость:
Позволяют быстро добавлять и изменять функциональность компонентов, не затрагивая их основную структуру.
Файловая структура
В BEM файловая структура не имеет строгих установленных правил, так как BEM сконцентрирована на именовании классов CSS и организации HTML-разметки. Однако, хорошая практика включает организацию файлов для удобства работы и поддержки проекта.
Рекомендации по файловой структуре
- Структура проекта:- blocks/: Этот каталог может содержать подкаталоги, каждый из которых представляет собой блоки (например, header, footer, menu).
- styles/: Здесь размещаются CSS файлы. Каждый блок может иметь свой собственный CSS файл, который включает стили для соответствующего блока.
- scripts/: JavaScript файлы, связанные с конкретными блоками или элементами, можно разместить здесь.
- images/: Каталог для изображений, используемых в проекте.
 
- Файловая структура блока:- Каждый блок рекомендуется размещать в отдельной папке внутри каталога blocks/. Например:
 blocks/ 
 ├── header/
 │ ├── header.css
 │ ├── header.html
 │ └── header.js
 ├── menu/
 │ ├── menu.css
 │ ├── menu.html
 │ └── menu.js
 └── footer/
 ├── footer.css
 ├── footer.html
 └── footer.jsCSS - В данном примере для каждого блока (header, menu, footer) созданы отдельные файлы для стилей (.css), HTML-разметки (.html) и JavaScript (.js), если это необходимо.
 
- Именование файлов:- Имена файлов обычно соответствуют имени блока или элемента. Например, header.css, menu.html.
 
- Сборка и автоматизация:- Для управления и сборки проекта могут использоваться инструменты автоматизации, такие как Gulp, Webpack или npm скрипты. Они позволяют объединять и минифицировать CSS и JavaScript файлы, оптимизировать изображения и управлять зависимостями.
 
HTML (header.html):
| <div class="header"> | 
CSS (header.css):
| .header {  | 
Хорошо организованная файловая структура помогает поддерживать порядок и чистоту в проекте, делая его более понятным и легко поддерживаемым как для одного разработчика, так и для команды.
Как применять BEM для HTML и CSS
Применение методологии BEM (Block, Element, Modifier) для HTML и CSS помогает структурировать и стандартизировать код, делая его более читаемым, поддерживаемым и масштабируемым.
Принципы BEM
- Блок (Block):
- Блок представляет собой независимую именованную сущность, которая является фундаментальным строительным блоком в BEM.
- Название блока отражает его назначение и контекст использования.
- Например, header, menu, button.
- Элемент (Element):
- Элементы являются частями блоков и не имеют самостоятельного смысла вне контекста блока.
- Имена элементов формируются с использованием двойного подчёркивания (__).
- Например, header__logo, menu__item, button__text.
- Модификатор (Modifier):
- Модификаторы изменяют внешний вид, состояние или поведение блоков или элементов.
- Имена модификаторов формируются с использованием одинарного подчёркивания (_).
- Например, button--primary, menu__item--active.
Пример использования BEM в HTML-разметке:
| <!DOCTYPE html> | 
Пример стилей для вышеуказанной HTML-разметки:
| .header {  | 
Особенности применения BEM для HTML и CSS
- Именование классов:
- Классы должны отражать иерархию блоков, элементов и модификаторов.
- Избегайте слишком длинных и сложных имен, сохраняя их понятность и ясность.
- Компонентный подход:
- Каждый блок и элемент должен иметь свои собственные стили, что обеспечивает лучшую изоляцию и поддерживаемость кода.
- Модификаторы для вариаций:
- Используйте модификаторы для создания различных вариаций блоков и элементов без необходимости повторения кода.
- Поддержка и масштабируемость:
- BEM упрощает сопровождение проекта и его масштабирование, поскольку делает структуру и стили более прозрачными и предсказуемыми.
Какие перспективы у BEM
Разработанная Яндексом в начале 2000-х гг., BEM (Block, Element, Modifier) получила широкое признание благодаря своей структурированности и удобству в использовании. В настоящее время BEM продолжает оставаться актуальной и востребованной, несмотря на появление других методологий и подходов к организации кода в веб-разработке.
Перспективы BEM
- Стандартизация и прозрачность:
- BEM способствует стандартизации именования классов в HTML и CSS, что улучшает читаемость и поддерживаемость кода. Это особенно важно для крупных проектов и команд разработчиков.
- Масштабируемость проектов:
- Благодаря четкому разделению на блоки, элементы и модификаторы, BEM облегчает масштабирование проектов. Разработчики могут легко добавлять новые компоненты и вариации без опасения конфликтов и пересечений стилей.
- Совместимость с другими технологиями:
- BEM хорошо интегрируется с другими технологиями и фреймворками, такими как React, Angular, Vue.js и другими, что позволяет использовать его принципы в современных SPA-приложениях.
- Поддержка сообществом:
- Веб-разработчики продолжают активно обмениваться опытом и лучшими практиками по применению BEM. Это поддерживает развитие методологии и способствует её адаптации к различным проектам и требованиям.
- Развитие инструментов поддержки:
- С появлением различных инструментов и плагинов для автоматизации создания BEM-классов, например, генераторов классов или расширений для редакторов кода, использование BEM становится еще более удобным и эффективным.
- Продолжение обучения и документации:
- Продолжается разработка и улучшение документации по BEM, что помогает новым и опытным разработчикам быстрее осваивать методологию и использовать её в своих проектах.

Типичные ошибки и как их исправить
Неправильное именование классов:
- Проблема: Имена классов не соответствуют принципам BEM, могут быть слишком общими или недостаточно информативными.
- Исправление: Придерживайтесь следующих правил:
- Используйте понятные имена, отражающие смысл блока или элемента.
- Не используйте слишком длинные имена, которые затрудняют чтение и понимание кода.
- Избегайте использования аббревиатур, если они не являются широко распространёнными и понятными всем членам команды.
Неправильное использование модификаторов:
- Проблема: Модификаторы применяются неправильно или неэффективно.
- Исправление:
- Используйте модификаторы для изменения внешнего вида, состояния или поведения блока или элемента, но избегайте создания избыточного количества модификаторов.
- Не создавайте излишнее количество модификаторов, если они могут быть заменены комбинацией блоков и элементов.
Нарушение иерархии блоков и элементов:
- Проблема: Неправильное вложение элементов в блоки или неправильное использование блоков и элементов.
- Исправление:
- Соблюдайте иерархию блоков и элементов: блок может содержать только элементы, элементы — только внутри блоков.
- Избегайте использования блоков в качестве элементов и наоборот.
Дублирование кода и стилей:
- Проблема: Дублирование классов или стилей блоков и элементов.
- Исправление:
- Используйте компонентный подход: каждый блок и элемент должен иметь свой уникальный класс и стили.
- Избегайте копирования кода, создавайте повторно используемые компоненты и модули.
Недостаточная документация и обучение:
- Проблема: Отсутствие четких руководств и документации для новых участников команды.
- Исправление:
- Создайте подробную документацию по правилам и стандартам BEM для вашего проекта.
- Обучайте новых членов команды методологии BEM и правилам его использования.
Неэффективная организация файлов и структуры проекта:
- Проблема: Блоки, элементы и стили расположены хаотично, что затрудняет их поиск и поддержку.
- Исправление:
- Организуйте файловую структуру проекта согласно принципам BEM.
- Размещайте файлы стилей и скриптов для каждого блока и элемента в отдельных папках.
Главное, что нужно знать
Что такое BEM:
- BEM — это методология именования классов в HTML и CSS, разработанная Яндексом. Она структурирует код, используя три основных концепта: блоки (block), элементы (element) и модификаторы (modifier). BEM способствует созданию модульного и масштабируемого кода в веб-разработке.
Элементы BEM:
- Блок (Block): Независимый компонент, который может содержать другие блоки или элементы. Примеры: header, menu, button.
- Элемент (Element): Части блока, которые не имеют смысла вне контекста блока. Имена элементов формируются с использованием двойного подчёркивания (__). Примеры: header__logo, menu__item.
- Модификатор (Modifier): Изменения внешнего вида, состояния или поведения блока или элемента. Имена модификаторов формируются с использованием одинарного подчёркивания (_). Примеры: button--primary, menu__item--active.
Преимущества BEM:
- Улучшает читаемость и поддерживаемость кода благодаря чёткой структуре и именованию классов.
- Способствует созданию модульного кода, который легко переиспользовать и модифицировать.
- Повышает эффективность работы в команде, упрощая взаимодействие между разработчиками.
Реализация в проекте:
- Каждый блок и элемент должен иметь уникальное имя класса, отражающее его функциональность и контекст использования.
- Использование модификаторов позволяет создавать различные вариации блоков и элементов без необходимости дублирования кода.
- Важно соблюдать иерархию и правила BEM во всех частях проекта, от HTML-разметки до CSS стилей.









