HTML по БЭМ

Использование HTML-оберток

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

Расположение блока относительно других блоков

Чтобы позиционировать один блок относительно другого блока, используется микс .

В примере блоки header и footer позиционируются на странице с помощью микса с элементами блока page, которым заданы нужные стили. Элементы page__header и page__footer опциональные и применяются к блоку page, если необходимо разместить шапку (header) или подвал (footer) на странице. Блоки page, header и footer остаются независимыми, так как не содержат стили про взаимное позиционирование.

Расположение HTML-элементов внутри блока

Чтобы позиционировать HTML-элементы внутри блока, используется дополнительный элемент этого блока (например, button__inner). Элемент button__inner содержит стили про позиционирование внутри блока button и заменяет абстрактную обертку.

В примере иконка (блок icon) позиционируется внутри универсальной кнопки с помощью стилей элемента button__inner

Вложенность элементов

Правила именования запрещают отражать иерархию в названии элемента (block__elem1__elem2). Но в HTML элементы можно вкладывать друг в друга. Допустима любая вложенность элементов.

В примере ниже пункты меню представлены ссылками. Такая структура блока реализуется за счет вложенности элементов:

Примеры

Блок

Название блока характеризует смысл («что это?» — «меню»: menu, «кнопка»: button), а не состояние («какой, как выглядит?» — «красный»: red, «большой»: big).

имяблока (menu)
имя-блока (search-form)

Вложенность блоков

Элемент

Название элемента характеризует смысл («что это?» — «пункт»: item, «текст»: text), а не состояние («какой, как выглядит?» — «красный»: red, «большой»: big).

имя-блока__имя-элемента (menu__item)

Вложенность элементов

Модификаторы

Название модификатора характеризует внешний вид («какой размер?», «какая тема?» и т. п. — «размер»: size_s, «тема»: theme_islands), состояние («чем отличается от прочих?» — «отключен»: disabled, «фокусированный»: focused) и поведение («как ведет себя?», «как взаимодействует с пользователем?» — «направление»: directions_left-top).

имя-блока_имя-модификатора;
имя-блока__имя-элемента_имя-модификатора.

Микс

Миксы позволяют:

• совмещать поведение и стили нескольких сущностей без дублирования кода;

• создавать семантически новые компоненты интерфейса на основе имеющихся.

Организация хранения кода