Как стать автором
Обновить

Методология БЭМ

БЭМ - блок элемент модификатор.

Блок — это независимый интерфейсный компонент.

Элемент — это составная часть блока.

Модификатор — это свойство блока или элемента, задающее изменения в их внешнем виде или поведении.

Эта методология создана компанией Yandex в 2005 году. И как бы, вы можете у меня спросить:"Ведь методологий же много, почему именно БЭМ". И правда, методологий верстки и даже методологий стилизации очень много. Например: БЭМ, AMCSS, OOCSS, Atomic CSS, OPOR, MCSS, SMACSS, FUN, DoCSSa и это всего лишь часть. Лично я предпочитаю БЭМ, потому что на реальных проектах скорее всего будет использоваться именно она и эта методология очень удобная. Причем если использовать эту методологию вместе с препроцессорами css (например, scss), то будет очень удобно. Дальше объясню почему.

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

  1. html

  2. css

Что-то уж очень много теоретики пошло, начнем изучение.

Для примера и дабы пост не был удален из-за авторских прав, я буду использовать доступный в интернете шаблон(в конце поста будет ссылка на его скачивание)

Давайте для начала разберем проект и посмортим на него. Сначала надо подметить повторяющиеся элементы.

Например, сразу в глаза попадает повторяющиеся строки состояния:

Например на этой фотографии мы видим как идут четыре блока подряд.

Давайте рассмотрим один блок, на основе которого будем делать остальные:

Значит так, в этом блоке есть:

  1. Фотография

  2. Название

  3. Описание

Начнем строить html код. Для начала назову этот блок prof-skills.

<div class="prof-skills"></div>

Кстати, надо отметить, что блоки можно называть двумя способами:

  1. Название блока. Например: skills

  2. Название блока несколькими словами. Я думаю более опытные люди знают, что в верстке сложно обойтись просто указывая название элемента одним словом. Это может привести к путанице в классах в будущем. Поэтому мы можем использовать для указания несколько слов. Например: prof-skills. Но при этом ЗАПРЕЩЕНО указывать имена блоков с нижним знаком подчеркивания. То есть написать "prof__skills" запрещено(дальше будет ясно почему)

Итак, что мы имеем на данном этапе. У нас по сути только блок. Давайте же добавим элементы к нему. Как мы помним, у нас было 3 элемента в этом блоке

<!-- блок -->
<div class="prof-skills">
    <!-- элементы -->
    <div class="prof-skills__img"></div>
    <div class="prof-skills__title"></div>
    <div class="prof-skills__desc"></div>
</div>

Это и есть один из этих 4-х блоков. Давайте немного поясню, чтобы все стало куда понятнее.

Как и было ранее, у нас остался блок. Только к нему я добавил еще 3 тегов div, которым дал класс, который начинается с названия блока и заканчивается названием элемента. Название блока и название элемента отделяются двумя нижними подчеркиваниями.

При этом, если вам надо задать элементу название из нескольких слов, то можно использовать дефис между словами.

Например:

<!-- элемент -->
<div class="prof-skills__my-skills-img"></div>

тут нижнее подчеркивание отделяет опять же имя блока и имя элемента.

При этом и тут ограничений многовато.

Например, элемент одного блока мы не можем использоать в другом блоке.

<!-- блок -->
<div class="prof-skills">
    <!-- элементы -->
    <div class="prof-skills__my-skills-img"></div>
    
    <!-- Нельзя сделать так, так как этот элемент пренадлежит блоку about -->
    <div class="about__title"></div>

    <div class="prof-skills__desc"></div>
</div>

Также нельзя использовать элемент блока вне самого блока. Например такая запись запрещена, так как элемент блока "prof-skills" находится вне своего блока.

<!-- блок -->
<div class="prof-skills">
    <!-- элементы -->
    <div class="prof-skills__my-skills-img"></div>
    <div class="prof-skills__title"></div>
    <div class="prof-skills__desc"></div>
</div>

<!-- такая запись запрещена -->
<div class="prof-skills__title"></div>

Также разрешено делать вложенные элементы, но нельзя наследовать их от родительских. Сейчас станет понятнее.

<!-- запрещено -->
<!-- блок -->
<div class="prof-skills">
    <!-- элементы -->
    <div class="prof-skills__my-skills-img">
        <div class="prof-skills__my-skills-img__user-img"></div>
    </div>
    <div class="prof-skills__title"></div>
    <div class="prof-skills__desc"></div>
</div>


<!-- разрешено -->
<!-- блок -->
<div class="prof-skills">
    <!-- элементы -->
    <div class="prof-skills__my-skills-img">
        <div class="prof-skills__user-img"></div>
    </div>
    <div class="prof-skills__title"></div>
    <div class="prof-skills__desc"></div>
</div>

В первом примере я сделал наследственность от родительского класса(так делать нельзя), во втором же я добавил элемент непосредственно к классу "prof-skills". Причем + в том, что такая вложенность может быть любого уровня.

Чтож, тактично перейдем к модификаторам. Простыми словами модификаторы нужны, чтобы указать какую-то активность. Например у вас происходит что-то при нажатии на кнопку и так далее. Получается, что вы добавляете какое-то активное действие. Модификаторы пишутся так: имя-блока__имя-элемента_имя-модификатора. Самые внимательные уже заметили, что перед именем модификатора стоит один знак нижнего подчеркивания. Все так и должно быть.

Пример:

<!-- блок -->
<div class="header">
    <!-- элементы -->
    <a href="#" class="header__item header__item_active">Home</a>
    <a href="#" class="header__item">About us</a>
    <a href="#" class="header__item">Contact</a>
</div>

Здесь я тегу а, в котором содержится текст "Home", дал модификатор "active". Как можно увидеть из фотографии, тут именно модификатор "header__item_active" дал такое свойство HOME.

Впринципе это все про модификаторы.

Еще есть вещь, которую называют миксами. И это очень удобно!!

Сейчас все расскажу и разложу по полочкам.

Миксы сами по себе нужны для того, чтобы можно было заимствовать свойства у блока, но при этом оставить блок независимым. Сейчас все станет ясно.

<!-- блок -->
<div class="prof-skills">
    <!-- элементы -->
    <div class="prof-skills__my-skills-img"></div>
    <div class="prof-skills__title title"></div>
    <div class="prof-skills__desc"></div>
</div>

В этом коде я в элемент "prof-skills__title" добавил блок title. То есть тут prof-skills__title заимствует все стили у title, но при этом можно менять их. То есть мы можем добавить стили в prof-skills__title и не мешать при этом стилям title. Это удобно, потому что так меньше шанс сломать верстку (имеется ввиду, что у вас в одном месте подходит по стилям, а в другом нет). Безусловно можно использовать атрибут style, но я думаю все знают, что это является плохой практикой и "говнокодом".

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

А в остальном, желаю вам всего доброго и успеха в вашем стремлении :-)

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.