Валидатор БЭМ: как проверить именование и вложенность классов в HTML

БЭМ помогает держать CSS в порядке, но только если классы названы по правилам. Один menu__item__link — и структура ломается: элемент не может быть частью другого элемента. Модификатор без основного класса — и стили не применяются. Опечатка в разделителе — и класс не работает. Валидатор БЭМ проверяет, правильно ли названы и вложены блоки, элементы и модификаторы, находит типовые ошибки и показывает структуру блоков. Поддерживаются классическая схема и схема «два дефиса», а всё выполняется в браузере.

В этой статье разберём, какие ошибки находит валидатор, почему «элемент элемента» — ошибка, что такое микс и как указать служебные классы, которые не нужно проверять.

Интерфейс онлайн-инструмента Валидатор БЭМ
Интерфейс онлайн-инструмента Валидатор БЭМ

Что умеет валидатор

Валидатор БЭМ принимает HTML-разметку и проверяет классы по методологии БЭМ.

Параметр Что делает
HTML-разметка Фрагмент или страница целиком
Схема именования Классическая: блок__элемент_модификатор_значение или «два дефиса»: блок__элемент--модификатор--значение
Префиксы служебных классов Классы, которые не нужно проверять: js-, is-, has- и другие
Проверить Запускает проверку

Скрипты не выполняются, ресурсы не загружаются — проверяется только разметка и классы.

Всё выполняется в браузере: введённые данные никуда не отправляются.

Какие ошибки находит валидатор

Инструмент ищет типовые нарушения БЭМ.

Ошибка Пример Почему это ошибка
Элемент вне своего блока header__note без родителя header Элемент должен быть внутри своего блока
«Элемент элемента» menu__item__link Элемент — часть блока, а не другого элемента
Модификатор без основного класса button_primary без button Модификатор дополняет блок, но не заменяет его
Конфликтующие значения модификаторов menu_size_s menu_size_m Один модификатор не может иметь два значения одновременно
Опечатки в разделителях menu-item вместо menu__item Разделители несут смысл: __ для элемента, _ или -- для модификатора

Кроме ошибок, валидатор показывает структуру блоков — удобно, чтобы увидеть, какие элементы к какому блоку относятся.

Почему «элемент элемента» — ошибка

Это самое частое непонимание. В БЭМ элемент — часть блока, а не другого элемента.

Неправильно Правильно Почему
menu__item__link menu__link Вложенность задаёт разметка, а не имя класса
card__header__title card__title Элемент не может быть вложен в элемент по имени
block__elem__sub block__sub То же правило

Вложенность в БЭМ определяется разметкой, а не именем класса. Если ссылка находится внутри элемента menu__item, это не значит, что её класс должен быть menu__item__link. Достаточно menu__link — он всё равно элемент блока menu.

Микс: блок и элемент на одном узле

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

Пример Что означает
header__logo logo Элемент шапки и самостоятельный блок logo
menu__item button Элемент меню и самостоятельный блок button

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

Классическая схема и «два дефиса»

В проектах приняты разные схемы именования. Валидатор поддерживает две.

Схема Пример
Классическая блок__элемент_модификатор_значение
Два дефиса блок__элемент--модификатор--значение

Классическая схема использует одно подчёркивание для модификатора и значения. Схема «два дефиса» — двойной дефис. Выберите ту, что принята в проекте, — иначе валидатор будет ругаться на правильные классы.

Служебные классы и префиксы

Не все классы в HTML — сущности БЭМ. Некоторые служебные: js- для JavaScript-хуков, is- и has- для состояний, u- для утилит.

Валидатор позволяет указать префиксы служебных классов, которые проверять не нужно. Например: js-, is-, has-, u-.

Префикс Назначение
js- Хуки для JavaScript, не для стилей
is- Состояния: is-active, is-open
has- Состояния наличия: has-error
u- Утилитарные классы

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

Зачем проверять БЭМ

Задача Что даёт валидатор
Рефакторинг Найти ошибки в существующей разметке
Код-ревью Проверить, что новые классы соответствуют методологии
Обучение Увидеть, какие конструкции нарушают БЭМ
Структура Понять, какие элементы к какому блоку относятся
Единообразие Держать именование в проекте consistent
Миграция Проверить разметку при переходе на БЭМ

Ограничения валидатора

  • Только классы в HTML. Стили и их качество не проверяются.
  • Не заменяет HTML-валидатор. Ошибки разметки — отдельная задача.
  • Схема должна совпадать с проектом. Если схема выбрана неверно, правильные классы будут считаться ошибками.
  • Служебные классы нужно указать. Иначе они попадут в ошибки.

Как пользоваться: пошагово

  1. Вставьте HTML-разметку.
  2. Выберите схему именования, которая принята в проекте.
  3. Укажите префиксы служебных классов, которые проверять не нужно, и нажмите «Проверить».

Типичные ошибки

  • Писать «элемент элемента». menu__item__link — ошибка. Правильно — menu__link: вложенность задаёт разметка.
  • Оставлять модификатор без основного класса. button_primary без button не сработает: модификатор дополняет блок, а не заменяет его.
  • Смешивать два значения одного модификатора. menu_size_s menu_size_m — конфликт. Один модификатор — одно значение.
  • Путать разделители. __ — для элемента, _ или -- — для модификатора. Опечатка ломает класс.
  • Забывать про служебные классы. js-, is-, has- — не БЭМ. Укажите их в префиксах, иначе валидатор будет ругаться.
  • Выбирать не ту схему. Если проект использует «два дефиса», а выбрана классическая, правильные классы будут ошибками.

Вопросы и ответы

Почему элемент элемента — ошибка?

В БЭМ элемент — часть блока, а не другого элемента. Вместо menu__item__link пишут menu__link: вложенность задаёт разметка, а не имя класса.

Можно ли смешивать блок и элемент на одном узле?

Да, это называется миксом: например, header__logo logo — элемент шапки и самостоятельный блок logo. Предупреждение выдаётся только когда на узле элемент и его же собственный блок.

Проверяет ли валидатор CSS?

Нет, только классы в HTML. Для стилей есть отдельный CSS-валидатор.

Чем классическая схема отличается от «двух дефисов»?

Классическая использует _ для модификатора и значения, «два дефиса» — --. Выберите ту, что принята в проекте.

Что такое служебные классы?

Классы не из БЭМ: js- для скриптов, is- и has- для состояний, u- для утилит. Их можно исключить из проверки по префиксу.

Показывает ли валидатор структуру блоков?

Да, кроме ошибок он показывает структуру: какие элементы к какому блоку относятся.

Итог

Валидатор БЭМ — инструмент для проверки классов HTML по методологии БЭМ. Он находит элементы вне блоков, «элементы элементов», модификаторы без основного класса, конфликты значений и опечатки в разделителях, поддерживает классическую схему и «два дефиса», а также позволяет исключить служебные классы по префиксу. Всё выполняется в браузере. Выбирайте схему проекта, указывайте служебные префиксы и исправляйте найденные ошибки — и разметка будет соответствовать БЭМ, а стили — предсказуемыми.*

Предыдущая запись

Тестер регулярных выражений: как проверить regex на тексте и не повесить страницу

Онлайн-тестер регулярных выражений JavaScript: подсветка совпадений при вводе, позиции, нумерованные и именованные группы, проверка замены со ссылками на группы. Выражение выполняется в отдельном потоке с ограничением времени. Текст никуда не отправляется.
Далее