Skip to content

命名规范

项目规范 - BEM 规范

使用 BEM 命名规范,理论上讲,每行 CSS 代码都只有一个选择器。

BEM 代表 “块(block),元素(element),**修饰符(modifier)”,我们常用这三个实体开发组件。

在选择器中,由以下三种符号来表示扩展的关系:

bash
-   中划线 :仅作为连字符使用,表示某个块或者某个子元素的多单词之间的连接记号。
__  双下划线:双下划线用来连接块和块的子元素
_   单下划线:单下划线用来描述一个块或者块的子元素的一种状态

type-block__element_modifier

块(block)

一个块是设计或布局的一部分,它有具体且唯一地意义 ,要么是语义上的要么是视觉上的。

在大多数情况下,任何独立的页面元素(或复杂或简单)都可以被视作一个块。它的 HTML 容器会有一个唯一的 CSS 类名,也就是这个块的名字。

针对块的 CSS 类名会加一些前缀( UI-),这些前缀在 CSS 中有类似命名空间的作用。

一个块的正式(实际上是半正式的)定义有下面三个基本原则:

  • CSS 中只能使用类名(不能是 ID)。
  • 每一个块名应该有一个命名空间(前缀)。
  • 每一条 CSS 规则必须属于一个块。

例如:一个自定义列表 .list 是一个块,通常自定义列表是算在 mod 类别的,在这种情况下,一个 list 列表的 block 写法应该为:

bash
.list

元素(element)

块中的子元素是块的子元素,并且子元素的子元素在 bem 里也被认为是块的直接子元素。一个块中元素的类名必须用父级块的名称作为前缀

如上面的例子,li.item 是列表的一个子元素

css
.list {
}
.list .item {
}

.list {
}
.list__item {
}

修饰符(modifier)

一个“修饰符”可以理解为一个块的特定状态,标识着它持有一个特定的属性。

用一个例子来解释最好不过了。一个表示按钮的块默认有三个大小:小,中,大。为了避免创建三个不同的块,最好是在块上加修饰符。这个修饰符应该有个名字(比如:size )和值( small,normal 或者 big )。

如上面的例子中,表示一个选中的列表,和一个激活的列表项

css
.list {
}
.list.select {
}
.list .item {
}
.list .item.active {
}

.list {
}
.list_select {
}
.list__item {
}
.list__item_active {
}

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

  • BEM 的一个槽点是,命名方式长而难看,书写不雅。相比 BEM 格式带来的便利来说,我们应客观看待。

  • 而且,一般来说会使用通过 Less/Sass 等预处理器语言来编写 CSS,利用其语言特性书写起来要简单很多。

    以 Less 为例:

    css
    .article {
      max-width: 1200px;
      &__body {
        padding: 20px;
      }
      &__button {
        padding: 5px 8px;
        &--primary {
          background: blue;
        }
        &--success {
          background: green;
        }
      }
    }

注意

层级最后不要超过 4 级,不然增加阅读的理解难度

好处

组件之间的完全解耦,不会造成命名空间的污染,如:.mod-xxx ul li 的写法带来的潜在的嵌套风险。

性能

BEM 命名会使得 Class 类名变长,但经过 gzip 压缩后这个带宽开销可以忽略不计