Пишем БЭМ правильно

Igor Zenich, iDeus.

Пишем БЭМ правильно

iDeus

Зачем ещё один доклад про BEM?!

BEM - семантичный!

Что он несёт?!.

Pepelsbey

Ошибки

BEM CSS

CSS подмножество BEM

Full stack BEM

Full stack BEM?

Когда он будет вам нужен — вы это сами поймёте. Это будет момент, когда вам надоесть писать html руками и вы захотите его генерировать.

2007 год

Виталий
Харисов

Виталий Харисов
Ya.ru

@mursya меня бы убила

Непонятость BEM

Но как писать код вручную?

Как назначаются стили для типографики? Не будешь же назначать каждому тегу какой-то класс?

Artur Kornakov, @fliptheweb

Я не буду говорить о bem-tools

Не буду говорить о

Frontender

Суть #b_

.block

Главное - понятие независимого блока

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

BEM.Клуб на Я.рушке, Независимый блок

Формальное определение

Правила независимости блока:
  1. для описания элемента используется class, но не id
  2. каждый блок имеет префикс
  3. в таблице стилей нет классов вне блоков
BEM.Клуб на Я.рушке, История создания BEM (часть первая)

.block__element

Я тоже раньше так писал

      .form-buy-results__to-city__slider__tab__column_buy
    

Так делать нельзя

Так #b_ поняли и используют зарубежом

Прекратите писать block__el__el__el

Как надо?

<div class='block'>
    <div class='block__elem1'>
        <div class='block__elem2'></div>
    </div>
    <div class='block__elem3'></div>
</div>
    

А в CSS

.block {}
.block__elem1 {}
.block__elem2 {}
.block__elem3 {}
    

Элемент у элемента?

Если вам нужно сделать элемент у элемента, значит вам нужно:

Есть два варианта как это переписать

<div class='block'>
    <div class='block__elem1'>
        <div class='block__elem1__elem2'></div>
    </div>
</div>
    

1. Бить на блоки!

Делать новый блок

<div class='block1'>
    <div class='block2'>
        <div class='block2__elem'></div>
    </div>
</div>
    

2. Рубить ветки!

Делать BEM-дерево с 1-ой вложенностью элементов

<div class='block1'>
    <div class='block1__elem1'>
        <div class='block1__elem2'></div>
    </div>
</div>
    

Типичная ошибка

Попытка вложить имя элемента в имя блока

Чтоб "схитрить" и "как-будто не вложить", написать не `block__el1__el2` а `blockel1__el2` или `block__el1el2`.
Так нельзя.

.block {}
.blockel1 {}
.blockel1__el2 {}
    

Будут проблемы при переносе

Будут проблемы при переносе

Попытались перенести "странный элемент" в другое место - получили элемент что завис "в воздухе" без блока-родителя

<div class='someblock'>
    <div class='blockel1__el2'></div>
</div>
    

Так можно делать только если .blockelem сохранит логический смысл при переносе в другой блок.

element__element нельзя в CSS, но можно в HTML!

Обратите внимание - вы не можете вкладывать элементы в элементы в CSS, но можете и должны вкладывать элементы в элементы в HTML! DOM-дерево и BEM-дерево могут быть разными.

Запрет есть исключительно про нейминг!

БЭМ-дерево на то и дерево, что поддерживает вложенность, поэтому в БЭМ-дереве, разумеется, разрешается вкладывать элементы в элементы, блоки в блоки, блоки в элементы.

Vladimir Grinenko, @tadatuta

DOM-дерево

<ul>
  <li>
    <a>
      <span></span>
    </a>
  </li>
</ul>
    

DOM-дерево

.ul {}
.ul > li {}
.ul > li > a {}
.ul > li > a > span {}
    

BEM-дерево

<ul class="menu">
  <li class="menu__item">
    <a class="menu__link">
      <span class="menu__text"></span>
    </a>
  </li>
</ul>
    

BEM-дерево

.menu {}
.menu__item {}
.menu__link {}
.menu__text {}
    

BEM дерево - чистая логика

BEM-дерево не зависит ни от чего, даже от размещения в документе.

BEM-дерево не привязано к визуальному представлению блоков, оно отображает только логику, это и есть новый уровень семантики!

Модификация

6 видов

  1. Модификатором
    • модификатором блока
    • модификатором элемента
  2. Контекстом (т.е. каскадом от блока выше)
  3. Уровнем переопределения (добавлением-перезаписью файла стилей)
  4. Миксованием (добавлением классов других блоков)
    • включая глобальный класс

Статья на Frontender Magazine

https://github.com/FrontenderMagazine/bem-css-methodology-complete-guide/blob/master/rus.md

Делай модификатор!

<div class=block-name__elem_key_value>
    

А для элементов - делай каскад от модификатора.

Модификаторы для элементов, можно?

Если речь идет о простых правках, типа «активный пункт меню», то да, можно:

<a class="menu__link menu__link_state_active">
    

Булевые модификаторы

Кстати в таких простых случаях, можно писать модификаторы просто одним словом:

<a class="menu__link menu__link--active">
    

Но подумайте, может это новый блок?

BEM допускает ошибки

Ошибки

1. block__el__el

Например слайдеры очень часто верстают дикой вложенностью.

2. Межблочный каскад

и высокая специфичность

Я написал про это статью

http://delka.name/blog/2013/04/bem-otkroveniya-prinyavshih-veru/

3. Стили вне блоков

<ul class="menu checkoutForm big myfuckingclass-bold">
    

А как же выводить текст из БД?

.b-text h2 {}
.b-text p {}
.b-text img {}
.b-text ul li {}
    

Пример переверстки по BEM

Вот тут мы собираем вопросы

https://docs.google.com/document/d/1KD9tNdArCv1U1NvFX7rYPvUdbpPGVkuPZ2723KW5p4Y/edit

Диалекты BEM и JS-блоки.

Вот это вот всё на 5 минут:

Префиксы

Ещё были h- и m-, но Яндекс от них быстро отказался, а «в миру» они не прижились.

Почему Яндекс от них всех отказался?

И почему они нужны вам?

Альтернативный синтаксис и camelCase.

Альтернативный синтаксис и camelCase.

Многим нравится зарубежный формат модификаторов, через „--“, он читабельней.

<a class="block-name__element-name--state_active">

Альтернативный синтаксис и camelCase.

А через camelCase – ещё читабельней!

<a class="blockName__elementName--state_active">

Сокращенные модификаторы

Сокращенные модификаторы

Правильно писать так:
.block-name__elem_key_value

Или так:
.blockName__elem--key_value

Сокращенные модификаторы

Но некоторых из тех кто пишет код вручную, такие модификаторы бесят нечитабельностью кода:

<div class="block-name block-name_key1_value1 block-name_key2_value2 block-name_key3_value3">

Сокращенные модификаторы

…и отсутствием дуракоустойчивости:

<div class="block-name_key1_value1 some-another-block">

Сокращенные модификаторы

Им хочется так:

<div class="block-name -key1_value1 -key2_value2 -key3_value3">

Сокращенные модификаторы

<div class="blockName__elem.-key_value">
.blockName {
  &__elem {
    &.-key_value {
    }
  }
}
    

Это лишает вас возможности юзать Full Stack BEM

JS-блоки

$('.js-mark>fancybox').fancybox();
    

Это всё BEM

Примеры гайдлайнов по BEM

getbem-com

Сладкое!

Sass

Спасибо!

Igor Zenich, iDeus

Презентация: delka.github.io/talks/wsd/2014/bem/

Powered by Shower