Skip to content

CSS中的BEM命名规范

Bem 是块(block)、元素(element)、修饰符(modifier)的简写,由 Yandex 团队提出的一种前端 CSS 命名方法论。

划线

-中划线

仅作为连字符使用,表示某个块或者某个子元素的多单词之间的连接记号。

__双下划线

双下划线用来连接块和块的子元素

_单下划线

单下划线用来描述一个块或者块的子元素的一种状态

BEM是一个简单又非常有用的命名约定。让你的前端代码更容易阅读和理解,更容易协作,更容易控制,更加健壮和明确,而且更加严密。

BEM命名模式

BEM命名约定的模式是:

css
.block {}
.block__element {}
.block--modifier {}

每一个块(block)名应该有一个命名空间(前缀):

  • block代表了更高级别的抽象或组件。
  • block__element 代表 .block 的后代,用于形成一个完整的 .block 的整体。
  • block--modifier 代表 .block 的不同状态或不同版本。

使用两个连字符和下划线而不是一个,是为了让你自己的块可以用单个连字符来界定。如:

css
.sub-block__element {}
.sub-block--modifier {}

如何使用 BEM 命名法

什么时候应该用 BEM 格式

  • 使用 BEM 的诀窍是,你要知道什么时候哪些东西是应该写成 BEM 格式的。
  • 并不是每个地方都应该使用 BEM 命名方式。当需要明确关联性的模块关系时,应当使用 BEM 格式。
  • 比如只是一条公共的单独的样式,就没有使用 BEM 格式的意义:
css
.hide {
    display: none !important;
}

在 CSS 预处理器中使用 BEM 格式

  • BEM 的一个槽点是,命名方式长而难看,书写不雅。相比 BEM 格式带来的便利来说,我们应客观看待。
  • 而且,一般来说会使用通过 LESS/SASS 等预处理器语言来编写 CSS,利用其语言特性书写起来要简单很多。
css
.header {
    max-width: 1200px;
    &__body {
        padding: 20px;
    }
    &__button {
        padding: 5px 8px;
        &--primary {background: blue;}
        &--success {background: green;}
    }
}

PBEM

PBEM 和 BEM 的区别在于使用了前缀 prefix,以 TDesign 为例,常见的 class 为 t-header 之类。

总结

BEM只是人为提出来的一种规范,在团队作战当中,他可以起到类似于ESlint这样的功能,做命名的约束。

Released under the MIT License.