← Назад к вопросам

Умеешь ли верстать по BEM

1.7 Middle🔥 231 комментариев
#JavaScript Core#Архитектура и паттерны

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Да, я владею методологией BEM на экспертном уровне

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

Суть методологии BEM и моя практика

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

Элемент (Element) — часть блока, которая не имеет смысла вне своего родителя. Следуя классическому синтаксису (двойное подчеркивание __), я строго привязываю элементы к блоку:

/* Блок "карточка" */
.card {}

/* Его элементы */
.card__title {}
.card__image {}
.card__description {}

В коде это создает абсолютно ясную иерархию, где по имени класса сразу понятно, к какому компоненту принадлежит элемент.

Модификатор (Modifier) — сущность, определяющая внешний вид, состояние или поведение блока/элемента. Я использую модификаторы через одиночное подчеркивание (_) или, в альтернативных синтаксисах, через дефис (--), для изменения сущности без создания нового:

/* Модификатор блока "карточка" — выделенная */
.card_highlighted {
  border-color: gold;
  box-shadow: 0 0 10px gold;
}

/* Модификатор элемента "кнопка" внутри карточки — неактивная */
.card__button_disabled {
  opacity: 0.5;
  pointer-events: none;
}

Ключевые преимущества, которые я извлекаю из BEM в реальных проектах

  • Максимальное снижение специфичности CSS: Имена классов в BEM, как правило, имеют вес в одно правило (например, .card__title), что позволяет избегать каскадных "войн" и глубокой вложенности. Это делает CSS предсказуемым и легким для отладки.

    /* Плохо: высокая специфичность, хрупкая структура */
    .sidebar .widget .list li a {}
    
    /* По BEM: низкая специфичность, независимый компонент */
    .menu__link {}
    
  • Полное отсутствие каскадных зависимостей: Блоки стилизуются исключительно по своему классу. Это означает, что я могу переместить компонент search-form из header в footer, и его внешний вид не изменится, так как он не зависит от контекста родителя.

  • Идеальная читаемость и самодокументируемость кода: Глядя на разметку, я и другие разработчики сразу понимаем структуру компонента без необходимости изучать CSS.

    <!-- Структура и отношения элементов очевидны -->
    <article class="product-card product-card_sale">
      <img class="product-card__image" src="..." alt="...">
      <h3 class="product-card__title">Название товара</h3>
      <div class="product-card__price">
        <span class="product-card__price-value">1000 ₽</span>
        <span class="product-card__price-old">2000 ₽</span>
      </div>
      <button class="product-card__button product-card__button_primary">Купить</button>
    </article>
    
  • Бесконфликтная командная разработка: Четкие правила именования позволяют нескольким разработчикам работать над одним проектом, не опасаясь случайно переопределить стили друг друга. Новый компонент просто добавляется со своим уникальным пространством имен.

  • Прямая совместимость с современными фреймворками: Методология BEM идеально ложится на архитектуру компонентов в React, Vue.js или Angular. Каждый компонент в таком фреймворке по сути и является независимым BEM-блоком.

Мой рабочий стек и адаптация BEM

На практике я часто комбинирую классический BEM с препроцессорами (например, SASS/SCSS), что делает написание стилей ещё более эффективным и наглядным за счет вложенности:

.product-card {
  border: 1px solid #eee;

  &_sale {
    border-color: red;
  }

  &__title {
    font-size: 1.2em;

    &_large {
      font-size: 1.5em;
    }
  }

  &__button {
    padding: 10px;

    &_primary {
      background-color: blue;
      color: white;
    }
  }
}

В крупных проектах я использую инструменты для автоматизации, такие как postcss-bem-linter, чтобы автоматически проверять соответствие кода методологии на этапе сборки.

Вывод: Для меня BEM — это фундаментальный инструмент, который обеспечивает долгосрочную поддержку кода, упрощает рефакторинг и масштабирование проекта. Это не догма, а проверенная практика, которая решает реальные проблемы поддержки больших CSS-кодовых баз в команде. Я не просто "умею верстать по BEM", я сознательно выбираю эту методологию как основу для построения надежного фронтенда.