css по БЕМ

44
CSS по БЕМ Руслан Хомяк, 1

Upload: studio-stfalconcom

Post on 06-Apr-2017

136 views

Category:

Education


0 download

TRANSCRIPT

Page 1: CSS по БЕМ

CSS по БЕМРуслан Хомяк,

1

Page 2: CSS по БЕМ

CSS до БЕМ#header div span a {...}

.content .container div span p {...}

.wrapper form .line input {...}

div.footer.black ul li span {...}

.main-content div div a {...}

footer div > div p a.button {...}

01.

02.

03.

04.

05.

06.

2

Page 3: CSS по БЕМ

3

Page 4: CSS по БЕМ

БЕМ (Блок, Елемент, Модифікатор) — методологія, яка забезпечує

компонентний підхід до веб-розробки. В її основі лежить принцип розділу

інтерфейсу на незалежні блоки. Це дозволяє легко і швидко розробляти

інтерфейси будь-якої складності і повторно використовувати існуючий

код.

4

Page 5: CSS по БЕМ

БлокЛогічно і функціонально абсолютно незалежний компонент сторінки, який

є самодостатнім і може бути використаний в будь-якому місці проекту,

при цьому не втрачаючи свого смислу.

5

Page 6: CSS по БЕМ

Особливості блоку1. Назва повинна характерезувати смисл блоку, а не його стан.

2. Блок не повинен впливати на своє оточення (відступи, позиціонування).

6

Page 7: CSS по БЕМ

Приклад блоку<!-- Правильно. Семантично осмислений блок 'logo' -->

<div class="logo"></div>

<!-- Неправильно. Описано зовнішній вигляд -->

<div class="top-big-logo"></div>

7

Page 8: CSS по БЕМ

Принцип роботи з блоками

Вкладеність

1. Блоки можна вкладати один в одного.

2. Дозволяється будь-яка вкладеність блоків.

8

Page 9: CSS по БЕМ

<header class="header">

<nav class="menu">

</nav>

</header>

HTML реалізація блоків

<div class="logo"></div>

<ul class="submenu"></ul>

<div class="search"></div>

01.

02.

03.

04.

05.

06.

07.

9

Page 10: CSS по БЕМ

CSS реалізація блоків<!-- Правильно. Всі блоки абсолютно незалежні. Можуть бути використані у

будь-якому місці проекту. -->

.header {...}

.logo {...}

.menu {...}

.submenu {...}

.search {...}

01.

02.

03.

04.

05.

10

Page 11: CSS по БЕМ

CSS реалізація блоків<!-- Неправильно. Блоки залежні від своїх батьків і не можуть бути

використаними без них. -->

.header .logo {...}

.header .menu {...}

.header .menu .submenu {...}

.header .search {...}

01.

02.

03.

04.

11

Page 12: CSS по БЕМ

ЕлементЧастина блоку, яка зв'язана з ним по смислу і функціонально. Елемент не

може використовуватись без блоку до якого відноситься.

12

Page 13: CSS по БЕМ

Особливості елементу1. Назва повинна характерезувати смисл елементу, а не його стан.

2. Ім'я елементу відділяється від імені блоку двома підресленнями.

13

Page 14: CSS по БЕМ

<div class="product">

</div>

Приклад елементів

<img class="product__picture">

<h4 class="product__name"></h4>

<span class="product__price"></span>

<button class="product__order"></button>

01.

02.

03.

04.

05.

06.

14

Page 15: CSS по БЕМ

Принципи роботи з елементами1. Вкладеність

2. Належність

3. Необов'язковість

15

Page 16: CSS по БЕМ

Вкладеність елементів1. Елементи можна вкладати один в одного.

2. Дозволяється будь-яка вкладеність елементів.

3. Елемент - це завжди частина блоку, тобто він не може бути частиною

іншого елементу.

16

Page 17: CSS по БЕМ

<div class="product">

<div class="product__info">

</div>

<div class="product__action">

</div>

</div>

HTML реалізація елементів<!-- Правильно. Структура назви елементів відповідає схемі: 'block-name__element-name' -->

<img class="product__picture">

<h4 class="product__name"></h4>

<span class="product__price"></span>

<a href="#" class="product__view"></a>

<button class="product__order"></button>

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

17

Page 18: CSS по БЕМ

CSS реалізація елементів<!-- Правильно. Елементи знаходяться на одному рівні. -->

.product {...}

.product__picture {...}

.product__info {...}

.product__name {...}

.product__price {...}

.product__action {...}

.product__view {...}

.product__order {...}

Це дозволяє змінювати DOM-структуру без внесення змін в коді кожного окремого елементу.

01.

02.

03.

04.

05.

06.

07.

08.

18

Page 19: CSS по БЕМ

CSS реалізація елементів<!-- Неправильно. Присутній каскад для елементів. -->

.product {...}

.product__picture {...}

.product__info .product__name {...}

.product__info .product__price {...}

.product__action {...}

.product__action .product__view {...}

.product__action .product__order {...}

01.

02.

03.

04.

05.

06.

07.

19

Page 20: CSS по БЕМ

<div class="product">

<div class="product__info">

</div>

<div class="product__action">

</div>

</div>

HTML реалізація елементів<!-- Неправильно. Структура назви елементів не відповідає схемі: 'block-name__element-name' -->

<img class="product__picture">

<h4 class="product__info__name"></h4>

<span class="product__info__price"></span>

<a href="#" class="product__action__view"></a>

<button class="product__action__order"></button>

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

20

Page 21: CSS по БЕМ

<div class="product">

<div class="product__info">

</div>

<div class="product__action">

</div>

</div>

<!-- Неправильно. Структура назви елементів не відповідає схемі: 'block-name__element-name' -->

<img class="product__picture">

<h4 class="product__info__name"></h4>

<span class="product__info__description"></span>

<span class="product__info__price">

<span class="product__info__price__old"></span>

<span class="product__info__price__new"></span>

</span>

<a href="#" class="product__action__view"></a>

<button class="product__action__order"></button>

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

12.

13.

14.

15.

21

Page 22: CSS по БЕМ

Належність елементівЕлемент - це завжди частина блоку, він не повинен використовуватись

окремо від нього.

22

Page 23: CSS по БЕМ

<div class="product">

</div>

HTML реалізація<!-- Правильно. Елементи лежать всередині блоку 'product'. -->

<img class="product__picture">

<h4 class="product__name"></h4>

<span class="product__price"></span>

<button class="product__order"></button>

01.

02.

03.

04.

05.

06.

23

Page 24: CSS по БЕМ

<div class="product">

</div>

HTML реалізація<!-- Неправильно. Елементи лежать поза блоком 'product'. -->

<span class="product__price"></span>

<button class="product__order"></button>

<img class="product__picture">

<h4 class="product__name"></h4>

01.

02.

03.

04.

05.

06.

24

Page 25: CSS по БЕМ

<footer class="footer">

</div>

Необов'язковість елементівЕлемент - необов'язкова частина блоку. Не у всіх блоків, повинні бути

елементи.

Наприклад:

<nav class="menu"></nav>

<ul class="social"></ul>

01.

02.

03.

04.

25

Page 26: CSS по БЕМ

Це блок чи елемент?

26

Page 27: CSS по БЕМ

<div class="product">

</div>

Можна легко змінити елемент на блок абонавпаки

<img class="illustration product__picture">

<h4 class="product__name"></h4>

<span class="product__price"></span>

<button class="product__order"></button>

01.

02.

03.

04.

05.

06.

27

Page 28: CSS по БЕМ

МодифікаторСутність, яка визначає зовнішній вигляд, стан або поведінку блоку чи

елементу і не може бути викорстана окремо від них. Модифікатор має ім'я

і може мати значення. У блоку або елементу, може бути декілька

модифікаторів одночасно.

28

Page 29: CSS по БЕМ

Особливості модифікаторів1. Назва повинна характерезувати зовнішній вигляд, стан, або поведінку.

2. Ім'я модифікатора відділяється від імені блоку чи елементу одним

підкресленням.

29

Page 30: CSS по БЕМ

Типи модифікаторів1. Булевий

2. Ключ-значення

<!-- Блок 'button' має булевий модифікатор 'disabled' -->

<button class="button button_disabled"></button>

<!-- Блок 'button' має модифікатор 'size' зі значенням 's' -->

<button class="button button_size_s"></button>

30

Page 31: CSS по БЕМ

Префікси1. b- (block) - для позначення звичайного блоку.

2. h- (holster) - для задавання відступів групі блоків.

3. l- (layout) - для розташування інших блоків.

4. g- (global) - для глобальних модифікаторів.

5. js- (JavaScript) - для блоків, які використовують JavaScript.

6. ...

<!-- Приклад використання префіксів -->

<div class="b-button"></div>

<div class="g-clearfix"></div>

З розвитком БЕМ, Яндекс відмовився від префіксів.

31

Page 32: CSS по БЕМ

МіксЦе прийом, який дозволяє використовувати різні БЕМ-сутності на одному

DOM-вузлі.

32

Page 33: CSS по БЕМ

Мікси дозволяють1. Поєднувати поведінку і стилі декількох сутностей без дублювання коду.

2. Створювати семантично нові компоненти інтерфейсу на основі тих, які вже

є.

33

Page 34: CSS по БЕМ

header__logo

header__menu

header__search

HTML реалізація міксів<header class="header">

<div class="logo "></div>

<nav class="menu ">

<ul class="submenu"></ul>

</nav>

<div class="search "></div>

</header>

01.

02.

03.

04.

05.

06.

07.

34

Page 35: CSS по БЕМ

CSS реалізація міксів.header {...}

.header__logo {зовнішня геометрія, позиціювання}

.header__menu {зовнішня геометрія, позиціювання}

.header__search {зовнішня геометрія, позиціювання}

.logo {...}

.menu {...}

.submenu {...}

.search {...}

01.

02.

03.

04.

05.

06.

07.

08.

35

Page 36: CSS по БЕМ

БЕМ і препроцесори.product {

&__picture {...}

&__info {...}

&__name {...}

&__price {...}

&__action {...}

&__view {...}

&__order {...}

}

36

Page 37: CSS по БЕМ

БЕМ і CSS-каскадОсновний принцип БЕМ — незалежні блоки. Вкладені селектори

збільшують зв'язаність коду і роблять його повторне використання

неможливим. Каскад не забороняється, але не рекомендується.

37

Page 38: CSS по БЕМ

Наприклад, можна використати вкладеність для зміни теми елементів блоку:

.nav {...}

.nav_theme_light .nav__item {'зміна теми пунктів меню'}

.nav__item {...}

або коли потрібно вивести тест з WYSIWYG:

.text h2 {...}

.text p {...}

.text ul li {...}

38

Page 39: CSS по БЕМ

Які переваги надає БЕМ• Незалежні блоки

• Семантика

• Відсутність колізій

• Структурованість коду

• Масштабування

• Зменшується час на розробку та підтримку проекту

• Поріг входу на проект мінімальний

39

Page 40: CSS по БЕМ

Як перейти на CSS по БЕМ• Не використовувати id та теги для селекторів

• Абстрагуватись від DOM-моделі і навчитись створювати блоки

• Мінімізувати кількість вкладених селекторів

• Використовувати правила по іменуванню CSS-класів

• Використовувати мікси

• Повторно використовувати блоки

40

Page 41: CSS по БЕМ

Чому не можна використовувати теги або тегі клас для селекторів<a class="button button_active"></a>

a.button {...}

a.button_active {...}

З розвитком проекту можуть з'явитись блоки input.button, span.button,

button.button

41

Page 42: CSS по БЕМ

42

Page 43: CSS по БЕМ

https://ru.bem.info/

43

Page 44: CSS по БЕМ

Дякую за увагу

44