Gernar
Frontend DeveloperCSS

Интервью-вопрос

Что такое BEM

BEM помогает именовать CSS-классы через блоки, элементы и модификаторы. На интервью важно показать не только схему имени. Покажите, как BEM снижает связность верстки и риск конфликтов стилей.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 50 правильно

Как лучше коротко объяснить BEM на интервью?

Вы хотите дать определение и сразу показать практический смысл.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

BEM расшифровывается как Block, Element, Modifier. Это не библиотека и не отдельный синтаксис CSS. Это договоренность о том, как называть классы и где проводить границы интерфейса.

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

На интервью не ограничивайтесь расшифровкой. Сразу добавьте практический вывод: BEM помогает писать CSS с низкой специфичностью и понятной связью между разметкой и стилями.

Как выглядит на практике

Пример обычной карточки товара:

<article class="product-card product-card--featured">
  <img class="product-card__image" src="/phone.jpg" alt="Смартфон" />
  <h2 class="product-card__title">Смартфон</h2>
  <p class="product-card__price">49 990 ₽</p>
  <button class="button button--primary">Купить</button>
</article>
.product-card {
  padding: 16px;
  border: 1px solid #ddd;
}

.product-card--featured {
  border-color: #4f46e5;
}

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

.button--primary {
  background: #4f46e5;
  color: white;
}

Здесь product-card работает как блок, product-card__title как элемент, а product-card--featured как модификатор. Кнопка сделана отдельным блоком button, потому что ее можно использовать не только внутри карточки.

Как выбрать блок, элемент или модификатор

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

Не делайте элементом все, что визуально вложено внутрь. В HTML компонент может лежать в карточке, но по смыслу оставаться отдельным блоком. На этом часто видно, понимаете ли вы BEM на практике.

Как принять решение по имени класса

1Эта часть интерфейса может жить отдельно?
Скорее всего, это блок: `card`, `button`, `search-form`.
2Эта часть нужна только внутри конкретного блока?
Это элемент: `card__title`, `search-form__input`.
3Нужно показать вариант, размер, тему или состояние?
Добавьте модификатор: `button--primary`, `card--featured`.
4Название описывает цвет или пиксели, а не смысл?
Лучше переименовать по роли. Не `button--red`, а `button--danger`, если это действие удаления.

Чем BEM помогает в CSS

BEM подталкивает писать плоские селекторы:

.menu__item {
  padding: 8px 12px;
}

.menu__item--active {
  font-weight: 600;
}

Это лучше, чем завязывать стиль на путь через всю разметку:

/* Плохо: стиль зависит от структуры страницы */
.layout .sidebar ul li a.active {
  font-weight: 600;
}

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

Где границы подхода

BEM не делает классы локальными. Если два файла объявят один и тот же глобальный класс, конфликт все равно возможен. Если общий reset или селектор по тегу подключен позже, он тоже может изменить внешний вид.

На интервью формулируйте точнее: BEM снижает риск конфликтов и помогает держать CSS предсказуемым, но не заменяет архитектуру стилей. Для реальной изоляции можно использовать CSS Modules, Shadow DOM, scoped styles или CSS-in-JS, если это подходит проекту.

Модификатор не заменяет поведение

Модификатор удобен для отображения состояния, но он не должен быть единственным источником поведения.

<!-- Плохо: выглядит disabled, но кнопка все еще кликабельна -->
<button class="button button--disabled">Отправить</button>

<!-- Лучше: есть и стиль, и семантика браузера -->
<button class="button button--disabled" disabled>Отправить</button>

Если оставить только класс, пользователь может повторно отправить форму, а скринридер не получит корректный сигнал о состоянии кнопки. В React это особенно важно при отправке формы. Пока идет запрос, храните состояние вроде isSubmitting, передавайте disabled={isSubmitting}, блокируйте повторный submit в обработчике и показывайте loading-состояние. Один класс button--disabled или button--loading только меняет вид и не защищает от лишнего запроса.

На интервью полезно сказать так: модификатор отражает состояние в CSS, но семантика и логика должны быть реализованы отдельно.

Как рефакторить существующую верстку

Если в проекте уже есть хаотичные классы и глубокие селекторы, не нужно переименовывать все сразу. Начните с компонентов, которые часто меняются или переиспользуются. Там BEM быстрее даст пользу: меньше регрессий, проще ревью, понятнее ответственность классов.

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

Практический вывод

Ваш короткий ответ может звучать так:

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

Если хотите усилить ответ, добавьте ограничение:

При этом BEM не изолирует CSS сам по себе. Нужно все равно следить за глобальными стилями, порядком подключения и тем, чтобы модификаторы не заменяли семантику HTML или логику приложения.

Частые ошибки

Где обычно ошибаются

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

  1. 1

    Путать блок и элемент

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

  2. 2

    Строить стили на глубокой вложенности

    Селектор вроде .page .sidebar .card .title привязан к структуре разметки. Перенесете карточку в другой контейнер, и стиль может пропасть. Переопределения тоже станут хрупкими. В BEM лучше дать элементу явный класс, например card__title.

  3. 3

    Делать модификаторы слишком мелкими

    Классы вроде button--red, button--bold и button--20px быстро превращают BEM в набор утилит без смысла. Это усложняет поддержку. При смене дизайна вам придется переименовывать классы. Лучше описывать роль или состояние: button--danger, button--large, button--disabled.

  4. 4

    Думать, что BEM изолирует CSS сам по себе

    BEM снижает вероятность конфликтов, но классы все равно остаются глобальными. Ошибка в порядке подключения файлов или общий селектор могут переопределить стиль. Если нужна настоящая локальная область видимости, используйте CSS Modules, scoped CSS, Shadow DOM или правила сборки.

  5. 5

    Смешивать состояние DOM и состояние приложения

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

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которые помогают показать практическое понимание BEM, каскада и структуры CSS.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

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

Содержание