Меню
Обсудить ваш проект

Именование в БЭМ

Привет! В этой статье мы поговорим о методологии, которая родилась в компании Яндекс, её именуют БЭМ.

Что такое БЭМ ?

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

Именование в БЭМ представляет собой определенный метод именования классов, этот метод позволяет:

  • Упростить код и его отладку
  • Повторно использовать код избегая «Copy-Paste»
  • Быстро понять связь между компонентами в разметке и CSS
  • Ускорить написание css при использовании css-препроцессоров

Если изобразить класс со всеми тремя сущностями, то он будет выглядеть так: block__element-modifier

Теперь о каждом по подробнее.

Блок

Блок — это самодостаточный независимый компонент страницы, который может быть повторно использован. Вся страница строится из блоков. Блоки могут содержать другие блоки. Классы блоков выглядят обычно и ничем не отличаются от любых других классов: header, navigate, works

<!-- Блок Header -->
<header class="header"></header>

<!-- Блок Nav -->
<nav class="nav"></nav>

Елемент

Cоставная часть блока, не может быть использована отдельно от блока. Например, пункт меню не может использоваться вне блока меню, он является его элементом. Класс элемента пишется так: block __ element

<!-- Хорошо -->

    <!-- Блок Header -->
    <header class="header">

        <!-- Элемент logo -->
        <img class="header__logo" alt="">

    </header>


<!-- Плохо: Элемент logo находится вне своего блока-родителя-->

    <!-- Блок Header -->
    <header class="header"></header>

    <!-- Элемент logo -->
    <img class="header__logo" alt="">

Модификатор

Модификатор определяет вид, состояние или поведение блока или элемента. Модификаторы не определяют основные стили блока или элемента, они лишь модифицируют (изменяют) его. Класс модификатора пишется так: block__element-modifier. В примере ниже мы изменили внешний вид активного и неактивного пункта меню с помощью модификаторов.

<!-- Блок Nav -->
<nav class="nav">
<ul class="nav__list">

    <!-- Хорошо -->
    <li class="nav__item nav__item--active"></li>
    <li class="nav__item"></li>


    <!-- Плохо: модификатор применен без основного класса -->
    <li class="nav__item--active"></li>
</ul>
</nav>

Таким образом мы напишем стили для этого html.

nav {

    &__item{
        font-size: 15px;
        color: #555;

        &--active{
            color: red;
            border-bottom: 1px solid;
        }
    }

}

Теперь перейдем к примерам. Мне вспоминается время когда я только-только начинал изучать html и css, делал первые макеты и уже в самом начале возникали неудобства при именовании классов. Например, представим структуру блока статей:

<!-- Блок Posts -->
<section class="posts">
    <article class="post">
        <h2 class="post-title">Post Title</h2>
        
        <div class="post-author">
            <h3 class="post-author-name">Name</h3>
            
            <div class="post-author-another-info">
              <div class="post-author-tabs">
                <div class="post-author-tabs-arrows"></div>
              </div>
            </div><!-- end info -->
        </div><!-- end author -->
    </article>
</section>

Ладно ладно, я намеренно начал усложнять этот пример и добавлять бессмысленные классы. Вы понимаете проблему? Чем глубже наша верстка, тем сложнее ей управлять, сложнее управлять её классами. Появляются селекторы из 4 слов, а это очень плохо. Я начал всерьез задумываться об этом, когда мой селектор дошел до 5 слов.

Множество начинающих верстальщиков поступают похожим образом. Такое именование классов очень сильно влияет на проект в целом. Вам сложно будет разобраться, если вы на какое-то время отойдете от разработки проекта. Про адаптацию новых разработчиков к таким портянкам я пожалуй говорить не буду 🙂

Рассмотрим ту же структуру, но с применением именования БЭМ:

<!-- Блок Posts -->
<section class="posts">
    <article class="posts__item post">
        <h2 class="post__title">Post Title</h2>
        
        <div class="post__author post-author">
            <h3 class="post-author__name">Name</h3>
            
            <div class="post-author__another-info">
               <div class="post-author__tabs">
                  <div class="post-author__tabs-arrows"> </div>
               </div>
            </div><!-- end info-->
        </div><!-- end author -->
    </article>
</section>

Так стало гораздо лучше! В этом примере с десяток строк вы может и не увидите видимого удобства, но когда проект будет расти, поверьте, это сэкономит вам кучу времени и нервов.

И да, вы наверное увидели «posts__item post» и подумали «это что, элемент или блок?» — это и элемент и блок, и да, так можно 🙂 Ведь post является элементом блока, но в тоже время в нем могут быть тоже элементы, например заголовок или ссылки на профиль. Такой прием позволяет нам сделать нашу html разметку более гибкой.

CSS совместно с БЭМ

Если мы именуем классы взяв на вооружение БЭМ, это упрощает понимание и ускорение написания css кода:

// c использованием scss-препроцессора
.post{
    &__title{}
    &__author{}
    &__link{}
    &__button{}
}

Во-первых, нам не нужно каждый раз писать слово «post», мы можем просто поставить знак амперсанда и при компиляции нашего scss он заменится на «post», во-вторых такой код (даже без использования css-препроцессоров) нагляднее показывает нам вложенность элементов html, мы уже из css кода можем понять разметку!

Наш css код на выходе:

.post{}
.post__title{}
.post__author{}
.post__link{}
.post__button{}
Поделиться
Отправить

Комментарии