Methodology БЭМ

Created time
Dec 13, 2022 10:51 AM
Summary
Some bullshit about block-based modeling
Progress
Done
Category
Programming
Source
Web
БЭМ (Блок, Элемент, Модификатор) — компонентный подход к веб-разработке.
В его основе лежит принцип разделения интерфейса на независимые блоки. Он позволяет легко и быстро разрабатывать интерфейсы любой сложности и повторно использовать существующий код, избегая «Copy-Paste».

Блок

Функционально независимый компонент страницы, который может быть повторно использован. В HTML блоки представлены атрибутом class
<!-- Верно. Семантически осмысленный блок `error` --> <div class="error"></div> <!-- Неверно. Описывается внешний вид --> <div class="red-text"></div>

Принцип работы с блоками

Вложенность

<!-- Блок `header` --> <header class="header"> <!-- Вложенный блок `logo` --> <div class="logo"></div> <!-- Вложенный блок `search-form` --> <form class="search-form"></form> </header>

Элемент

Составная часть блока, которая не может использоваться в отрыве от него.
<!-- Блок `search-form` --> <form class="search-form"> <!-- Элемент `input` блока `search-form` --> <input class="search-form__input"> <!-- Элемент `button` блока `search-form` --> <button class="search-form__button">Найти</button> </form>

Принципы работы с элементами

Вложенность

  • Элементы можно вкладывать друг в друга.
  • Допустима любая вложенность элементов.
  • Элемент — всегда часть блока, а не другого элемента. Это означает, что в названии элементов нельзя прописывать иерархию вида block__elem1__elem2.
<!-- Верно. Структура полного имени элементов соответствует схеме: `имя-блока__имя-элемента` --> <form class="search-form"> <div class="search-form__content"> <input class="search-form__input"> <button class="search-form__button">Найти</button> </div> </form> <!-- Неверно. Структура полного имени элементов не соответствует схеме: `имя-блока__имя-элемента` --> <form class="search-form"> <div class="search-form__content"> <!-- Рекомендуется: `search-form__input` или `search-form__content-input` --> <input class="search-form__content__input"> <!-- Рекомендуется: `search-form__button` или `search-form__content-button` --> <button class="search-form__content__button">Найти</button> </div> </form>

Принадлежность

Элемент — всегда часть блока и не должен использоваться отдельно от него.
<!-- Верно. Элементы лежат внутри блока `search-form` --> <!-- Блок `search-form` --> <form class="search-form"> <!-- Элемент `input` блока `search-form` --> <input class="search-form__input"> <!-- Элемент `button` блока `search-form` --> <button class="search-form__button">Найти</button> </form> <!-- Неверно. Элементы лежат вне контекста блока `search-form` --> <!-- Блок `search-form` --> <form class="search-form"> </form> <!-- Элемент `input` блока `search-form` --> <input class="search-form__input"> <!-- Элемент `button` блока `search-form` --> <button class="search-form__button">Найти</button>

Необязательность

<!-- Блок `search-form` --> <div class="search-form"> <!-- Блок `input` --> <input class="input"> <!-- Блок `button` --> <button class="button">Найти</button> </div>

Когда создавать блок, когда — элемент?

Создавайте блок

Если фрагмент кода может использоваться повторно и не зависит от реализации других компонентов страницы.

Создавайте элемент

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

Модификатор

Cущность, определяющая внешний вид, состояние или поведение блока либо элемента.
Особенности:
  • Имя модификатора отделяется от имени блока или элемента одним подчеркиванием (_).

Типы модификаторов

Булевый

<!-- Блок `search-form` имеет булевый модификатор `focused` --> <form class="search-form search-form_focused"> <input class="search-form__input"> <!-- Элемент `button` имеет булевый модификатор `disabled` --> <button class="search-form__button search-form__button_disabled">Найти</button> </form>

Ключ-значение

<!-- Блок `search-form` имеет модификатор `theme` со значением `islands` --> <form class="search-form search-form_theme_islands"> <input class="search-form__input"> <!-- Элемент `button` имеет модификатор `size` со значением `m` --> <button class="search-form__button search-form__button_size_m">Найти</button> </form> <!-- Невозможно одновременно использовать два одинаковых модификатора с разными значениями --> <form class="search-form search-form_theme_islands search-form_theme_lite"> <input class="search-form__input"> <button class="search-form__button search-form__button_size_s search-form__button_size_m"> Найти </button> </form>

Принципы работы с модификаторами

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

<!-- Верно. Блок `search-form` имеет модификатор `theme` со значением `islands`--> <form class="search-form search-form_theme_islands"> <input class="search-form__input"> <button class="search-form__button">Найти</button> </form> <!-- Неверно. Отсутствует модифицируемый класс `search-form` --> <form class="search-form_theme_islands"> <input class="search-form__input"> <button class="search-form__button">Найти</button> </form>

Микс

<!-- Блок `header` --> <div class="header"> <!-- К блоку `search-form` примиксован элемент `search-form` блока `header`--> <div class="search-form header__search-form"></div> </div>

Файловая структура

  • Один блок — одна директория.
  • Имена блока и его директории совпадают. Например, блок header — директория header/, блок menu — директория menu/.
  • Реализация блока разделяется на отдельные файлы-технологии. Например, header.css, header.js.
  • Директория блока является корневой для поддиректорий соответствующих ему элементов и модификаторов.
  • Имена директорий элементов начинаются с двойного подчеркивания (__). Например, header/__logo/, menu/__item/.
  • Имена директорий модификаторов начинаются с одинарного подчеркивания (_). Например, header/_fixed/, menu/_theme_islands/.
  • Реализации элементов и модификаторов разделяются на отдельные файлы-технологии. Например, header__input.js, header_theme_islands.css.
search-form/ # Директория блока search-form __input/ # Поддиректория элемента search-form__input search-form__input.css # Реализация элемента search-form__input # в технологии CSS search-form__input.js # Реализация элемента search-form__input # в технологии JavaScript __button/ # Поддиректория элемента search-form__button search-form__button.css search-form__button.js _theme/ # Поддиректория модификатора # search-form_theme search-form_theme_islands.css # Реализация блока search-form, имеющего # модификатор theme со значением islands # в технологии CSS search-form_theme_lite.css # Реализация блока search-form, имеющего # модификатор theme со значением lite # в технологии CSS search-form.css # Реализация блока search-form # в технологии CSS search-form.js # Реализация блока search-form # в технологии JavaScript