Мастер-класс наоборот: 
вы пишете БЭМ-проект, 
а мы подсказываем 
Евгений Константинов, Дима Белицкий 
BEMup в Санкт-Петербурге, 6 сентября 2014
Дима Белицкий 
3 
dmtry@yandex-team.ru 
@dabelitsky 
github.com/dab 
Разработчик интерфейсов в 
Яндексе
Евгений Константинов 
4 
4 
sipayrt@yandex-team.ru 
@sipayrt 
github.com/sipayrt 
разработчик интерфейсов в 
Яндексе
О чем поговорим? 
5
О чем поговорим? 
Методология 
5
О чем поговорим? 
Методология 
Шаблонизация и обмен данными 
5
О чем поговорим? 
Методология 
Шаблонизация и обмен данными 
JavaScript + BEM 
5
О чем поговорим? 
Методология 
Шаблонизация и обмен данными 
JavaScript + BEM 
Все — на примере демо-проекта 
5
Все наоборот!? 
6
БЭМ — что это?
БЭМ — что это? 
8
БЭМ — что это? 
Блок — независимый интерфейсный компонент 
8
БЭМ — что это? 
Блок — независимый интерфейсный компонент 
Элемент — составная часть блока, не имеющая смысла 
вне контекста этого блока 
8
БЭМ — что это? 
Блок — независимый интерфейсный компонент 
Элемент — составная часть блока, не имеющая смысла 
вне контекста этого блока 
Модификатор — это свойство блока или элемента , 
задающее изменения в их внешнем виде или поведении 
8
БЭМ — что это? 
Методология БЭМ на bem.info bit.ly/1hMHNB2 
Доклад Вовы Гриненко про методологию БЭМ и БЭМ-платформу 
bit.ly/1hMCKk5 
9
Вся история БЭМ 
История БЭМ на bem.info bit.ly/1eAsQBo 
Доклад Витали Харисова про историю БЭМ bit.ly/1m8ijzQ 
10
do-it-yourself-workshop 
11
do-it-yourself-workshop 
git clone github.com/bem/do-it-yourself-workshop 
11
do-it-yourself-workshop 
git clone github.com/bem/do-it-yourself-workshop 
cd do-it-yourself-workshop 
11
do-it-yourself-workshop 
git clone github.com/bem/do-it-yourself-workshop 
cd do-it-yourself-workshop 
npm i 
11
do-it-yourself-workshop 
git clone github.com/bem/do-it-yourself-workshop 
cd do-it-yourself-workshop 
npm i 
node bfs-workshop.js 
11
Задание #1 
12
Задание #1 
github.com/bem/generator-bem-stub 
12
Задание #1 
github.com/bem/generator-bem-stub 
$ sudo npm install -g generator-bem-stub 
12
Задание #1 
github.com/bem/generator-bem-stub 
$ sudo npm install -g generator-bem-stub 
node bfs-workshop.js verify 
12
Задание #2 
13
Задание #2 
node bfs-workshop.js 
13
Задание #2 
node bfs-workshop.js 
yo bem-stub 
13
Задание #2 
node bfs-workshop.js 
yo bem-stub 
node bfs-workshop.js verify 
13
Задание #3 
14
Задание #3 
$ export PATH=./node_modules/.bin:$PATH 
14
Задание #3 
$ export PATH=./node_modules/.bin:$PATH 
$ cd ./bfs-stub/ 
14
Задание #3 
$ export PATH=./node_modules/.bin:$PATH 
$ cd ./bfs-stub/ 
$ bem make 
14
Задание #3 
$ export PATH=./node_modules/.bin:$PATH 
$ cd ./bfs-stub/ 
$ bem make 
$ bem server 
14
Задание #3 
$ export PATH=./node_modules/.bin:$PATH 
$ cd ./bfs-stub/ 
$ bem make 
$ bem server 
localhost:8080/desktop.bundles/index/ 
14
Задание #3 
15
Задание #3 
информация про BEMJSON - bit.ly/1kXNzCg 
15
Задание #3 
информация про BEMJSON - bit.ly/1kXNzCg 
'block' - имя блока 
15
Задание #3 
информация про BEMJSON - bit.ly/1kXNzCg 
'block' - имя блока 
'elem' - имя элемента 
15
Задание #3 
информация про BEMJSON - bit.ly/1kXNzCg 
'block' - имя блока 
'elem' - имя элемента 
'mods' - модификаторы блока 
15
Задание #3 
информация про BEMJSON - bit.ly/1kXNzCg 
'block' - имя блока 
'elem' - имя элемента 
'mods' - модификаторы блока 
'elemMods' - модификаторы элемента 
15
Задание #3 
16
Задание #3 
'mix' - подмешанные блоки 
16
Задание #3 
'mix' - подмешанные блоки 
'tag' - HTML-тег для данной сущности 
16
Задание #3 
'mix' - подмешанные блоки 
'tag' - HTML-тег для данной сущности 
'attrs' - HTML-атрибуты для данной сущности 
16
Задание #3 
'mix' - подмешанные блоки 
'tag' - HTML-тег для данной сущности 
'attrs' - HTML-атрибуты для данной сущности 
'cls' - добавление кастомного класса 
16
Задание #3 
'mix' - подмешанные блоки 
'tag' - HTML-тег для данной сущности 
'attrs' - HTML-атрибуты для данной сущности 
'cls' - добавление кастомного класса 
'bem' - генерацию БЭМ-классов в HTML-атрибуте class 
16
Задание #3 
'mix' - подмешанные блоки 
'tag' - HTML-тег для данной сущности 
'attrs' - HTML-атрибуты для данной сущности 
'cls' - добавление кастомного класса 
'bem' - генерацию БЭМ-классов в HTML-атрибуте class 
16
BEMHTML
Декларативность 
18
Декларативность 
18 
условие {тело шаблона}
Декларативность 
18 
условие {тело шаблона} 
.island__header { display: inline-block; }
Декларативность 
18 
условие {тело шаблона} 
.island__header { display: inline-block; } 
block('island').elem('header')( 
tag()('a') 
)
BEMJSON 
входные данные 
19
BEMHTML 
декларативный шаблон 
20
HTML 
результат 
21
Шаблон BEMHTML. Моды 
декларативная 
шаблонизация 
упрощение разработки по 
сравнению с 
императивными подходом 
облегчение командной 
работы 
22
Шаблон BEMHTML. Моды 
23
Шаблон BEMHTML. Моды 
23 
default — набор и порядок прохождения остальных мод
Шаблон BEMHTML. Моды 
23 
default — набор и порядок прохождения остальных мод 
tag — генерация HTML тэга
Шаблон BEMHTML. Моды 
23 
default — набор и порядок прохождения остальных мод 
tag — генерация HTML тэга 
js — наличие js и параметры
Шаблон BEMHTML. Моды 
23 
default — набор и порядок прохождения остальных мод 
tag — генерация HTML тэга 
js — наличие js и параметры 
bem — генерация классов БЭМ-сущности
Шаблон BEMHTML. Моды 
23 
default — набор и порядок прохождения остальных мод 
tag — генерация HTML тэга 
js — наличие js и параметры 
bem — генерация классов БЭМ-сущности 
cls — кастомные классы
Шаблон BEMHTML. Моды 
23 
default — набор и порядок прохождения остальных мод 
tag — генерация HTML тэга 
js — наличие js и параметры 
bem — генерация классов БЭМ-сущности 
cls — кастомные классы 
mix — несколько БЭМ-блоков на одной DOM-ноде
Шаблон BEMHTML. Моды 
23 
default — набор и порядок прохождения остальных мод 
tag — генерация HTML тэга 
js — наличие js и параметры 
bem — генерация классов БЭМ-сущности 
cls — кастомные классы 
mix — несколько БЭМ-блоков на одной DOM-ноде 
attrs — позволяет задать имена и значения произвольных HTML-атрибутов
Шаблон BEMHTML. Моды 
23 
default — набор и порядок прохождения остальных мод 
tag — генерация HTML тэга 
js — наличие js и параметры 
bem — генерация классов БЭМ-сущности 
cls — кастомные классы 
mix — несколько БЭМ-блоков на одной DOM-ноде 
attrs — позволяет задать имена и значения произвольных HTML-атрибутов
Шаблон BEMHTML. Моды 
23 
default — набор и порядок прохождения остальных мод 
tag — генерация HTML тэга 
js — наличие js и параметры 
bem — генерация классов БЭМ-сущности 
cls — кастомные классы 
mix — несколько БЭМ-блоков на одной DOM-ноде 
attrs — позволяет задать имена и значения произвольных HTML-атрибутов
BEMHTML Руководство 
24 
Это и многое другое на нашем сайте bit.ly/bemhtmlref
Шаблоны. Синтаксис 
25 
<form class=‘form js-inited’ 
BEMHTML 
block('form')( 
tag()('form'), 
js()(true) 
) 
HTML 
<form class="form i-bem" 
data-bem="{"form":{}}"> 
… 
</form>
Модульная система 
ym 
ru.bem.info/tools/bem/modules/ 
github.com/ymaps/modules 
26
bem-components 
27
bem-components 
библиотека общих компонентов в OpenSource 
27
bem-components 
библиотека общих компонентов в OpenSource 
19 блоков ждут своих пользователей 
27
bem-components 
библиотека общих компонентов в OpenSource 
19 блоков ждут своих пользователей 
блоки покрыты тестами и задокументированы 
27
bem-components 
библиотека общих компонентов в OpenSource 
19 блоков ждут своих пользователей 
блоки покрыты тестами и задокументированы 
библиотека постоянно развивается 
27
bem-components 
библиотека общих компонентов в OpenSource 
19 блоков ждут своих пользователей 
блоки покрыты тестами и задокументированы 
библиотека постоянно развивается 
ru.bem.info/libs/bem-components/v2/ 
27
Что такое i-bem.js? 
28
Что такое i-bem.js? 
28 
Блок, помогающий делать другие блоки
Что такое i-bem.js? 
28 
Блок, помогающий делать другие блоки 
Реализация блока i-bem в технологии JavaScript
Что такое i-bem.js? 
28 
Блок, помогающий делать другие блоки 
Реализация блока i-bem в технологии JavaScript 
jQuery для нормализации API браузера
Что дает i-bem.js? 
29
Что дает i-bem.js? 
29 
Работа с предметной областью БЭМ
Что дает i-bem.js? 
29 
Работа с предметной областью БЭМ 
Декларативный подход
Что дает i-bem.js? 
29 
Работа с предметной областью БЭМ 
Декларативный подход 
Возможность доопределения блоков
Блоки с js-представлением 
{! 
!!!!block: 'form',! 
!!!!js: true! 
} 
30
<div class="form i-bem" ! 
!!!! data-bem="{ form: {} }" ></div> 
31 
Блоки с js-представлением
<div class="form i-bem" ! 
!!!! data-bem="{ form: {} }" ></div> 
32 
Блоки с js-представлением
<div class="form i-bem" ! 
!!!! data-bem="{ form: {} }" ></div> 
33 
Блоки с js-представлением
<div class="form i-bem" ! 
!!!! data-bem="{ ! 
!!!!!!!form: {! 
!!!!!!!!!!p1: 'v1',! 
!!!!!!!!!!p2: 'v2',! 
!!!!!!!!!!…! 
!!!!!!!} ! 
!!!!!}" ></div> 
34 
Блоки с js-представлением
<div class="form i-bem" ! 
!!!! data-bem="{ 'form': {} }" /><div> 
35 
Инициализация
<div class="form i-bem form_js_inited" ! 
!!!! data-bem="{ 'form': {} }" /><div> 
36 
Инициализация
Набор хелперов 
37
Набор хелперов 
Работа с событиями 
37
Набор хелперов 
Работа с событиями 
Поиск элементов и других блоков 
37
Набор хелперов 
Работа с событиями 
Поиск элементов и других блоков 
Работа с модификаторами 
37
Набор хелперов 
Работа с событиями 
Поиск элементов и других блоков 
Работа с модификаторами 
Перестроение DOM-дерева 
37
// DOM-события 
this.bindTo('submit', function() { /*…*/ }) 
this.unbindFrom('submit') 
38 
Работа с событиями
// DOM-события 
this.bindTo('submit', function() { /*…*/ }) 
this.unbindFrom('submit') 
! 
// BEM-события 
this.on('update', function() { /*…*/ }) 
this.un('update', function() { /*…*/ }) 
this.emit('update') 
39 
Работа с событиями
40 
Набор хелперов 
// селекторы блоков 
this.findBlockInside('button') 
this.findBlockOutside('page') 
this.findBlockOn('dialog') 
!
41 
Набор хелперов 
// селекторы блоков 
this.findBlockInside('button') 
this.findBlockOutside('page') 
this.findBlockOn('dialog') 
! 
// селекторы элементов 
this.findElem('control') 
this.elem('control')
42 
Набор хелперов 
// селекторы блоков 
this.findBlockInside('button') 
this.findBlockOutside('page') 
this.findBlockOn('dialog') 
! 
// селекторы элементов 
this.findElem('control') 
this.elem('control') 
! 
// работа с модификаторами 
this.setMod('status', 'loading') 
this.hasMod('status', 'loading') 
this.getMod('status') 
this.delMod('status') 
this.toggleMod('status', 'online', 'offline')
Динамическое обновление DOM 
43
Динамическое обновление DOM 
prepend - добавить DOM-фрагмент в начало указанного контекста 
43
Динамическое обновление DOM 
prepend - добавить DOM-фрагмент в начало указанного контекста 
append - добавить DOM-фрагмент в конец указанного контекста 
43
Динамическое обновление DOM 
prepend - добавить DOM-фрагмент в начало указанного контекста 
append - добавить DOM-фрагмент в конец указанного контекста 
before - добавить DOM-фрагмент перед указанным контекстом 
43
Динамическое обновление DOM 
prepend - добавить DOM-фрагмент в начало указанного контекста 
append - добавить DOM-фрагмент в конец указанного контекста 
before - добавить DOM-фрагмент перед указанным контекстом 
after - добавить DOM-фрагмент после указанного контекста 
43
Динамическое обновление DOM 
prepend - добавить DOM-фрагмент в начало указанного контекста 
append - добавить DOM-фрагмент в конец указанного контекста 
before - добавить DOM-фрагмент перед указанным контекстом 
after - добавить DOM-фрагмент после указанного контекста 
update - заместить DOM-фрагмент внутри указанного контекста 
43
Динамическое обновление DOM 
prepend - добавить DOM-фрагмент в начало указанного контекста 
append - добавить DOM-фрагмент в конец указанного контекста 
before - добавить DOM-фрагмент перед указанным контекстом 
after - добавить DOM-фрагмент после указанного контекста 
update - заместить DOM-фрагмент внутри указанного контекста 
replace - заменить указанный контекст новым DOM-фрагментом 
43
Итого 
44
Итого 
Собрали агрегатор социалок 
44
Итого 
Собрали агрегатор социалок 
Использовали полный стек БЭМ-технологий 
44
Итого 
Собрали агрегатор социалок 
Использовали полный стек БЭМ-технологий 
Пощупали все СВОИМИ руками, а не залипали в твиттер 
44
bem.info 
ru.bem.info/forum 
twitter.com/bem_ru
46 
Евгений Константинов 
@sipayrt 
sipayrt 
sipayrt@yandex-team.ru 
Дмитрий Белицкий 
@dabelitsky 
dab 
dmtry@yandex-team.ru
Заполни анкету, братан 
bit.ly/spb-feedback 
47

Мастер-класс наоборот: вы пишете БЭМ-проект, а мы подсказываем — Евгений Константинов, Яндекс, Дима Белицкий Яндекс

  • 2.
    Мастер-класс наоборот: выпишете БЭМ-проект, а мы подсказываем Евгений Константинов, Дима Белицкий BEMup в Санкт-Петербурге, 6 сентября 2014
  • 3.
    Дима Белицкий 3 dmtry@yandex-team.ru @dabelitsky github.com/dab Разработчик интерфейсов в Яндексе
  • 4.
    Евгений Константинов 4 4 sipayrt@yandex-team.ru @sipayrt github.com/sipayrt разработчик интерфейсов в Яндексе
  • 5.
  • 6.
    О чем поговорим? Методология 5
  • 7.
    О чем поговорим? Методология Шаблонизация и обмен данными 5
  • 8.
    О чем поговорим? Методология Шаблонизация и обмен данными JavaScript + BEM 5
  • 9.
    О чем поговорим? Методология Шаблонизация и обмен данными JavaScript + BEM Все — на примере демо-проекта 5
  • 10.
  • 11.
  • 12.
  • 13.
    БЭМ — чтоэто? Блок — независимый интерфейсный компонент 8
  • 14.
    БЭМ — чтоэто? Блок — независимый интерфейсный компонент Элемент — составная часть блока, не имеющая смысла вне контекста этого блока 8
  • 15.
    БЭМ — чтоэто? Блок — независимый интерфейсный компонент Элемент — составная часть блока, не имеющая смысла вне контекста этого блока Модификатор — это свойство блока или элемента , задающее изменения в их внешнем виде или поведении 8
  • 16.
    БЭМ — чтоэто? Методология БЭМ на bem.info bit.ly/1hMHNB2 Доклад Вовы Гриненко про методологию БЭМ и БЭМ-платформу bit.ly/1hMCKk5 9
  • 17.
    Вся история БЭМ История БЭМ на bem.info bit.ly/1eAsQBo Доклад Витали Харисова про историю БЭМ bit.ly/1m8ijzQ 10
  • 18.
  • 19.
    do-it-yourself-workshop git clonegithub.com/bem/do-it-yourself-workshop 11
  • 20.
    do-it-yourself-workshop git clonegithub.com/bem/do-it-yourself-workshop cd do-it-yourself-workshop 11
  • 21.
    do-it-yourself-workshop git clonegithub.com/bem/do-it-yourself-workshop cd do-it-yourself-workshop npm i 11
  • 22.
    do-it-yourself-workshop git clonegithub.com/bem/do-it-yourself-workshop cd do-it-yourself-workshop npm i node bfs-workshop.js 11
  • 23.
  • 24.
  • 25.
    Задание #1 github.com/bem/generator-bem-stub $ sudo npm install -g generator-bem-stub 12
  • 26.
    Задание #1 github.com/bem/generator-bem-stub $ sudo npm install -g generator-bem-stub node bfs-workshop.js verify 12
  • 27.
  • 28.
    Задание #2 nodebfs-workshop.js 13
  • 29.
    Задание #2 nodebfs-workshop.js yo bem-stub 13
  • 30.
    Задание #2 nodebfs-workshop.js yo bem-stub node bfs-workshop.js verify 13
  • 31.
  • 32.
    Задание #3 $export PATH=./node_modules/.bin:$PATH 14
  • 33.
    Задание #3 $export PATH=./node_modules/.bin:$PATH $ cd ./bfs-stub/ 14
  • 34.
    Задание #3 $export PATH=./node_modules/.bin:$PATH $ cd ./bfs-stub/ $ bem make 14
  • 35.
    Задание #3 $export PATH=./node_modules/.bin:$PATH $ cd ./bfs-stub/ $ bem make $ bem server 14
  • 36.
    Задание #3 $export PATH=./node_modules/.bin:$PATH $ cd ./bfs-stub/ $ bem make $ bem server localhost:8080/desktop.bundles/index/ 14
  • 37.
  • 38.
    Задание #3 информацияпро BEMJSON - bit.ly/1kXNzCg 15
  • 39.
    Задание #3 информацияпро BEMJSON - bit.ly/1kXNzCg 'block' - имя блока 15
  • 40.
    Задание #3 информацияпро BEMJSON - bit.ly/1kXNzCg 'block' - имя блока 'elem' - имя элемента 15
  • 41.
    Задание #3 информацияпро BEMJSON - bit.ly/1kXNzCg 'block' - имя блока 'elem' - имя элемента 'mods' - модификаторы блока 15
  • 42.
    Задание #3 информацияпро BEMJSON - bit.ly/1kXNzCg 'block' - имя блока 'elem' - имя элемента 'mods' - модификаторы блока 'elemMods' - модификаторы элемента 15
  • 43.
  • 44.
    Задание #3 'mix'- подмешанные блоки 16
  • 45.
    Задание #3 'mix'- подмешанные блоки 'tag' - HTML-тег для данной сущности 16
  • 46.
    Задание #3 'mix'- подмешанные блоки 'tag' - HTML-тег для данной сущности 'attrs' - HTML-атрибуты для данной сущности 16
  • 47.
    Задание #3 'mix'- подмешанные блоки 'tag' - HTML-тег для данной сущности 'attrs' - HTML-атрибуты для данной сущности 'cls' - добавление кастомного класса 16
  • 48.
    Задание #3 'mix'- подмешанные блоки 'tag' - HTML-тег для данной сущности 'attrs' - HTML-атрибуты для данной сущности 'cls' - добавление кастомного класса 'bem' - генерацию БЭМ-классов в HTML-атрибуте class 16
  • 49.
    Задание #3 'mix'- подмешанные блоки 'tag' - HTML-тег для данной сущности 'attrs' - HTML-атрибуты для данной сущности 'cls' - добавление кастомного класса 'bem' - генерацию БЭМ-классов в HTML-атрибуте class 16
  • 50.
  • 51.
  • 52.
  • 53.
    Декларативность 18 условие{тело шаблона} .island__header { display: inline-block; }
  • 54.
    Декларативность 18 условие{тело шаблона} .island__header { display: inline-block; } block('island').elem('header')( tag()('a') )
  • 55.
  • 56.
  • 57.
  • 58.
    Шаблон BEMHTML. Моды декларативная шаблонизация упрощение разработки по сравнению с императивными подходом облегчение командной работы 22
  • 59.
  • 60.
    Шаблон BEMHTML. Моды 23 default — набор и порядок прохождения остальных мод
  • 61.
    Шаблон BEMHTML. Моды 23 default — набор и порядок прохождения остальных мод tag — генерация HTML тэга
  • 62.
    Шаблон BEMHTML. Моды 23 default — набор и порядок прохождения остальных мод tag — генерация HTML тэга js — наличие js и параметры
  • 63.
    Шаблон BEMHTML. Моды 23 default — набор и порядок прохождения остальных мод tag — генерация HTML тэга js — наличие js и параметры bem — генерация классов БЭМ-сущности
  • 64.
    Шаблон BEMHTML. Моды 23 default — набор и порядок прохождения остальных мод tag — генерация HTML тэга js — наличие js и параметры bem — генерация классов БЭМ-сущности cls — кастомные классы
  • 65.
    Шаблон BEMHTML. Моды 23 default — набор и порядок прохождения остальных мод tag — генерация HTML тэга js — наличие js и параметры bem — генерация классов БЭМ-сущности cls — кастомные классы mix — несколько БЭМ-блоков на одной DOM-ноде
  • 66.
    Шаблон BEMHTML. Моды 23 default — набор и порядок прохождения остальных мод tag — генерация HTML тэга js — наличие js и параметры bem — генерация классов БЭМ-сущности cls — кастомные классы mix — несколько БЭМ-блоков на одной DOM-ноде attrs — позволяет задать имена и значения произвольных HTML-атрибутов
  • 67.
    Шаблон BEMHTML. Моды 23 default — набор и порядок прохождения остальных мод tag — генерация HTML тэга js — наличие js и параметры bem — генерация классов БЭМ-сущности cls — кастомные классы mix — несколько БЭМ-блоков на одной DOM-ноде attrs — позволяет задать имена и значения произвольных HTML-атрибутов
  • 68.
    Шаблон BEMHTML. Моды 23 default — набор и порядок прохождения остальных мод tag — генерация HTML тэга js — наличие js и параметры bem — генерация классов БЭМ-сущности cls — кастомные классы mix — несколько БЭМ-блоков на одной DOM-ноде attrs — позволяет задать имена и значения произвольных HTML-атрибутов
  • 69.
    BEMHTML Руководство 24 Это и многое другое на нашем сайте bit.ly/bemhtmlref
  • 70.
    Шаблоны. Синтаксис 25 <form class=‘form js-inited’ BEMHTML block('form')( tag()('form'), js()(true) ) HTML <form class="form i-bem" data-bem="{"form":{}}"> … </form>
  • 71.
    Модульная система ym ru.bem.info/tools/bem/modules/ github.com/ymaps/modules 26
  • 72.
  • 73.
    bem-components библиотека общихкомпонентов в OpenSource 27
  • 74.
    bem-components библиотека общихкомпонентов в OpenSource 19 блоков ждут своих пользователей 27
  • 75.
    bem-components библиотека общихкомпонентов в OpenSource 19 блоков ждут своих пользователей блоки покрыты тестами и задокументированы 27
  • 76.
    bem-components библиотека общихкомпонентов в OpenSource 19 блоков ждут своих пользователей блоки покрыты тестами и задокументированы библиотека постоянно развивается 27
  • 77.
    bem-components библиотека общихкомпонентов в OpenSource 19 блоков ждут своих пользователей блоки покрыты тестами и задокументированы библиотека постоянно развивается ru.bem.info/libs/bem-components/v2/ 27
  • 78.
  • 79.
    Что такое i-bem.js? 28 Блок, помогающий делать другие блоки
  • 80.
    Что такое i-bem.js? 28 Блок, помогающий делать другие блоки Реализация блока i-bem в технологии JavaScript
  • 81.
    Что такое i-bem.js? 28 Блок, помогающий делать другие блоки Реализация блока i-bem в технологии JavaScript jQuery для нормализации API браузера
  • 82.
  • 83.
    Что дает i-bem.js? 29 Работа с предметной областью БЭМ
  • 84.
    Что дает i-bem.js? 29 Работа с предметной областью БЭМ Декларативный подход
  • 85.
    Что дает i-bem.js? 29 Работа с предметной областью БЭМ Декларативный подход Возможность доопределения блоков
  • 86.
    Блоки с js-представлением {! !!!!block: 'form',! !!!!js: true! } 30
  • 87.
    <div class="form i-bem"! !!!! data-bem="{ form: {} }" ></div> 31 Блоки с js-представлением
  • 88.
    <div class="form i-bem"! !!!! data-bem="{ form: {} }" ></div> 32 Блоки с js-представлением
  • 89.
    <div class="form i-bem"! !!!! data-bem="{ form: {} }" ></div> 33 Блоки с js-представлением
  • 90.
    <div class="form i-bem"! !!!! data-bem="{ ! !!!!!!!form: {! !!!!!!!!!!p1: 'v1',! !!!!!!!!!!p2: 'v2',! !!!!!!!!!!…! !!!!!!!} ! !!!!!}" ></div> 34 Блоки с js-представлением
  • 91.
    <div class="form i-bem"! !!!! data-bem="{ 'form': {} }" /><div> 35 Инициализация
  • 92.
    <div class="form i-bemform_js_inited" ! !!!! data-bem="{ 'form': {} }" /><div> 36 Инициализация
  • 93.
  • 94.
  • 95.
    Набор хелперов Работас событиями Поиск элементов и других блоков 37
  • 96.
    Набор хелперов Работас событиями Поиск элементов и других блоков Работа с модификаторами 37
  • 97.
    Набор хелперов Работас событиями Поиск элементов и других блоков Работа с модификаторами Перестроение DOM-дерева 37
  • 98.
    // DOM-события this.bindTo('submit',function() { /*…*/ }) this.unbindFrom('submit') 38 Работа с событиями
  • 99.
    // DOM-события this.bindTo('submit',function() { /*…*/ }) this.unbindFrom('submit') ! // BEM-события this.on('update', function() { /*…*/ }) this.un('update', function() { /*…*/ }) this.emit('update') 39 Работа с событиями
  • 100.
    40 Набор хелперов // селекторы блоков this.findBlockInside('button') this.findBlockOutside('page') this.findBlockOn('dialog') !
  • 101.
    41 Набор хелперов // селекторы блоков this.findBlockInside('button') this.findBlockOutside('page') this.findBlockOn('dialog') ! // селекторы элементов this.findElem('control') this.elem('control')
  • 102.
    42 Набор хелперов // селекторы блоков this.findBlockInside('button') this.findBlockOutside('page') this.findBlockOn('dialog') ! // селекторы элементов this.findElem('control') this.elem('control') ! // работа с модификаторами this.setMod('status', 'loading') this.hasMod('status', 'loading') this.getMod('status') this.delMod('status') this.toggleMod('status', 'online', 'offline')
  • 103.
  • 104.
    Динамическое обновление DOM prepend - добавить DOM-фрагмент в начало указанного контекста 43
  • 105.
    Динамическое обновление DOM prepend - добавить DOM-фрагмент в начало указанного контекста append - добавить DOM-фрагмент в конец указанного контекста 43
  • 106.
    Динамическое обновление DOM prepend - добавить DOM-фрагмент в начало указанного контекста append - добавить DOM-фрагмент в конец указанного контекста before - добавить DOM-фрагмент перед указанным контекстом 43
  • 107.
    Динамическое обновление DOM prepend - добавить DOM-фрагмент в начало указанного контекста append - добавить DOM-фрагмент в конец указанного контекста before - добавить DOM-фрагмент перед указанным контекстом after - добавить DOM-фрагмент после указанного контекста 43
  • 108.
    Динамическое обновление DOM prepend - добавить DOM-фрагмент в начало указанного контекста append - добавить DOM-фрагмент в конец указанного контекста before - добавить DOM-фрагмент перед указанным контекстом after - добавить DOM-фрагмент после указанного контекста update - заместить DOM-фрагмент внутри указанного контекста 43
  • 109.
    Динамическое обновление DOM prepend - добавить DOM-фрагмент в начало указанного контекста append - добавить DOM-фрагмент в конец указанного контекста before - добавить DOM-фрагмент перед указанным контекстом after - добавить DOM-фрагмент после указанного контекста update - заместить DOM-фрагмент внутри указанного контекста replace - заменить указанный контекст новым DOM-фрагментом 43
  • 110.
  • 111.
  • 112.
    Итого Собрали агрегаторсоциалок Использовали полный стек БЭМ-технологий 44
  • 113.
    Итого Собрали агрегаторсоциалок Использовали полный стек БЭМ-технологий Пощупали все СВОИМИ руками, а не залипали в твиттер 44
  • 114.
  • 115.
    46 Евгений Константинов @sipayrt sipayrt sipayrt@yandex-team.ru Дмитрий Белицкий @dabelitsky dab dmtry@yandex-team.ru
  • 116.