Урок 13

День 13 | BEM — методология именования классов

20 мин

Проблема: хаос в CSS

Когда проект растёт, CSS превращается в кашу:

.header { }
.header-logo { }
.headerNav { }
.header_button { }
.btn-header { }

BEM решает эту проблему.

Что такое BEM?

BEM (Block Element Modifier) — методология именования CSS-классов от Яндекса. Стандарт индустрии.

  • Block (Блок) — самостоятельный компонент
  • Element (Элемент) — часть блока
  • Modifier (Модификатор) — вариация

Синтаксис BEM

/* Блок */
.block { }

/* Элемент блока (двойное подчёркивание) */
.block__element { }

/* Модификатор (двойное тире) */
.block--modifier { }

/* Модификатор элемента */
.block__element--modifier { }
Запомните:
__ — отделяет элемент от блока
-- — отделяет модификатор

Блок (Block)

Самостоятельный компонент: .header, .menu, .card, .button

Элемент (Element)

<article class="card">
    <img class="card__image">
    <h3 class="card__title">Заголовок</h3>
    <p class="card__text">Текст</p>
</article>
Важно: Нет вложенных элементов!
.card__header__title
.card__title

Модификатор (Modifier)

<button class="button">Обычная</button>
<button class="button button--primary">Основная</button>
<button class="button button--large">Большая</button>
.button { padding: 10px 20px; }
.button--primary { background: #F36049; color: white; }
.button--large { padding: 15px 30px; font-size: 18px; }
Модификатор всегда с базовым классом:
class="button--primary"
class="button button--primary"

BEM в SCSS

.card {
    &__title { }      // .card__title
    &__text { }       // .card__text
    &--featured { }   // .card--featured
}

Полный пример

<article class="product-card">
    <img class="product-card__image">
    <h3 class="product-card__title">Товар</h3>
    <span class="product-card__price product-card__price--old">50 000 ₽</span>
    <span class="product-card__price product-card__price--current">40 000 ₽</span>
    <button class="product-card__button button button--primary">В корзину</button>
</article>

Чек-лист BEM

ПравилоПример
Блок — существительное в kebab-case.search-form
Элемент через __.search-form__input
Модификатор через --.search-form--compact
Нет вложенных элементов.form__input, не .form__group__input
Модификатор + базовый классclass="btn btn--primary"
Теперь вы знаете BEM!
✅ Блок — самостоятельный компонент
✅ Элемент — часть блока (через __)
✅ Модификатор — вариация (через --)

Мы используем файлы cookie для улучшения работы сайта и персонализации контента. Продолжая использовать сайт, вы соглашаетесь с использованием cookies в соответствии с нашей Политикой конфиденциальности.