106
Пишем БЭМ правильно Классы типа block__elem__elem__elem говорят о том, что верстальщик ничего не понял в #b_. 09:16 - 21 ноября 2013 Ukraine, Ukraine Vitaly Harisov @harisov Читать 5 РЕТВИТОВ 2 ТВИТОВ В ИЗБРАННОМ

WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Embed Size (px)

Citation preview

Page 1: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

Классы типа block__elem__elem__elem говорят о том,что верстальщик ничего не понял в #b_.09:16 - 21 ноября 2013 Ukraine, Ukraine

Vitaly Harisov@harisov

Читать

5 РЕТВИТОВ 2 ТВИТОВ В ИЗБРАННОМОтветитьРетвитнутьВ избранное

www.princexml.com
Prince - Non-commercial License
This document was created with Prince, a great way of getting web content onto paper.
Page 3: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

ещё один доклад про БЭМ…

Page 4: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

БЭМ —семантичный!

Page 5: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

Page 6: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Имена БЭМ-классов создаютдополнительный уровень логикиЕсть DOM-дерево, а есть БЭМ-дерево.

<input class="big_red_button order-button ">

<input class=" order-button b-checkout__submit ">

01.

02.

6

Page 7: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

О чём будем говорить?1. Как вручную сверстать «по-БЭМ»

2. Как не писать классы типа device-template-generic-

indicator-control-slider-bar-d :)

7

Page 8: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Кстати, а зачемнужен БЭM?

Page 9: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

BEM CSS *

* CSS подмножество БЭМ

Page 10: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Full stack BEMbemjson, bemhtml, bem-tools, вот это вот всё…

Page 11: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 12: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Full stack BEM?Когда он будет вам нужен — вы это сами поймёте.

Это будет момент, когда вам надоест писать html руками и вы захотите

его генерировать.

12

Page 13: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Пример версткипо БЭМ

Page 14: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 15: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Изначальнаявёрстка →

Page 16: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 17: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Похоже на БЭМ,да?

Page 18: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Давайте приглядимся

18

Page 19: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Повышениеспецифичности

Page 20: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 21: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

:(

Page 22: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

bit.ly/not-bem

Page 23: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Непонятость БЭМ

Page 24: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 25: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 26: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Методология неменялась

Page 27: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

.block

Page 28: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 29: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Независимый блокНБ или просто блок, это самодостаточный элемент страницы,

который при перемещении в другое место на странице или на другую

страницу не теряет своей самодостаточности.

БЭМ.Форум, Независимый блок“

29

Page 30: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Правила независимости блока1. для описания элемента используется class, но не id

2. каждый блок имеет префикс

3. в таблице стилей нет классов вне блоков

БЭМ.Форум, История создания БЭМ (часть первая)“

30

Page 31: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Как его таким написать?Просто писать стили тупо на каждый блок.

БЭМ хорош тем, что позволяет не забивать голову ерундой с каскадом,

а сосредоточимся на семантике и логике кода.

А с препроцессорами БЭМ позволяет писать еще и очень чистый и

логичный код.

31

Page 32: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Как проверить?Просто навести на блок в инспекторе кода.

У него не должно быть каскада.

32

Page 33: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

.block__element

Page 34: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 35: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

ЭлементЭлемент – это часть блока, отвечающая за отдельную функцию.

Он может находиться только в составе блока и не имеет смысла в

отрыве от него.

bem.info, Методология“

35

Page 36: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

DOM-дерево<ul>

<li>

<a>

<span></span>

</a>

</li>

</ul>

01.

02.

03.

04.

05.

06.

07.

36

Page 37: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

DOM-дерево.ul {}

.ul > li {}

.ul > li > a {}

.ul > li > a > span {}

01.

02.

03.

04.

37

Page 38: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 39: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

БЭМ-дерево<ul class=" menu ">

<li class=" menu__item ">

<a class=" menu__link ">

<span class=" menu__text "></span>

</a>

</li>

</ul>

01.

02.

03.

04.

05.

06.

07.

39

Page 40: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

БЭМ-дерево.menu {}

.menu__item {}

.menu__link {}

.menu__text {}

01.

02.

03.

04.

40

Page 41: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 42: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

БЭМ дерево — чистая логикаБЭМ-дерево не зависит ни от чего, даже от размещения в документе.

БЭМ-дерево не привязано к визуальному представлению блоков, оно

отображает только логику, это и есть новый уровень семантики!

42

Page 43: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

.block__el__el__el

Page 44: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

44

Page 46: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Как надо?<div class="block">

<div class="block __elem1 ">

<div class="block __elem2 "></div>

</div>

<div class="block __elem3 "></div>

</div>

01.

02.

03.

04.

05.

06.

46

Page 47: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

А в CSS.block {}

.block__elem1 {}

.block__elem2 {}

.block__elem3 {}

01.

02.

03.

04.

47

Page 48: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

• или создать новый блок

• или сделать ваше БЭМ-дерево с одинарной вложенностью

элементов

48

Page 49: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Есть 2 варианта как это переписать<div class="block">

<div class="block __elem1 ">

<div class="block __elem1__elem2 "></div>

</div>

</div>

01.

02.

03.

04.

05.

49

Page 50: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

Page 51: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Делать новый блок<div class="block1">

<div class=" block2 ">

<div class=" block2 __elem"></div>

</div>

</div>

01.

02.

03.

04.

05.

51

Page 52: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

Page 53: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Делать БЭМ-дерево с 1-ой вложенностьюэлементов<div class="block1">

<div class="block1 __elem1 ">

<div class="block1 __elem2 "></div>

</div>

</div>

01.

02.

03.

04.

05.

53

Page 54: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

Page 55: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Попытка вложить имя элемента в имя блокаЧтоб «схитрить» и «как-будто не вложить», написать не

.block__el1__el2 а .block el1 __el2 или

.block__el1 el2 . Так нельзя.

.block {}

.block el1 {}

.block el1 __el2 {}

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

01.

02.

03.

55

Page 56: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Будут проблемы при переносеПопытались перенести «странный элемент» в другое место - получили

элемент что завис «в воздухе» без блока-родителя

<div class=' someblock '>

<div class=' blockel1 __el2'></div>

</div>

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

01.

02.

03.

56

Page 57: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

element > element нельзя в CSS, но можнов HTML!Обратите внимание - вы не можете вкладывать элементы в элементы

в CSS, но можете и должны вкладывать элементы в элементы в HTML!

DOM-дерево и БЭМ-дерево могут быть разными.

57

Page 58: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Запрет есть исключительно про нейминг!БЭМ-дерево на то и дерево, что поддерживает вложенность, поэтому

в БЭМ-дереве, разумеется, разрешается вкладывать элементы в

элементы, блоки в блоки, блоки в элементы.

Vladimir Grinenko, @tadatuta“

58

Page 59: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Хватит!Мы не за теорией

сюда пришли.

Page 60: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 61: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 62: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 63: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 64: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 65: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 66: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 67: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 68: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 69: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 70: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 71: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Мы написали BEM-дерево:<div class="block">

<div class="block __elem1 ">

<div class="block __elem2 "></div>

</div>

<div class="block __elem3 "></div>

</div>

01.

02.

03.

04.

05.

06.

71

Page 72: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Нет каскада:.block {}

.block__elem1 {}

.block__elem2 {}

.block__elem3 {}

01.

02.

03.

04.

72

Page 73: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Модификация

Page 74: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

6 видов1. Модификатором

• модификатором блока

• модификатором элемента

2. Контекстом (т.е. каскадом от блока выше)

3. Уровнем переопределения (добавлением-перезаписью файла

стилей)

4. Миксованием (добавлением классов других блоков)

• включая глобальный класс

74

Page 75: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Просто добавляйте модификатор!<div class="block-name__elem _key_value ">

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

75

Page 76: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

можно:

<a class="menu__link menu__link _state_active ">

76

Page 77: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

одним словом:

<a class="menu__link menu__link _active ">

77

Page 78: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"
Page 80: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

БЭМ допускаетошибки

Page 81: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Самыепопулярные

ошибки

Page 82: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

82

Page 83: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

2. Повышение специфичностиВ html как-будто всё ok:

<div class="block">

<div class="block__el">

А на деле сели в машину и сгорели:

/* CSS */

.block .block__el {}

01.

02.

01.

02.

83

Page 84: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

3. Стили вне блоков<ul class="menu checkoutForm big myfuckingclass-bold ">

84

Page 85: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Почему это ошибки?Да потому что из-за этого потом тяжелей вносить правки и сложно

переместить блок в другое место.

85

Page 86: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Как мне?...

Page 87: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Вывести текст из WYSIWYG?Как назначаются стили для типографики? Не будешь же назначать

каждому тегу какой-то класс?

Artur Kornakov, @fliptheweb“87

Page 88: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Добавить .b-text.b-text блоку родителюИ использовать каскад.

.b-text h2 {}

.b-text p {}

.b-text img {}

.b-text ul li {}

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

01.

02.

03.

04.

88

Page 89: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Задавайтевопросы:

ru.bem.info/forum

Page 90: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Пример переверстки по БЭМ(упрощенный)• http://net-craft.com/old

• http://net-craft.com/

• http://net-craft.com/wp-content/themes/netcraft/dev/sass/main.scss

90

Page 91: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Диалекты БЭМ

Page 92: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Вот это вот всё на 5 минут:• Использование префиксов

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

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

• JS-блоки

92

Page 93: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Префиксыb- , l- , g- , i- , h- , m- , js- …

Придумывайте любые правила

Они нужны вам только для пространства имен.

93

Page 94: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

читабельней.

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

94

Page 95: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

<a class=" blockName__elementName --state_active">

95

Page 96: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

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

Page 97: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Сокращенные модификаторыПравильно писать так:

.block-name__elem _key_value

Или так:

.blockName__elem --key_value

97

Page 98: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Сокращенные модификаторыНо некоторых из тех, кто пишет код вручную, такие модификаторы

бесят нечитабельностью кода:

<div class="block-name block-name_key1_value1

block-name_key2_value2 block-name_key3_value3 ">

98

Page 99: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Сокращенные модификаторы…и отсутствием дуракоустойчивости:

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

block">

99

Page 100: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Сокращенные модификаторыИм хочется так:

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

key3_value3 ">

100

Page 101: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Сокращенные модификаторы<div class="blockName__elem .-key_value ">

.blockName {

&__elem {

& .-key_value {

}

}

}

01.

02.

03.

04.

05.

06.

07.

101

Page 102: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Миксы!Full BEM Stack!

Page 103: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

JS-блоки$(' .js- fancybox').fancybox();

103

Page 104: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Вы можете создавать свои гайдлайны• https://github.com/ideus-team/guidelines/blob/master/frontend/

bem.md

• http://nano.sapegin.ru/all/opor-methodology

104

Page 105: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Это всё БЭМ

Page 106: WebCamp, Front-end Developers Day Игорь Зенич "Пишем БЭМ правильно"

Спасибо!Igor Zenich, iDeus

• delka.name

• twitter.com/delaz

[email protected]

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

106