三分钟学会 BEM 命名法
BEM 指的是 Block、Element、Modifier,BEM 命名法把 CSS 类名归纳为这三种类型。
Block
封装一个具有独立意义的实体,如 header、 container、 menu、 checkbox、input。
Block可以相互嵌套,但是在语意上让他们保持相互的独立,没有优先级或层次结构。
命名
由字母、数字和破折号组成。
.list {}
.cate-list {}
注意点
- 仅使用类名选择器,不能使用标签名或 ID
- 不依赖页面上的其他 Block/Elements,不存在级联选择器
<div class="block">...</div>
// bad
.block-a .block-b {}
// good
.block {}
允许以下这种情况:
.category {}
.category-tab {}
.category-main {}
.category-banner {}
注意,这种情况存在合理的,因为:
- 组件复杂、颗粒度大,可以拆分独立重复使用的模块
- 这相当于css 命名上拆成了4 个组件,使用者其实不关心内部的css 命名,bem 主要能解决样式重名的问题就好
Element
在给定的 Block 内的任何 DOM 都可以成为一个 Element,在语意上属于 Block 的一部分,如 menu item、 list item、checkbox caption、header title。
命名
由 Block 名称加两个下划线加 Element 名称构成,Element 名称同样支持字母、数字、破折号。
.block__element {}
.block__element-val {}
注意点
- 仅使用类名选择器,不能使用标签名或 ID
- 不依赖页面上的其他 Block/Elements,不存在级联选择器
- 可以基于 Block 的状态进行行为改变
<div class="block">
<span class="block__elem"></span>
</div>
// bad
.block .block__elem {}
// good
.block__elem {}
// good:基于 block 状态变化的 elem
.block--mod .block__elem {}
Modifier
指向 Block 或者 Element 的状态修饰,用来改变外观或行为,如 disabled、 highlighted、 checked、 fixed、 size big、color yellow。
命名
由 Block 或 Element 的命名加上两个破折号加上 Modifier 名称。
.block--mod {}
.block__element--mod {}
注意点
- 作为 Block、Element 的类名中额外的扩展,不能单独使用
<div class="block block--mod">
<div class="block__elem">...</div>
</div>
<div class="block block--size-big block--color-red">...</div>
// bad
.block--color--red {}
// good:作为 block 的状态修饰
.block--color-red {}
// good:作为 elem 的状态修饰
.block__elem--mod {}
优点
模块化
Block 样式不需要依赖页面上的其他元素,每个Block 样式都是独立的。
重用性
以不同的方式组成独立的 Blocks,减少可维护css代码量。
在复用样式的时候,完全可以直接迁移,而不考虑是否有级联样式的遗漏。
结构化
如果样式命名符合 BEM 命名法的规则,那么从 CSS 代码分析就可以快速了解对应的 HTML DOM 结构。