Pull to refresh

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

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

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

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

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

Эта методология создана компанией 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, но я думаю все знают, что это является плохой практикой и "говнокодом".

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

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.