基本概念
CSS 的命名规范又叫做BEM规范,为的是结束混乱的命名方式,达到一个语义化的CSS命名方式。
BEM是三个单词的缩写:Block(块)代表更高级别的抽象或组件,Element(元素) Block的后代,以及Modifier(修饰) 不同状态的修饰符。
命名方法:
.block__element--modifier {
display: flex;
}
.block--modifier {
display: flex;
}
.block__element {
display: flex;
}
<p class="header">
<p class="header__body">
<button class="header__button--primary"></button>
<button class="header__button--default"></button>
</p>
</p>
通过BEM的命名规范我们可以达到一个什么目的呢?就是有一个清晰的描述,从上面的代码中我们可以看到一层一层的清晰明了,而且有一个清晰的结构。
1 block
block 代表一个更高级别的抽象或者是一个组件,它仅仅作为一个边界。它主要的功能有下面三点:
负责描述功能的,不应该包含状态。
/* correct */
.header {
}
/* wrong */
.header--select {
}
不影响自身布局,不包含具体的样式,也就是block里面不应该加样式
/* correct */
.header {
}
/* wrong */
.header {
margin-top: 50px;
}
不能使用元素选择器和ID选择器
/* correct */
.header {
}
/* wrong */
.header a {
margin-top: 50px;
}
2 Element
是用一个双下划线隔开
/* correct */
.header__body {
margin-top: 50px;
}
/* wrong */
.header .body {
margin-top: 50px;
}
表示的是目的,而不是状态,如下例子:目的是在header下面定义三个区域 body、logo、title,但是并没有指定任何状态。
.header__body {
margin-top: 50px;
}
.header__logo {
margin-top: 50px;
}
.header__title {
margin-top: 50px;
}
不能脱离Block父级单独使用
/* correct */
<p class="header">
<p class="header__body">
<button class="header__button--primary"></button>
<button class="header__button--default"></button>
</p>
</p>
/* wrong */
<p>
<p class="header__body">
<button class="header__button--primary"></button>
<button class="header__button--default"></button>
</p>
</p>
3 Modifier
表示的是一个状态,是用双横杠分开的。
.header__button--default {
background: none;
}
Boolean
.header__button--select {
background: none;
}
枚举
.header__button--primary {
background: #329FD9;
}
不能单独使用
/* correct */
<p class="header">
<p class="header__body">
<button class="header__button--primary"></button>
<button class="header__button--default"></button>
</p>
</p>
/* wrong */
<p>
<p>
<button class="header__button--primary"></button>
<button class="header__button--default"></button>
</p>
</p>
BEM在预处理器语言中的使用
在Sass中的使用
.header {
&__body {
padding: 20px;
}
&__button {
&--primary {
background: #329FD9;
}
&--default {
background: none;
}
}
}
在Less中的使用
@classname: header;
.@{classname} {
.@{classname}__body {
padding: 20px;
}
.@{classname}__button {
.@{classname}__button--primary {
background: #329FD9;
}
.@{classname}__button--default {
background: none;
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。