Методология BEM в CSS: краткое руководство

  • 22 января, 11:52
  • 4064
  • 0

BEM (Block-Element-Modifier) - компонентный подход к веб-разработке. В его основе лежит принцип разделения интерфейса на независимые блоки. Он позволяет легко и быстро разрабатывать интерфейсы любой сложности, называя классы CSS в следующей методологии:

/* Block component */
.card {}

/* Elements are dependent on their parent block */ 
.card__img {}

/* Modifiers are for incremental style changes */
.card--dark {} 
.card__img--large {}

  1. Блок: независимый компонент, который можно использовать повторно (например, с именем класса .nav)
  2. Элемент: дочерний элемент в блоке, который нельзя использовать отдельно от этого блока (например, с именем класса .nav__item)
  3. Модификатор: изменение стиля блока или модификатора (например, с именем класса .nav--dark)

Методология BEM в CSS: краткое руководство

Блоки

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

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

<!-- INCORRECT -->


<div class="large-red-box">
 <img src="...">
 <h2>...</h2>
 <p>...</p>
 <a>...</a>
</div>

<style>
 .large-red-box {}
</style>

<!-- CORRECT -->


<div class="card">
 <img src="...">
 <h2>...</h2>
 <p>...</p>
 <a>...</a>
</div>

<style>
 .card {}
</style>

Элементы

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

Они также имеют уникальное соглашение об именах классов CSS, которое работает следующим образом:

.block__element

Например, при использовании .card компонента, элемент внутри (например, изображение) будет иметь имя класса, например .card__img.

К имени элемента всегда добавляется имя блока, разделенное двойным подчеркиванием __.

<!-- INCORRECT -->


<div class="card">
 <img src="...">
 <h2>...</h2>
 <p>...</p>
 <a>...</a>
</div>

<style>
 .card {}
 .card img {}
 .card h2 {}
 .card p {}
 .card a {}
</style>

<!-- CORRECT -->

<div class="card">
 <img class="card__img" src="...">
 <h2 class="card__title" >...</h2>
 <p class="card__description" >...</p>
 <a class="card__button">...</a>
</div>

<style>
 .card {}
 .card__img {}
 .card__title {}
 .card__description {}
</style>

Важно отметить, что второй фрагмент кода избегает использования более 1 селектора для выбора стилей (например, например .card img {}).

Рекомендуется использовать класс элементов BEM и использовать его непосредственно (например .card__img {}) - это снижает вероятность возникновения каскадных проблем в будущем.

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

Когда у вас есть разные стили в блоках (или элементах), там появляются модификаторы. Это сущность, определяющая внешний вид, состояние или поведение блока либо элемента. 

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

Модификаторы имеют уникальное соглашение по именованию CSS, которое работает следующим образом:

block--modifier или block__element--modifier.

Модификаторы BEM могут применяться как к блокам, так и к элементам.

<!-- INCORRECT -->

<div class="card--dark">
 <img src="...">
 <h2 class="card__title--large">...</h2>
 <p>...</p>
 <a>...</a>
</div>

<style>
 .card--dark {}
 .card__title--large {}
</style>

Считается плохой практикой использовать класс-модификатор изолированно (т.е. без класса блока или элемента). Потому, что модификатор предназначен для добавления постепенных изменений стиля в блок.

Поэтому всякий раз, когда используется модификатор, убедитесь, что он используется с базовым классом:

<!-- CORRECT -->


<div class="card card--dark">
 <img src="...">
 <h2 class="card__title card__title--large">...</h2>
 <p>...</p>
 <a>...</a>
</div>

<style>
 .card {}
 .card--dark {}
 .card__title {}
 .card__title--large {}
</style>

Это основные принципы, которые помогут вам начать работать с BEM.

Источник перевода


0 комментариев
Сортировка:
Добавить комментарий