Slide 1

Slide 1 text

B__E_M

Slide 2

Slide 2 text

Hi, there! I’m Luciano Battagliero @battaglr

Slide 3

Slide 3 text

Block, Element, Modifier

Slide 4

Slide 4 text

Yandex

Slide 5

Slide 5 text

~2009

Slide 6

Slide 6 text

A little bit of context OOCSS ~2010 SMACSS ~2011

Slide 7

Slide 7 text

What is it?

Slide 8

Slide 8 text

It’s a methodology

Slide 9

Slide 9 text

Heavily complemented by a set of tools, libraries and a complete technology stack

Slide 10

Slide 10 text

At its core BEM is an unified semantic for different implementations

Slide 11

Slide 11 text

That being said, this talk will be focused mainly on CSS

Slide 12

Slide 12 text

What does BEM solve?

Slide 13

Slide 13 text

Chaos /ˈkāˌäs/ noun 1. Complete disorder and confusion

Slide 14

Slide 14 text

There are two types of problems we face in CSS

Slide 15

Slide 15 text

Layout or cosmetic problems

Slide 16

Slide 16 text

Architectural problems

Slide 17

Slide 17 text

BEM attempts to help solving architecture related problems

Slide 18

Slide 18 text

Entity

Slide 19

Slide 19 text

A generic term to refer to blocks, elements or modifiers

Slide 20

Slide 20 text

Block

Slide 21

Slide 21 text

An independent and self-sufficient component of an interface

Slide 22

Slide 22 text

Provides structure, behaviour and appearance encapsulation

Slide 23

Slide 23 text

… HTML

Slide 24

Slide 24 text

… HTML

Slide 25

Slide 25 text

.modal { … } CSS

Slide 26

Slide 26 text

Blocks must be context independent, thus they should not have direct influence over other blocks

Slide 27

Slide 27 text

… HTML

Slide 28

Slide 28 text

… HTML

Slide 29

Slide 29 text

/* Don’t do this */ .modal .btn { … } CSS

Slide 30

Slide 30 text

/* Do this */ .modal__btn { … } CSS

Slide 31

Slide 31 text

Blocks can contain other blocks

Slide 32

Slide 32 text

… HTML

Slide 33

Slide 33 text

… HTML

Slide 34

Slide 34 text

Multiple instances of a block could be used across the interface

Slide 35

Slide 35 text

… … … HTML

Slide 36

Slide 36 text

… … … HTML

Slide 37

Slide 37 text

… … … HTML

Slide 38

Slide 38 text

Element

Slide 39

Slide 39 text

An internal part of a block that can not be used outside of it

Slide 40

Slide 40 text

Elements can contain other elements or blocks

Slide 41

Slide 41 text

HTML

Slide 42

Slide 42 text

HTML

Slide 43

Slide 43 text

HTML

Slide 44

Slide 44 text

Elements should not attempt to be a representation of the DOM structure

Slide 45

Slide 45 text

HTML

Slide 46

Slide 46 text

HTML

Slide 47

Slide 47 text

HTML

Slide 48

Slide 48 text

A block may not contain any element

Slide 49

Slide 49 text

Modifier

Slide 50

Slide 50 text

A variation on the appearance or behavior of a block or an element

Slide 51

Slide 51 text

HTML

Slide 52

Slide 52 text

HTML

Slide 53

Slide 53 text

HTML

Slide 54

Slide 54 text

HTML

Slide 55

Slide 55 text

HTML

Slide 56

Slide 56 text

HTML

Slide 57

Slide 57 text

Multiple modifiers can be used simultaneously on the same block or element

Slide 58

Slide 58 text

HTML

Slide 59

Slide 59 text

HTML

Slide 60

Slide 60 text

HTML

Slide 61

Slide 61 text

Naming conventions

Slide 62

Slide 62 text

The main purpose of a class name is to be used as a hook for adding style or behaviour

Slide 63

Slide 63 text

A class name should communicate information which helps to understand its purpose

Slide 64

Slide 64 text

Remember that a class name can not be “unsemantic”[*]

Slide 65

Slide 65 text

The “official” syntax

Slide 66

Slide 66 text

/* Basic syntax */ .block__element_modifier CSS

Slide 67

Slide 67 text

/* Basic syntax */ .block__element_modifier CSS

Slide 68

Slide 68 text

/* Basic syntax */ .block__element_modifier CSS

Slide 69

Slide 69 text

/* Basic syntax */ .block__element_modifier CSS

Slide 70

Slide 70 text

/* Key-value modifier */ .block-or-element_modifier_value CSS

Slide 71

Slide 71 text

/* Key-value modifier */ .block-or-element_modifier_value CSS

Slide 72

Slide 72 text

/* Entities with compound names */ .block-name__element-name_modifier-name CSS

Slide 73

Slide 73 text

/* Entities with compound names */ .block-name__element-name_modifier-name CSS

Slide 74

Slide 74 text

/** * All possible combinations */ .block .block_modifier .block__element .block__element_modifier CSS

Slide 75

Slide 75 text

/** * Don’t do any of these */ .element .block_modifier__element .block__element__element CSS

Slide 76

Slide 76 text

The “popular” syntax

Slide 77

Slide 77 text

/* Basic syntax */ .block__element--modifier CSS

Slide 78

Slide 78 text

/* Basic syntax */ .block__element--modifier CSS

Slide 79

Slide 79 text

/* Basic syntax */ .block__element--modifier CSS

Slide 80

Slide 80 text

/* Basic syntax */ .block__element--modifier CSS

Slide 81

Slide 81 text

/* Entities with compound names */ .block-name__element-name--modifier-name CSS

Slide 82

Slide 82 text

/* Entities with compound names */ .block-name__element-name--modifier-name CSS

Slide 83

Slide 83 text

/** * All possible combinations */ .block .block--modifier .block__element .block__element--modifier CSS

Slide 84

Slide 84 text

/** * Don’t do any of these */ .element .block--modifier__element .block__element__element CSS

Slide 85

Slide 85 text

The “CamelCase” syntax

Slide 86

Slide 86 text

/* Basic syntax */ .Block-element--modifier CSS

Slide 87

Slide 87 text

/* Basic syntax */ .Block-element--modifier CSS

Slide 88

Slide 88 text

/* Basic syntax */ .Block-element--modifier CSS

Slide 89

Slide 89 text

/* Basic syntax */ .Block-element--modifier CSS

Slide 90

Slide 90 text

/* Entities with compound names */ .BlockName-elementName--modifierName CSS

Slide 91

Slide 91 text

/* Entities with compound names */ .BlockName-elementName--modifierName CSS

Slide 92

Slide 92 text

/** * All possible combinations */ .Block .Block--modifier .Block-element .Block-element--modifier CSS

Slide 93

Slide 93 text

/** * Don’t do any of these */ .element .Block--modifier-element .Block-element-element CSS

Slide 94

Slide 94 text

Syntax comparison

Slide 95

Slide 95 text

/* “Official” */ block-name__element-name_modifier-name /* “Popular” */ block-name__element-name--modifier-name /* “CamelCase” */ BlockName-elementName--modifierName CSS

Slide 96

Slide 96 text

/* “Official” */ block-name__element-name_modifier-name /* “Popular” */ block-name__element-name--modifier-name /* “CamelCase” */ BlockName-elementName--modifierName CSS

Slide 97

Slide 97 text

/* “Official” */ block-name__element-name_modifier-name /* “Popular” */ block-name__element-name--modifier-name /* “CamelCase” */ BlockName-elementName--modifierName CSS

Slide 98

Slide 98 text

/* “Official” */ block-name__element-name_modifier-name /* “Popular” */ block-name__element-name--modifier-name /* “CamelCase” */ BlockName-elementName--modifierName CSS

Slide 99

Slide 99 text

It has been scientifically proven that BEM class names are ugly

Slide 100

Slide 100 text

Mix

Slide 101

Slide 101 text

A combination of different entities on a single DOM node

Slide 102

Slide 102 text

HTML

Slide 103

Slide 103 text

HTML

Slide 104

Slide 104 text

Implementation guidelines

Slide 105

Slide 105 text

Only define entities using class selectors

Slide 106

Slide 106 text

.icon { … } CSS

Slide 107

Slide 107 text

Use descendant selectors only when needed

Slide 108

Slide 108 text

/* Don’t do this */ .menu .menu__item { … } CSS

Slide 109

Slide 109 text

/* Do this */ .menu--horizontal .menu__item { … } CSS

Slide 110

Slide 110 text

Do not use type or id selectors

Slide 111

Slide 111 text

/* Don’t do this */ button { … } CSS

Slide 112

Slide 112 text

/* Do this */ .button { … } CSS

Slide 113

Slide 113 text

/* Don’t do this */ #breadcrumb { … } CSS

Slide 114

Slide 114 text

/* Do this */ .breadcrumb { … } CSS

Slide 115

Slide 115 text

Do not declare styles outside of blocks

Slide 116

Slide 116 text

/* Don’t do this */ ul { list-style: none; } CSS

Slide 117

Slide 117 text

/* Do this */ .menu { list-style: none; } CSS

Slide 118

Slide 118 text

This usually means no global styles and no global “resets”

Slide 119

Slide 119 text

That’s just a part of it!

Slide 120

Slide 120 text

There’s a lot more about BEM. Go to bem.info and find out!

Slide 121

Slide 121 text

Questions?

Slide 122

Slide 122 text

Thanks!