Upload
yandex
View
8.188
Download
3
Embed Size (px)
Citation preview
Разработчик интерфейсов
БЭМ
Владимир Варанкин
Блок Элемент Модификатор
3
Проекты в Яндексе
• Живут долго• Делаются быстро• Легко поддерживаются и развиваются• Большая команда• Много кода
4
Методология
Методология — учение об организации деятельности
6
Принципы БЭМ-методологии
Методология
Принципы БЭМ-методологии
• разделение кода на части
8
Принципы БЭМ-методологии
• разделение кода на части• общая предметная область
9
Общая предметная область
10
Общая предметная область
11
Общая предметная область
12
Общая предметная область
13
Общая предметная область
14
Общая предметная область
15
Принципы БЭМ-методологии
• разделение кода на части• общая предметная область• разделение ответственности
16
Принципы БЭМ-методологии
• разделение кода на части• общая предметная область• разделение ответственности• повторное использование кода
17
Принципы БЭМ-методологии
• разделение кода на части• общая предметная область• разделение ответственности• повторное использование кода• сборка кода в финальный runtime
18
Определения
Блок
20
Блок
21
Блок
22
Блок
23
Элемент
24
Элемент
25
Элемент
26
Модификатор
27
Модификатор
28
Уровень переопределения
29
Уровень переопределения
30
Сборка
31
Пример
Карточка товара
Пример
Блок
35
Элементы
36
БЭМ-дерево
Пример
БЭМ-дерево
38
<block name="product"> <elem name="title"> Световой меч...</elem>
<elem name="picture" src="n52-105-medium.png"/>
<elem name="price"> <elem name="price-value" value="33700"/> </elem>
<elem name="info"> Хорошо держит форму...</elem>
...39
Организация файловой структуры
Пример
blocks/ └── product/
41
blocks/ └── product/ └── product.css
42
Технология
43
blocks/ └── product/ ├── product.bemhtml ├── product.png ├── product.js └── product.css
44
/* product.css */
.product{ color: #000;
font: 13px Verdana, sans-serif;}
45
blocks/ └─ product/ ├─ title/ ├─ picture/ ├─ price/ ├─ price-value/ ├─ ... └─ product.css
46
blocks/ └─ product/ ├─ title/ └─ product__title.css ├─ picture/ └─ product__picture.css ├─ ... └─ product.css
47
Файлы → БЭМ-дерево
48
/* product__title.css */
.product__title{ display: block;
font-size: 24px; font-weight: bold;
margin-left: -1ex;}
49
blocks/ └─ product/ ├─ title/ ├─ picture/ ├─ price/ ├─ price-value/ ├─ ... └─ product.css
50
/* product__price.css */
.product__price{ font-size: 12px;}
.product__price-value{ color: #390; font-size: 24px;}
51
<html><body>
<div class="product"> <h1 class="product__title">...</h1> <img class="product__picture" src="..."/> <span class="product__price">...</span> <!-- ... --></div>
</body></html>
52
Пришел менеджер...
Пример
Пришел менеджер
54
Пришел менеджер
55
56
57
Блок
58
Элементы
59
БЭМ-дерево
Пример
<block name="product"> <elem name="title"> Световой меч...</elem> <elem name="picture"> <block name="illustration"> <elem name="image" size="mid" src="n52-105-medium.png"/> <elem name="zoom"> Большое изображение</elem></block>
<elem name="price"> <elem name="price-value" value="33700"/><elem> <elem name="info"> Хорошо держит форму...</elem>
...61
Файловая структура
Пример
blocks/ ├─ product/ └─ illustration/
63
blocks/ ├─ product/ └─ illustration/ ├─ image/ └─ illustration__image.css └─ zoom/ ├─ illustration__zoom.css └─ illustration__zoom.png
64
blocks/ ├─ product/ └─ illustration/ ├─ image/ ├─ _size/ ├─ illustration__image_size_sm.css ├─ illustration__image_size_mid.css └─ illustration__image_size_big.css └─ illustration__image.css └─ zoom/ └─ ...
65
66
blocks/ ├─ product/ └─ illustration/ ├─ image/ ├─ _size/ ├─ illustration__image_size_sm.css ├─ illustration__image_size_mid.css ├─ illustration__image_size_big.css └─ illustration__image_size_big.png └─ illustration__image.css └─ zoom/ └─ ...
67
/* illustration__image_size_mid.css */
. illustration__image_size_mid{ display: block;
width: 300px;}
68
blocks/ ├─ product/ └─ illustration/ ├─ image/ └─ ... ├─ zoom/ └─ ... └─ illustration.js
69
// illustration.js
(function($, undefined) {
$('.illustration__zoom').on('click', function() {
var sizeBig = $(this).data('size-big');
// ...
})
}(jQuery));
70
<html><body><div class="product"> <h1 class="product__title">...</h1> <div class="product__picture illustration"> <img class="illustration__image illustration__image_size_mid" src="..."/> <span class="illustration__zoom" data-size-big="...">...</span> </div> <span class="product__price">...</span> <!-- ... --></div></body></html>
71
<html><body><div class="product"> <h1 class="product__title">...</h1> <div class="product__picture illustration"> <img class="illustration__image illustration__image_size_mid" src="..."/> <span class="illustration__zoom" data-size-big="...">...</span> </div> <span class="product__price">...</span> <!-- ... --></div></body></html>
72
<html><body><div class="product"> <h1 class="product__title">...</h1> <div class="product__picture illustration"> <img class="illustration__image illustration__image_size_mid" src="..."/> <span class="illustration__zoom" data-size-big="...">...</span> </div> <span class="product__price">...</span> <!-- ... --></div></body></html>
73
events.yandex.ru/talks/293
Утилиты
Утилита для работы с файлами, написанными по БЭМ-методу
BEM tools
76
github.com/bem/bem-tools
Создание сущностей
Сборка финального runtime
Разработческий сервер
...
BEM tools
77
BEM tools
› bem --help
78
BEM tools
› bem --help
Tools to work with files written using the BEM-method.See http://bem.github.com/bem-method/ for more info.
Usage: bem COMMAND [OPTIONS] [ARGS] bem [OPTIONS] [ARGS]
Commands: create : Create of entities tool. build : Build tool. server : Development server. make : BEM make. decl : Usage declaration manipulation tool. completion : Shell completion.79
BEM tools
› bem --help
Tools to work with files written using the BEM-method.See http://bem.github.com/bem-method/ for more info.
Usage: bem COMMAND [OPTIONS] [ARGS] bem [OPTIONS] [ARGS]
Commands: create : Create of entities tool. build : Build tool. server : Development server. make : BEM make. decl : Usage declaration manipulation tool. completion : Shell completion.80
bem create:создание БЭМ-сущностей
BEM Tools
bem create
– уровни переопределения– блоки– элементы– модификаторы
82
bem create
› bem create --help
83
bem create
› bem create --help
Usage: bem create COMMAND [OPTIONS] [ARGS] bem create [OPTIONS] [ARGS]
Commands: level : Level. block : Block. elem : Block element. mod : Modifier.
84
bem create
› bem create block --help
85
bem create
› bem create block --help
Usage: bem create block [OPTIONS] [ARGS]
Options: -h, --help : Help -C DIR, --chdir=DIR : change process working directory, cwd by default; to specify level use --level, -l option instead -t ADDTECH, --add-tech=ADDTECH : add tech -T FORCETECH, --force-tech=FORCETECH : use only specified tech -n NOTECH, --no-tech=NOTECH : exclude tech -l LEVEL, --level=LEVEL : level directory path, default: ./ -f, --force : force files creation
Arguments: NAMES : blocks names
86
bem create
› bem create block illustration --level=blocks --add-tech=css
87
bem create
› bem create block illustration --level=blocks --add-tech=css
blocks/ └─ illustration/ └─ illustration.css
88
bem create
› bem create mod size --level=blocks
--block=illustration
--elem=image
--val=mid
--add-tech=css
89
bem create
› bem create mod size --level=blocks
--block=illustration
--elem=image
--val=mid
--add-tech=css
blocks/ └─ illustration/ └─ image/ └─ _size/ └─ illustration__image_size_mid.css
90
bem build:сборка файлов страниц
BEM Tools
bem build
Собирает файлы страниц в различных технологиях, основываясь на декларации.
92
bem build
› bem build --help
93
БЭМ дерево ⟹ Декларация ⟹ Страница
bem build
94
bem build
› bem build [...] -o pages/index -n index
--tech=css
--level=blocks
95
bem build
› bem build [...] -o pages/index -n index
--tech=css
--level=blocks
pages/ └─ index/ └─ index.css
96
/* index.css */
@import url(blocks/product/product.css);@import url(blocks/product/title/...);@import url(blocks/product/picture/...);...@import url(blocks/illustration/figure.css);@import url(blocks/illustration/image/...);...
97
bem build
› bem build [...] -o pages/index -n index --tech=js --level=blocks
98
bem build
› bem build [...] -o pages/index -n index --tech=js --level=blocks
pages/ └─ index/ └─ index.js
99
/* index.js */
/*borschik:include:blocks/product/product.js*//*borschik:include:blocks/product/title/...*//*borschik:include:blocks/product/picture/...*/.../*borschik:include:blocks/illustration/illustration.js*//*borschik:include:blocks/illustration/image/...*/...
100
bem build
pages/ └─ index/ ├─ index.html ├─ index.xsl ├─ index.bemhtml.js ├─ index.js ├─ index.css ├─ index.ie.css ├─ index.coffee └─ index.ts
101
bem build
pages/ └─ index/ ├─ index.html ├─ index.xsl ├─ index.bemhtml.js ├─ index.js ├─ index.css ├─ index.ie.css ├─ index.coffee └─ index.ts
102
events.yandex.ru/talks/289/
Пришел менеджер...
Пример
Пришел менеджер
104
Пришел менеджер
105
Пришел менеджер
106
Пришел менеджер...
107
БЭМ-дерево
Пример
<block name="product"> <elem name="title"> Световой меч...</elem> <elem name="picture"> <block name="illustration"> <elem name="image" size="mid" src="n52-105-medium.png"/> <elem name="zoom"> Большое изображение</elem></block>
<elem name="price"> <elem name="price-value" value="33700"/><elem>
<elem name="order-btn">Заказать<elem>
<elem name="info"> Хорошо держит форму...</elem>
...109
„Заказывать товары можно только с некоторых страниц
o_O`
110
Файловая структура
Пример
› bem create level blocks-store
112
blocks/ ├─ product/ └─ illustration/blocks-store/
113
blocks/ ├─ product/ └─ illustration/blocks-store/ └─ product/
114
blocks/ ├─ product/ └─ illustration/blocks-store/ └─ product/ ├─ product.bemhtml ├─ product.sass └─ product.js
115
blocks/ ├─ product/ └─ illustration/blocks-store/ └─ product/ ├─ order-btn/ └─ product__order-btn.sass └─ ...
116
117
blocks/ ├─ product/ └─ illustration/blocks-store/ ├─ product/ ├─ order-btn/ └─ ... └─ button/ ├─ button.js └─ button.sass
118
› bem build [...] -o pages/store -n store --tech=sass --tech=js --level=blocks --level=blocks-store
119
› bem build [...] -o pages/store -n store --tech=sass --tech=js --level=blocks --level=blocks-store
120
pages/ ├─ index/ └─ store/ ├─ store.html ├─ store.css ├─ store.sass └─ store.js
121
/* store.sass */
@import url(blocks/product/product.css);@import url(blocks-store/product/product.sass);@import url(blocks/product/title/...);@import url(blocks/product/picture/...);@import url(blocks-store/product/order-btn/...);@import url(blocks-store/button/button.sass);...@import url(blocks/illustration/illustration.css);@import url(blocks/illustration/image/...);...
122
Что-то еще?
124
125
126
127
Материалы
bem.infogithub.com/bem
Материалы
129
Разработчик интерфейсов
Владимир Варанкин
github.com/narqo