@AlexanderZe
Интересующийся

Имеет ли смысл отражать вложенность элементов в верстке по BEM?

При создании статичной page layout структуры по BEM, имеет ли смысл обозначать вложенность элементов непосредственно в верстке? Т.е. не будет ли избыточно формировать структурные классы по следующему принципу:
.l-page
    .l-page__header
        .l-page__header-logo
        .l-page__header-menu

Или правильнее придерживаться аскетичности и каждый элемент оставить индивидуальной единицей общего блока?

.l-page
    .l-page__header
        .l-page__logo
        .l-page__menu

При этом элемент Footer в перспективе будет идентичен элементу Header (footer > logo+menu)
  • Вопрос задан
  • 169 просмотров
Решения вопроса 1
@ilyarsoftware
Отражать вложенность элементов в названии класса это частая ошибка в понимании методологии.
Правильнее придерживаться "аскетичности", точнее сказать, именно об этом и говорится в официальной документации.

Префиксы в методологии не используется (см. историю развития), но и не противоречат ей, если они решают вашу задачу значит им место.

Блок кроме элементов может содержать блоки и ничего не знает о своем расположении и внешних отступах, но знает о своих размерах и о своем внутреннем мире.
Расположение блока определяет другой блок или элемент (для них это будет знание о своем внутренним мире).

Все выше сказанное можно выразить в раскладке примерно так:

.page // определяет свой внутренний мир и расположение своих элементов
    .page__header // определяем внутренние отступы
        .logo // ничего не знает о своем положении оно определяется в page__header
        .page__menu
            .menu // вполне самостоятельная переиспользуемая сущность
    .page__footer
        .logo_small // модификация знания про размер
        .menu_small // может иметь различные вариации (модификаторы)


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

Например элементы page__footer и page__header могут быть одним элементом page__section для которого реализованы модификации page__section_header и page__section_footer... хотя на этом возможности не заканчиваются, еще может быть так page__section_type_header и page__section_type_footer.

Эта методология всего лишь принципы, подобно SOLID, а не спецификация.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sim3x
@sim3x
Тут смешалось два момента
Префикс l- он для классов, которые управляют расположением блоков на странице layouts
В его имени желательно указывать, где он находится

А вот для блока (префикс b-) важно указать его назначение

Причем префиксы стоит указывать, если проект находится в стадии миграции на BEM и имеет стили не в нотации BEM

.l-page
    .l-page__header
        .company__logo
        .site__menu
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы