Варвара Степанова "БЭМ и javascript: Сборник рецептов"

88
Я.Субботник, Москва, 8 сентября 2012 года Варя Степанова руководитель группы разработки интерфейсов БЭМ и JavaScript: Сборник рецептов

Upload: yandex

Post on 14-Jun-2015

1.749 views

Category:

Documents


11 download

DESCRIPTION

Многие темы удобнее и интереснее изучать с помощью разных небольших примеров конкретных решений задач. Написание JavaScript для браузера с использованием i-bem.js – не исключение. Разберём задачи, основанные на реальной практике разных проектов Яндекса.

TRANSCRIPT

Page 1: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Я.Субботник, Москва, 8 сентября 2012 года

Варя Степановаруководитель группы разработки интерфейсов

БЭМ и JavaScript: Сборник рецептов

Page 3: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Вложенные блоки

Page 4: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

4

Блоки b-menu-*

Page 5: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

4

Блоки b-menu-*

Page 6: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

5

Как работает b-menu-*?

this .trigger(‘current’);

Page 7: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

6

b-seach

Page 8: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

,nd*() методы

7

внутри

снаружи

на себе

Page 9: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl('b-search', { onSetMod: { 'js': { 'inited': function() { this .findBlockInside( 'b-menu-vert') .on( 'current', this.doSmth() ); } } }}

8

Page 10: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

...<div class="b-search__filter">

<div class="b-menu-vert i-bem" onclick="..."> ... </div>

</div>...

9

Page 11: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

...

<div class="b-menu-vert i-bem b-search__filter" onclick="..."> ...</div>

...

10

Page 12: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

this .findBlockInside( this.elem('filter'), 'b-menu-vert') .on('current', this.doSmth());

11

Page 13: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

bit.ly/NfYdTa

12

Пример реиспользования меню

Page 14: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Декларативность

Page 15: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Декларативность в архитектуре

Page 16: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

bit.ly/OptXT5

15

Презентация про Кнопочку на РИТ 2012

Page 17: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

16

Состояния кнопки

Page 18: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

16

Состояния кнопки

Page 19: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl('b-form-button', { onSetMod : {

'focused' : {

'yes' : function() {

... this .bindTo('keydown', this._onKeyDown) .elem('input').focus();

17

Page 20: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

18

b-map & i-geo-point

Page 21: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

{ block: 'b-map',

mods: { ... },

js: { ... center: [ 37.58, 55.73 ], zoom: 16, points: [ ... ] }

}

19

Page 22: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

bit.ly/RdKGNA

20

Пример Яндекс.Карты на БЭМ

Page 23: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Переопределение уровнем

Page 24: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Переопределение в CSS

22

Page 25: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

library/blocks/b-head/b-head.css-----------------------------------------

.b-head { color: red; }

Переопределение в CSS

22

Page 26: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

library/blocks/b-head/b-head.css-----------------------------------------

.b-head { color: red; }

blocks/b-head/b-head.css-----------------------------------------

.b-head { color: green; }

Переопределение в CSS

22

Page 27: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Переопределение динамического метода

Page 28: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

b-9ash

24

Page 29: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

b-9ash

24

Page 30: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

getDefaultParams : function() {

return {

version : '10.0.0', width : '100%', height : '100%', attributes : {}, ... };

}

25

Page 31: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

getDefaultParams : function() {

return {

version : '10.0.0', width : '50%', height : '50%', attributes : {}, ... };

}

26

Page 32: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

getDefaultParams : function() {

return $.extend( this.__base(), { width: '50%', height: '50%' } );

}

27

Page 33: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Переопределение статического свойства

Page 34: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

b-serp

29

Page 35: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

b-serp

29

Page 36: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl('b-serp', { // динамические поля}, { blocks: []});

blocks-common/b-serp/b-serp.js

30

Page 37: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

blocks/b-serp/b-serp.jsBEM.DOM.decl('b-serp', {}, { blocks: [ 'b-form-input', 'b-adv', 'b-serp-list', 'b-more', 'b-feet' ]});

blocks-new/b-serp/b-serp.jsBEM.DOM.decl('b-serp', {}, { blocks: [ 'b-form-input', 'b-adv', 'b-filters', 'b-serp2-list', 'b-more', 'b-feet' ]});

31

Page 38: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Переопределение модификатором

Page 39: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

b-form-input

33

Page 40: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

b-form-inputb-form-input_autocomplete_yes

34

Page 41: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl('b-form-input', { onSetMod : { 'js' : { 'inited' : function() { // инициализация } }, 'focused' : { 'yes' : { // что делать, когда в фокусе } } }}

35

Page 42: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

36

Page 43: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl({ block: 'b-form-input', modName: 'autocomplete', modVal: 'yes' },

36

Page 44: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl({ block: 'b-form-input', modName: 'autocomplete', modVal: 'yes' }, { onSetMod: { 'js': { 'inited': function() { this.__base.apply(this, arguments); // расширение // функциональности }, ...

36

Page 45: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl({ block: 'b-form-input', modName: 'autocomplete', modVal: 'yes' }, { onSetMod: { ...

37

Page 46: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl({ block: 'b-form-input', modName: 'autocomplete', modVal: 'yes' }, { onSetMod: { ... 'focused': { 'yes': function() { this.__base(); // расширение //функциональности }, '': function() { ... }

37

Page 47: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

live-события

Page 48: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

39

Page 49: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

39

Page 50: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl('b-form-select', {...}, {

live: function() {

this.liveBindTo( 'item', 'mouseup', function() { ... }

}

});

40

Page 51: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

live-инициализация

Page 52: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

42

Page 53: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

42

Page 54: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

43

Page 55: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

43

Page 56: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

43

Page 57: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl('b-block', { ... },

{ /* Статические методы и свойства */

}

);

44

Page 58: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl('b-block', { ... },

{ live: function() { /* Когда инициализировать? */

}

}

45

Page 59: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

live: function() {

this.liveInitOnEvent(...)

.liveInitOnBlockEvent(...)

.liveInitOnBlockInsideInit(...)

.liveInitOnBlockInsideEvent(...)

.liveInitOnBlockInit(...)

}

46

Page 60: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

this

.liveBindTo('leftclick', function(e){ this._onClick(e); })

.liveBindTo( 'mouseover ... focusin', function(e) { var mod = eventsToMods[e.type]; this.setMod(mod.name, mod.val || ''); }); }

47

Page 61: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Миксование блоков

Page 62: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

<div class="b-block1 b-block2 i-bem" onclick=" return { 'b-block1': {}, 'b-block2': {} } ">

Миксование блоков

49

Page 63: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

<div class="b-domik b-c i-bem" onclick="return { 'b-domik' : {...}, 'b-c' : { .. } }"> ... <a class="b-domik__help"> Помощь </a> ...</div>

Блок сбора статистики кликов

50

Page 64: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

baseBlock

Page 65: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

52

Блоки b-menu-*

Page 66: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

52

Блоки b-menu-*

Page 67: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl('i-menu', {

onElemSetMod : {

'item' : { 'state' : { 'current' : function(...) { ... this.trigger('current'); } }

} }});

53

Page 68: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

blocks-desktop/b-menu-horiz/b-menu-horiz.jsBEM.DOM.decl( { name: 'b-menu-horiz', baseBlock: 'i-menu' });

blocks-desktop/b-menu-vert/b-menu-vert.jsBEM.DOM.decl( { name: 'b-menu-vert', baseBlock: 'i-menu' });

54

Page 69: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

55

bit.ly/Tq5aU4Блок i-menu

Page 70: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Распределённый :-) блок

Page 71: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Один и тот же блок

57

Page 72: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

<div class="b-my-block i-bem" onclick="return { 'b-my-block' : { 'id' : 'myBlockId' } }"> <!-- smth --> </div>

<div class="b-my-block i-bem" onclick="return { 'b-my-block' : { 'id' : 'myBlockId' } }”> <!-- smth else --> </div>

58

Page 73: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

b-tabbed-pane

59

Page 74: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

<div class="b-tabbed-pane b-tabbed-pane__tabs i-bem" onclick="return {'b-tabbed-pane':{'id':'myTabbedPaneId'}}">

<div class="b-tabbed-pane b-tabbed-pane__panels i-bem" onclick="return {'b-tabbed-pane':{'id':'myTabbedPaneId'}}">

60

Page 75: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

Блок без DOM-представления

Page 76: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.decl('i-system', {

// динамические поля

}, {

// статические поля

});

62

Page 77: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.decl('i-system', {

// динамические поля

}, {

// статические поля

});

BEM.DOM.decl(...)

62

Page 78: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

channel

Page 79: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.channel('channelName');

BEM .channel('channelName') .trigger('event');

BEM.channel('channelName').on();

BEM.channel('channelName').un();

channel API

64

Page 80: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

var channel = BEM.channel('sys');

BEM.decl('i-system', {}, {

// каждые 50 милисекунд channel.trigger('tick');

// если активности нет channel.trigger('idle');

// при mousemove и keydown channel.trigger('wakeup');

});

65

Page 81: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

BEM.DOM.decl('b-form-input', { 'js' : { 'inited' : function() { ... var sys = this.channel('sys').on({ 'tick' : update, 'idle' : function() { сhannel.un('tick', update); }, 'wakeup' : function() { сhannel.on('tick', update); } }); } },

66

Page 82: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

67

Page 83: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

update = function () { var inst, i = 0; while(inst = inst[i++]) inst.val(in.elem('input').val());}

67

Page 84: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

update = function () { var inst, i = 0; while(inst = inst[i++]) inst.val(in.elem('input').val());}

BEM.DOM.decl('b-form-input', { ...

67

Page 85: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

update = function () { var inst, i = 0; while(inst = inst[i++]) inst.val(in.elem('input').val());}

BEM.DOM.decl('b-form-input', { ... val : function(val, data) { if (val != oldVal) this.trigger('change', data); } ...});

67

Page 86: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

bit.ly/OVJHhsБлок i-system, c примером

68

Page 87: Варвара Степанова "БЭМ и JavaScript: Сборник рецептов"

69