BEM it! Introduction to BEM

1,343 views 62 slides Oct 22, 2014
Slide 1
Slide 1 of 62
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62

About This Presentation

Introduction to BEM methodology, given at SC5 on 21.10.2014


Slide Content

by Varya Stepanova
at SC5 Tuesday Streaming, 21.10.2014
BEM it!
Introduction to BEM Methodology

Why bother?

There is no unified semantic model
across different FE technologies
●HTML stands for hypertext
I've heard we mostly do web apps...
●CSS offers no structure out of the box
Usually a pile of rules put together. Sorry.
●JavaScript uses its own approaches.
...a new one comes with every framework.

●≈ 8,500 packages in Bower registry
●JavaScript:
the most popular language on GitHub
Repositories created:
≈ 264,000 in 2013
≈ 296,000 in 2012
Frameworks are not enough

BEM to the rescue

What is BEM?
BEM claims that simple semantic model
(Blocks, Elements, and Modifiers)
is enough to define the way you author
HTML / CSS / JavaScript, structure code
and components, set up interaction
and scale your project to build
an industry-leading service.

What is BEM?
●BEM is a methodology, not a framework
Semantic model + best practices
for all things frontend
●BEM is a fix for web app semantics
...the same as jQuery is a fix for DOM APIs
●Originally introduced by Yandex
— 19 million daily audience
— 200+ web services
— tools, code, tutorials, conferences
— open source

Some theory

What is BEM?
BLOCK
–Standalone part of an interface:
●button
●text field
●flyout
●heading
●menu

What is BEM?
BLOCK
–Standalone part of an interface:
●button
●text field
●flyout
●heading
●menu
–Re-usable in different contexts
–Self-sufficient

What is BEM?
ELEMENT
–An integral part of a block:
●button
●text field
●flyout
●heading
●menu

What is BEM?
ELEMENT
–An integral part of a block:
●button — contains no elements
●text field label
●flyout title
●heading logo
●menu item

What is BEM?
ELEMENT
–An integral part of a block:
●button — contains no elements
●text field label
●flyout title
●heading logo
●menu item
–No standalone meaning outside of a block
–Some blocks have no elements

What is BEM?
MODIFIER
–Defines property or state on a block or element:
●button
●text field
●flyout
●heading
●menu item

What is BEM?
MODIFIER
–Defines property or state on a block or element:
●button theme
●text field editable state
●flyout alignment
●heading level
●menu item bullet type

What is BEM?
MODIFIER
–Defines property or state on a block or element:
●button theme
●text field editable state
●flyout alignment
●heading level
●menu item bullet type
–Multiple modifiers may co-exist
on a single block/element

BEM forms a semantic overlay over
the existing DOM structure.
This overlay is called a BEM tree.

DOM tree → BEM tree

How does BEM map to DOM?
●Blocks/elems/mods are denoted
with CSS classes using a naming convention.
●DOM nodes can be shared:
— block1 + block2 may occupy the same
container;
— element1 + block2 may co-exist on
the same node.
●DOM is encapsulated:
— complex DOM structure may constitute
a single element

BEM HOWTO
for your beloved project
with benefits explained

HOWTO: HTML / CSS

CSS naming conventions
“BEM uses CSS class names to
denote blocks, elements and
modifiers.”

CSS naming conventions
BLOCK
.button
.text-field
.flyout
.heading
.menu
or with prefix
.b-button
.b-text-field
.b-flyout
.b-heading
.b-menu

CSS naming conventions
<ul class=”menu”>
<li>
<a href=”/more”>Read More</a>
</li>
<li>
<a href=”/buy”>Buy Online</a>
</li>
<li>
<a href=”/buy”>Contact</a>
</li>
</ul>

CSS naming conventions
ELEMENT
.button__icon
.text-field__label
.flyout__title
.heading__logo
.menu__item

CSS naming conventions
<ul class=”menu”>
<li class=”menu__item”>
<a href=”/more”>Read More</a>
</li>
<li class=”menu__item”>
<a href=”/buy”>Buy Online</a>
</li>
<li class=”menu__item”>
<a href=”/buy”>Contact</a>
</li>
</ul>

CSS naming conventions
MODIFIER
.button_theme_dark
.text-field_editable
.flyout_align_top
.heading_level_alpha
.menu__item_promo

CSS naming conventions
MODIFIER
.button--theme--dark
.text-field--editable
.flyout--align--top
.heading--level--alpha
.menu__item--promo
as you wish

CSS naming conventions
<ul class=”menu”>
<li class=”menu__item”>
<a href=”/more”>Read More</a>
</li>
<li class=”menu__item”>
<a href=”/buy”>Buy Online</a>
</li>
<li class=”menu__item”>
<a href=”/buy”>Contact</a>
</li>
</ul>

CSS naming conventions
<ul class=”menu”>
<li class=”menu__item menu__item_promo”>
<a href=”/more”>Read More</a>
</li>
<li class=”menu__item”>
<a href=”/buy”>Buy Online</a>
</li>
<li class=”menu__item”>
<a href=”/buy”>Contact</a>
</li>
</ul>

so structure
much semantics
wow
much semantics
very code
such frontend

BEM CSS: best practices
1. Map the whole document to BEM blocks
2. No CSS outside of blocks
3. Independent blocks → no global CSS resets

Benefits!
Drop tag names and IDs
●Faster selectors
●Re-use same semantics on any tag:
— <DIV class=”block”>
— <SPAN class=”block”>
— <TABLE class=”block”>

Benefits!
Bye-bye CSS cascade?!
Only one CSS class needed to:
●style a block container
●style any element within a block
●add extras/overrides with a modifier
Doesn't it cover 90% of your styling needs?

Benefits!
CSS specificity magic solved
Priority of CSS rules:
by specificity first, then by rule order
td.data { background-color: gray }
td.summary { background-color: white }
.total-summary { background-color: yellow }
<TD class="summary total-summary">
<!-- Still gray, baby :-( -->
</TD>

Benefits!
CSS specificity magic solved
Priority of CSS rules:
by specificity first, then by rule order
td.data { background-color: gray }
td.summary { background-color: white }
td.total-summary { background-color: yellow }
<TD class="summary total-summary">
<!-- This works, I'm yellow now -->
</TD>

Benefits!
Bye-bye CSS cascade?!
...well, not exactly.
Example of an element affected by a block modifier:
/* theme menu items for a dark theme */
.menu_theme_dark .menu__item
{
color: white;
background-color: darkgray;
}

HOWTO:
Block dependencies

LoginLoginpassword
Main
username
Download HelpContact

LoginLoginpassword
Main
username
Download HelpContact
headerheader
text inputtext input text inputtext input buttonbutton
menumenu

LoginLoginpassword
Main
username
Download HelpContact
_size_small _size_small _primary

LoginLoginpassword
Main
username
Download HelpContact
.header .input { font-size: 0.85em }
.header .button { background: navy }

LoginLoginpassword
Main
username
Download HelpContact
.header .input { font-size: 0.85em }
.header .button { background: navy } !

HOWTO: JavaScript

JavaScript
Components → Blocks
Work with BEM tree, not DOM tree

JavaScript deals with BEM
blockObj
blockObj.setMod('active');
// <div class=”block block_active”>
blockObj.delMod('active);
// <div class=”block”>

JavaScript deals with BEM
BlockObj.do({
'active': function() {
// do smth when active
},
'disabled': function() {
// do something when disabled
}
});

JavaScript
i-bem.js framework by Yandex + tutorial
http://bit.ly/bem-js-tutorial/
●First English docs (expect more!)
●100% BEM-based declarative API
●Part of a larger bem-core library

HTML is no longer semantic.
JavaScript is.

HOWTO: Design / UX

BEM is the universal language
for developers and designers,
the bridge across technology
gaps.

Build your block library.
The code itself is the styleguide.

UX + Frontend
●Live style guide
●Always up-to-date
●Prototyping mapped to code from
day one
●Designers and devs speak the same
language
●Good for making early estimates

HOWTO: File structure

File and folder structure
Flat block structure with a folder for each block.
Simple structure for BEM beginners:
/block
block.css
block.js
block.tpl
...whatever you need

File and folder structure
Advanced structure to expose semantics
/block
/__elem1
block__elem1.css
block__elem1.tpl
/_mod
block_mod.css
block.css
block.js
block.tpl

Bundles for browsers
page.css:
@import url(“header/header.css”);
@import url(“button/button.css”);
@import url(“button/button_promo.css”);
page.js:
/* include: button.js */
/* include: login.js */

Build process and deployment
Use a build tool!
Borschik:
an open-source build tool by Yandex
Code:
https://github.com/bem/borschik
English docs:
http://bem.info/articles/borschik

Build process and deployment
Any familiar tool can be a builder
Gulp:
Example:
https://github.com/getbem/getbem.com

BEM gives answers to:
1. Where is code for this interface object?
●CSS
●JS
●Templates
●Documentation
2.Can I remove this piece of code?
3.How do I name this new item?

http://bem.info
http://getbem.com

Thank you SC5!
@varya_en
http://varya.me
Tags