Лев Корольков
Руководитель IT-департамента EFSOL Oblako
Время чтения: 10 мин

БЭМ

(Методология CSS-именования)
БЭМ помогает структурировать интерфейсы через блоки, элементы и модификаторы, чтобы CSS и HTML оставались понятными, переиспользуемыми и удобными для командной разработки.

БЭМ — это методология организации интерфейсного кода, название которой расшифровывается как блок, элемент, модификатор. В практическом смысле БЭМ помогает договориться, как называть CSS-классы, как делить интерфейс на независимые части и как поддерживать проект, когда экранов, компонентов и разработчиков становится больше.

Чаще всего БЭМ используют во фронтенд-разработке для HTML и CSS, но сама идея шире: любой интерфейс можно представить как набор самостоятельных сущностей. Например, карточка товара, форма поиска, меню, кнопка, уведомление или шапка сайта могут быть блоками. У блока могут быть элементы: заголовок карточки, цена, изображение, поле формы, пункт меню. А модификаторы описывают состояние или вариант: активный, большой, отключенный, основной, с ошибкой.

Для бизнеса БЭМ важен не как красивая теория, а как способ снижать стоимость изменений. Когда классы названы хаотично, любое изменение дизайна может ломать соседние страницы. Когда интерфейс разложен по БЭМ, разработчик быстрее понимает, где находится нужный стиль, какие части можно переиспользовать и что безопасно менять.

Что означает БЭМ

В основе методологии три понятия. Блок — самостоятельная часть интерфейса, которая имеет смысл сама по себе. Элемент — часть блока, которая не используется отдельно от него. Модификатор — признак, который меняет внешний вид, состояние или поведение блока либо элемента.

СущностьЧто означаетПример
БлокНезависимый компонент интерфейсаbutton, product-card, search-form
ЭлементЧасть блока, зависящая от негоproduct-card__title, search-form__input
МодификаторВариант, состояние или свойствоbutton–primary, product-card–featured

Главная ценность БЭМ — предсказуемость. По одному названию класса можно понять, к какому компоненту он относится и какую роль играет. Это особенно полезно в проектах, где над интерфейсом одновременно работают frontend-разработчики, дизайнеры, верстальщики, QA-инженеры и контент-менеджеры.

Как устроено именование в БЭМ

В классическом варианте имя блока пишется как самостоятельное слово или словосочетание через дефис. Элемент отделяется двумя нижними подчеркиваниями, а модификатор — двумя дефисами. Такая запись стала популярной, потому что ее легко читать и искать в коде.

card
card__title
card__image
card__price
card--compact
card__price--discount

Например, card — это блок. card__title — элемент title внутри блока card. card–compact — модификатор блока, который показывает компактный вариант карточки. card__price–discount — модификатор элемента price, который может использоваться для цены со скидкой.

Важно понимать, что БЭМ не заставляет использовать только один конкретный синтаксис. Команды могут адаптировать соглашение под свой стек, CSS Modules, Sass, Vue, React, Angular или другую технологию. Но принцип должен оставаться тем же: название класса показывает структуру интерфейса, а не случайное визуальное свойство.

Пример БЭМ в HTML и CSS

Допустим, интернет-магазину нужна карточка товара. В ней есть изображение, название, цена и кнопка покупки. Без методологии классы часто выглядят как img, title, price, red-button, box. В маленьком проекте это кажется удобным, но позже такие названия конфликтуют, повторяются и плохо объясняют контекст.

В БЭМ структура может выглядеть так:

<article class='product-card product-card--featured'>
 <img class='product-card__image' src='phone.jpg' alt='Смартфон'>
 <h3 class='product-card__title'>Смартфон X</h3>
 <p class='product-card__price product-card__price--discount'>49 990 ₽</p>
 <button class='product-card__button'>Купить</button>
</article>

CSS для такой структуры легче сопровождать:

.product-card {
 padding: 24px;
 border: 1px solid #ddd;
}

.product-card__title {
 margin: 0 0 12px;
}

.product-card__price--discount {
 font-weight: 700;
}

.product-card--featured {
 border-width: 2px;
}

Даже без дополнительной документации видно, что product-card__price относится именно к карточке товара, а product-card–featured меняет вариант всей карточки. Это снижает риск, что изменение цены в карточке случайно повлияет на цену в корзине, каталоге или блоке рекомендаций.

Зачем БЭМ нужен в IT-проектах

БЭМ особенно полезен там, где интерфейс живет долго и постоянно развивается. Например, компания запускает личный кабинет, маркетплейс, корпоративный портал, SaaS-сервис или медиа-платформу. Сначала страниц немного, но затем появляются новые роли пользователей, промо-блоки, состояния ошибок, адаптивные версии, A/B-тесты и интеграции.

Если стили не имеют системы, технический долг растет быстро. Разработчики начинают добавлять новые классы поверх старых, боятся удалять устаревшие правила, дублируют компоненты и тратят время на ручную проверку побочных эффектов. БЭМ не решает все архитектурные проблемы, но дает понятную базу для масштабирования.

  • Упрощает чтение HTML и CSS.
  • Снижает вероятность конфликтов между стилями.
  • Помогает переиспользовать компоненты на разных страницах.
  • Делает код понятнее для новых участников команды.
  • Ускоряет ревью, рефакторинг и исправление ошибок.
  • Поддерживает единый язык между дизайном и разработкой.

Бизнес-контекст: где БЭМ дает заметный эффект

В небольшом лендинге БЭМ может показаться избыточным. Но в продуктах с большим количеством интерфейсных сценариев методология быстро окупается. Чем чаще меняется дизайн, тем важнее предсказуемые классы и изолированные компоненты.

СценарийПроблема без БЭМКак помогает БЭМ
Редизайн сайтаСложно понять, какие стили можно менять безопасноКомпоненты имеют ясные границы
Рост командыРазные разработчики называют классы по-разномуПоявляется единое соглашение
Дизайн-системаКомпоненты дублируются и расходятся по стилямБлоки легче описывать, версионировать и переиспользовать
Поддержка legacy-кодаНовые правки ломают старые экраныИмена классов показывают область влияния
A/B-тестыВременные стили смешиваются с основнымиМодификаторы помогают описывать варианты

Для менеджера проекта БЭМ означает меньше неожиданных дефектов после релиза и более прозрачную оценку задач. Для тимлида — единый стандарт, который проще объяснить и проверить. Для бизнеса — снижение стоимости поддержки интерфейса на длинной дистанции.

Блок, элемент и модификатор на практике

Блок

Блок должен быть независимым. Если часть интерфейса можно перенести в другое место страницы и она сохранит смысл, скорее всего, это блок. Например, modal, menu, user-card, notification, pricing-table.

Хорошее имя блока отвечает на вопрос, что это за сущность. Плохое имя описывает только внешний вид. Например, green-box хуже, чем success-message, потому что цвет может измениться, а назначение останется.

Элемент

Элемент не существует сам по себе. Он нужен только внутри конкретного блока. Например, у блока search-form могут быть элементы search-form__input, search-form__button и search-form__hint. Если кнопку можно использовать отдельно во многих местах, лучше сделать ее отдельным блоком button, а не элементом другой формы.

Типичная ошибка — строить слишком длинные цепочки элементов. В БЭМ не принято писать block__element__subelement. Если структура становится такой глубокой, лучше пересмотреть компонент и выделить новый блок.

Модификатор

Модификатор описывает отличие от базовой версии. Это может быть размер, тема, состояние, роль или вариант отображения. Например, button–large, button–disabled, alert–error, menu__item–active.

Модификаторы помогают не создавать отдельные сущности для каждого небольшого изменения. Вместо классов button-blue, button-red, button-big и button-small можно использовать базовый block button и набор понятных модификаторов.

Когда БЭМ особенно полезен

БЭМ стоит внедрять, если проект имеет много повторяющихся UI-компонентов, несколько разработчиков, частые релизы или долгий жизненный цикл. Также методология полезна при создании дизайн-систем, библиотек компонентов и корпоративных интерфейсов.

  1. Проект уже содержит десятки страниц и компонентов.
  2. Команда сталкивается с конфликтами CSS-стилей.
  3. Новые разработчики долго разбираются в верстке.
  4. Один и тот же компонент копируется с небольшими изменениями.
  5. Редизайн занимает слишком много времени из-за страха сломать старые экраны.

В то же время БЭМ не обязан применяться механически. Для прототипа на один день или одноразовой промо-страницы строгая методология может быть лишней. Важно соотносить правила с ценностью для проекта.

БЭМ и современные фреймворки

Иногда считают, что БЭМ устарел из-за React, Vue, Angular, CSS Modules, styled components и utility-first CSS. На практике БЭМ остается полезным как соглашение о мышлении. Даже если классы генерируются автоматически или стили находятся рядом с компонентами, разработчикам все равно нужно понимать границы сущностей.

В React блок часто соответствует компоненту, элемент — внутренней части компонента, а модификатор — пропсу или состоянию. Например, компонент Button может иметь варианты primary, secondary, disabled и loading. Даже если итоговые классы формируются иначе, подход БЭМ помогает не смешивать ответственность.

В CSS Modules можно сохранять БЭМ-логику, но не всегда требуется длинное имя класса, потому что модуль уже изолирует область видимости. В дизайн-системах БЭМ часто комбинируют с токенами, компонентной архитектурой и документацией в Storybook.

Распространенные ошибки при использовании БЭМ

  • Называть блоки по внешнему виду, например red-panel вместо error-panel.
  • Создавать слишком длинные имена, которые трудно читать и поддерживать.
  • Делать все элементы одного большого блока вместо выделения самостоятельных компонентов.
  • Использовать модификаторы как случайные исправления, не описывая их смысл.
  • Смешивать разные соглашения об именовании в одном проекте.
  • Привязывать CSS к структуре HTML слишком жесткими селекторами.

Еще одна частая ошибка — считать, что БЭМ ограничивается только разделителями в названии класса. На самом деле двойные подчеркивания и дефисы — это не цель, а инструмент. Если команда просто переименовала классы, но не научилась выделять блоки, элементы и состояния, методология не даст полного эффекта.

БЭМ полезен не потому, что делает классы длиннее, а потому, что делает интерфейсные зависимости явными.

Риски и ограничения

У БЭМ есть минусы. Имена классов могут выглядеть длинными, особенно для вложенных компонентов. Новичкам требуется время, чтобы привыкнуть к терминам и правилам. В проектах с маленьким объемом CSS методология может казаться бюрократией. Кроме того, без командной дисциплины БЭМ быстро превращается в формальность.

Риск появляется и при чрезмерной детализации. Если каждый маленький фрагмент объявлять отдельным блоком, структура станет раздробленной. Если, наоборот, весь экран считать одним блоком, классы станут огромными и неудобными. Нужен баланс между независимостью компонентов и простотой.

Еще один практический риск — конфликт БЭМ с существующим legacy-кодом. В старом проекте не всегда разумно переписывать все стили сразу. Часто лучше внедрять БЭМ постепенно: для новых компонентов, при рефакторинге проблемных зон и в рамках дизайн-системы.

Как внедрять БЭМ в команде

Внедрение стоит начинать не с массового переименования классов, а с короткого соглашения. Команда должна договориться, как называть блоки, какие разделители использовать, когда выделять новый блок, как оформлять модификаторы и где хранить стили компонентов.

  1. Опишите правила именования на одной странице внутренней документации.
  2. Выберите несколько типовых компонентов и оформите их как образцы.
  3. Добавьте проверку соглашений на code review.
  4. Не переписывайте весь проект сразу, начинайте с новых и часто изменяемых частей.
  5. Свяжите БЭМ с дизайн-системой, если она есть.
  6. Периодически удаляйте устаревшие классы и дубли.

Хорошая практика — обсуждать спорные случаи на уровне компонентов. Например, является ли button элементом формы или самостоятельным блоком. Если кнопка переиспользуется в разных местах, чаще всего это отдельный блок. Если часть интерфейса имеет смысл только внутри конкретного блока, это элемент.

Мини-пример выбора структуры

Представим блок checkout-form для оформления заказа. Внутри есть поля, итоговая сумма и кнопка оплаты. Поле ввода может быть самостоятельным компонентом form-field, потому что оно используется и в регистрации, и в профиле, и в фильтрах каталога. А текстовая подсказка, которая относится только к оформлению заказа, может быть элементом checkout-form__hint.

checkout-form
checkout-form__summary
checkout-form__hint
form-field
form-field__label
form-field__input
form-field--error
button
button--primary

Такая структура показывает, что форма заказа собирается из нескольких блоков. Это удобнее, чем делать огромный набор классов checkout-form__field, checkout-form__field-label, checkout-form__field-input, если поля нужны за пределами формы.

БЭМ, архитектура CSS и поддержка продукта

БЭМ хорошо работает вместе с другими подходами к архитектуре CSS. Его можно комбинировать с препроцессорами, компонентными библиотеками, дизайн-токенами, адаптивной сеткой и системами сборки. Главное — не смешивать уровни ответственности. БЭМ отвечает за ясную структуру интерфейса и имена классов, но не заменяет дизайн-систему, тестирование, accessibility-практики и общую архитектуру приложения.

В зрелом продукте БЭМ помогает поддерживать единый интерфейсный язык. Когда дизайнер говорит о карточке, состоянии ошибки или активном пункте меню, разработчик может быстро найти соответствующий блок, элемент или модификатор. Это сокращает время между постановкой задачи и реализацией.

Связанные термины

  • CSS — язык описания внешнего вида веб-страниц.
  • HTML — разметка, в которой БЭМ-классы обычно используются.
  • Компонентный подход — организация интерфейса как набора независимых компонентов.
  • Дизайн-система — набор правил, компонентов и паттернов для единого пользовательского опыта.
  • CSS Modules — способ локализовать CSS-классы на уровне компонентов.
  • Рефакторинг — улучшение структуры кода без изменения поведения продукта.

Краткий итог

БЭМ — это методология, которая помогает структурировать интерфейс через блоки, элементы и модификаторы. Она делает CSS-классы понятными, снижает риск конфликтов и облегчает поддержку больших веб-проектов. БЭМ особенно полезен в командах, где интерфейс развивается долго, часто меняется и состоит из повторяемых компонентов.

Главная идея проста: блок должен быть самостоятельным, элемент должен принадлежать блоку, а модификатор должен описывать вариант или состояние. Если соблюдать эту логику, код становится предсказуемым для разработки, тестирования и дальнейшего развития продукта.

Частые вопросы

6 вопросов
Что такое БЭМ простыми словами?

БЭМ — это способ называть и организовывать CSS-классы через блоки, элементы и модификаторы, чтобы интерфейсный код был понятнее и легче поддерживался.

Зачем использовать БЭМ в веб-разработке?

БЭМ помогает избежать конфликтов стилей, ускоряет работу с компонентами, упрощает ревью кода и снижает риски при изменении интерфейса.

Чем блок отличается от элемента в БЭМ?

Блок может существовать самостоятельно, например карточка товара или кнопка. Элемент является частью блока и обычно не используется отдельно, например заголовок карточки.

Что такое модификатор в БЭМ?

Модификатор описывает вариант, состояние или свойство блока либо элемента. Например, button--primary может обозначать основную кнопку, а menu__item--active — активный пункт меню.

Подходит ли БЭМ для React и Vue?

Да. В современных фреймворках БЭМ можно использовать как принцип структурирования компонентов и состояний, даже если конкретная реализация классов отличается.

Когда БЭМ может быть лишним?

БЭМ может быть избыточным для очень маленьких прототипов, одноразовых страниц или проектов без долгосрочной поддержки. Чем больше продукт и команда, тем полезнее методология.

Была ли статья полезна?
Документ обновляется командой EFSOL. Свяжитесь с нами, если нашли неточность.
Нужна консультация?

Поможем спроектировать, развернуть и сопроводить облачную или гибридную инфраструктуру под задачи вашего бизнеса.

Ответим в течение часа в рабочее время
Заказать звонок

Оставьте свои данные для того, чтобы специалист с вами связался.

Заказать звонок

Оставьте свои данные для того, чтобы специалист с вами связался.