The document introduces the BEM (Block, Element, Modifier) methodology for organizing CSS, HTML, and JavaScript code into reusable components. It describes BEM as a semantic model that defines blocks, elements, and modifiers to structure interfaces. Blocks are standalone parts of an interface, elements are integral parts of blocks, and modifiers define block/element properties or states. The document provides examples of BEM naming conventions and discusses benefits like improved reusability, reduced specificity issues, and serving as a common language for designers and developers.
Report
Share
Report
Share
1 of 60
Download to read offline
More Related Content
BEM It! for Brandwatch
1. BEM it!
Introduction to BEM Methodology
by Max Shirshin
Frontend Team Lead, Deltamethod
Consultant, Yandex
3. 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.
4. Frameworks are not enough
● ≈ 8,500 packages in Bower registry
● JavaScript:
the most popular language on GitHub
Repositories created:
≈ 264,000 in 2013
≈ 296,000 in 2012
6. 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.
7. 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
9. What is BEM?
BLOCK
– Standalone part of an interface:
● button
● text field
● flyout
● heading
● menu
10. What is BEM?
BLOCK
– Standalone part of an interface:
● button
● text field
● flyout
● heading
● menu
– Re-usable in different contexts
– Self-sufficient
11. What is BEM?
ELEMENT
– An integral part of a block:
● button
● text field
● flyout
● heading
● menu
12. What is BEM?
ELEMENT
– An integral part of a block:
● button — contains no elements
● text field label
● flyout title
● heading logo
● menu item
13. 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
14. What is BEM?
MODIFIER
– Defines property or state on a block or element:
● button
● text field
● flyout
● heading
● menu item
15. 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
16. 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
17. BEM forms a semantic overlay over the
existing DOM structure.
This overlay is called a BEM tree.
19. 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
20. BEM HOWTO
for your beloved project
with benefits explained
31. BEM CSS: best practices
1. Map the whole document to BEM blocks
2. No CSS outside of blocks
3. Independent blocks → no CSS resets
32. Benefits!
Drop tag names and IDs
● Faster selectors
● Re-use same semantics on any tag:
— <DIV class=”b-block”>
— <SPAN class=”b-block”>
— <TABLE class=”b-block”>
33. 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>
34. 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>
35. 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?
36. Benefits!
Bye-bye CSS cascade?!
...well, not exactly.
Example of an element affected by a block modifier:
/* theme menu items for a dark theme */
.b-menu_theme_dark .b-menu__item
{
color: white;
background-color: darkgray;
}
45. JavaScript
jQuery BEM helpers
https://github.com/ingdir/jquery-bemhelpers
● Helper methods to work with BEM modifiers
● Callbacks on modifiers set/change
46. JavaScript
jQuery BEM helpers
// find a block with jQuery selectors
var $block = component.find('div');
// assign a callback to a modifier change
$block.onSetMod('b-block', {
status: {
loaded: myCallback
}
});
/* ... */
$block.setMod('b-block', 'status', 'loaded');
// 1. adds a CSS class b-block_status_loaded
// 2. runs myCallback()
47. JavaScript
jQuery BEM plugin
http://xslc.org/jquery-bem/
● Extends jQuery Sizzle with selectors for BEM
entities (mix them with “normal” selectors)
● Add callbacks on modifiers set/change
● Supports methods tied to blocks/elements
48. JavaScript
i-bem.js framework by Yandex + tutorial
https://github.com/toivonen/bem-js-tutorial
● First English draft docs (expect more!)
● 100% BEM-based declarative API
● Part of a larger bem-core library
53. 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
55. File and folder structure
Flat block structure with a folder for each block.
Simple structure for BEM beginners:
/b-block
block.css
block.js
block.tpl
...whatever you need
56. 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
59. 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
60. Thank you Brandwatch!
max.shirshin@gmail.com google.com/+MaxShirshin
@ingdir maxshirshin