БЭМ или не БЭМ?

Дата публикации: Декабрь 15, 2010 - 17:22:28, ср

Когда-то давно я прочитал статьи Витали Харисова на тему CSS верстки, а в частности его идеи БЭМ (Блок Элемент Модификатор) или Неискажающего блока. Честно говоря верстальщик из меня дай бог среднеуровневый, усвоить такую идеологию мне было очень тяжело. В частности потом меня к этому подтолкнул верстальщик на моей старой работе, после которого на новой вся верстка других верстальщиков мне показалась немного кашмарной.

В этом монологе я постараюсь понять, какая идеология верстки CSS больше подходит для повседневных задач.

Здесь снизу вверх можно прочитать про “БЭМ”. Далее я буду делать небольшие выноски с этого клуба.

Определение независимого блока:

Независимый блок (НБ или просто блок) это самодостаточный элемент страницы, который при перемещении в другое место на странице или на другую страницу не теряет своей самодостаточности.

Т. е. само определение уже говорит о том, что надо полностью отказаться от понятия наследования в CSS. Что ж, весьма удобная особенность верстки, от которой не хочется отказываться, хотя из-за этого порою бывают и проблемы.

Вот простой пример блока новостей:

  1. <div class="news">
  2.   <h3 class="title">Заголовок новости</h3>
  3.   <div class="body">
  4.   Текст новости
  5.   </div>
  6. </div>

Теперь придумаем CSS:

  1. .news { траляля1 }
  2. .news .title { траляля2 }
  3. .news .body { траляля3 }

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

  1. <div class="news">
  2.   <h3 class="title">Заголовок новости</h3>
  3.   <div class="body">
  4.   Текст новости
  5.   </div>
  6.   <div class="comments">
  7.     <div class="title">Заголовок комментария</div>
  8.     <div class="body">Текст комментария</div>
  9.   </div>
  10. </div>

Тут наше любимое наследование делает свое дело, а именно div .comments .title честно наследует свойства от .news .title. Придется задуматься над именами классов или же обнулить все свойства класса вышестоящего. Давайте теперь посмотрим пример на основе БЭМ:

  1. <div class="b-news">
  2.   <h3 class="b-news__title">Заголовок новости</h3>
  3.   <div class="b-news__body">
  4.   Текст новости
  5.   </div>
  6.   <div class="b-news-comments">
  7.     <div class="b-news-comments__title">Заголовок комментария</div>
  8.     <div class="b-news-comments__body">Текст комментария</div>
  9.   </div>
  10. </div>

Пересечений классов теперь быть не может принципиально, но вот имена классов в html-верстке слегка раздулись. Тут можно найти золотую середину и использовать например вместо .b-news-comments__title — .b-news-comments .title. Но опять же раз на раз не приходится, и мы снова в последствии можем столкнуться с пересечение имен классов.

Вообще нафиг этот независимый блок, если у нас есть дочерние классы, но в некоторых старых броузерах (IE6) это не будет работать, или будет работать криво (IE7).

В идеале по методу независимых блоков:

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

Еще я забыл рассказать про префиксы (.b-, .l-, .h- и пр.). Я думаю идея хорошая, хотя бы не будет проблем с поиском классов через автокомплит :). Это ни что иное, как нейм-спейсы, которые позволяют к примеру отделить обычные блоки (.b-) от разметки (.l-).

Пока все же я склоняюсь к БЭМ...

Теги: идеинг html css
Просмотров: 1073

Комментарии

Андрей Андреич
Декабрь 16, 2010 - 14:15:16, чт
В следующей статье не забудьте рассказать про префиксы подробнее и с примерами, а так же упереться в реальные браузеры, дабы выявить плюсы и минусы БЭМ и не БЭМ
Wet
Декабрь 16, 2010 - 14:18:14, чт
БЭМ - это просто метод кодирования верстки, он от броузеров никак не зависит.
Andriy
Декабрь 31, 2011 - 03:59:42, сб
"В частности, если блок относительно развесистый или многострочный, его нельзя делать простым" Это непонятная цитата. @Wet: одиночные селекторы БЭМ быстрее рендерятся и скриптуются (в основном из-за быстрого поиска в DOM-дереве) нежели вложенные, комбинированные и т.д.
Wet
Декабрь 31, 2011 - 22:44:06, сб
Andriy. Это цитата говорит о том, что не надо никогда (по крайней мере в 99% случаев) вешать селекторы на имена тегов. Живой тому пример, многие верстальщики вешают стили на имена тегов, а потом оказывается, что внутри блока может быть user-generated контент. В итоге может получится каша из контента (li выравнены по левому краю, ссыли не подчеркнуты и т. п.). И как раз таки селекторы по именам тегов рендерятся медленнее.

Что скажете?

Имя:
Код Код с картинки: