CSS 架构模式之 BEM

BEM 是由 Yandex 团队提出的一种 CSS 命名方法论,即 Block(块)、Element(元素)、和 Modifier(修改器)的简称,是 OOCSS 方法论的一种实现模式,底层仍然是面向对象的思想。

Element PlusTabs 组件进行讲解 BEM 的核心思想。

那么整一个组件模块就是一个 Block(块),classname 取名为:el-tabsBlock 代表一个逻辑或功能独立的组件,是一系列结构、表现和行为的封装。

其中每个一个切换的标签就是一个 Element(元素),classname 取名为:el-tabs__item。Element(元素)可以理解为块里的元素。

Modifier(修改器)用于描述一个 Block 或者 Element 的表现或者行为。例如我们需要对两个 Block(块) 或者两个 Element(元素)进行样式微调,那么我们就需要通过 Modifier(修改器),Modifier(修改器)只能作用于 Block(块)或者 Element(元素),Modifier(修改器)是不能单独存在的。

例如按钮组件的 classname 取名为 el-button,但它有不通过状态譬如:primarysuccessinfo,那么就通过 Modifier(修改器)进行区分,classname 分别为: el-button--primaryel-button--successel-button--info。从这里也可以看出 BEM 本质上就是 OOCSS,基础样式都封装为 el-button,然后通过继承 el-button 的样式,可以拓展不同的类,例如:el-button--primaryel-button--successel-button--info

BEM 规范下 classname 的命名格式

block-name__<element-name>--<modifier-name>_<modifier_value>
  • 所有实体的命名均使用小写字母,复合词使用连字符 “-” 连接。
  • BlockElement 之间使用双下画线 “__” 连接。
  • MofifierBlock/Element 使用双连接符 “--” 连接。
  • modifier-namemodifier_value 之间使用单下画线 “_” 连接。

Element Plus 的 Form 表单的 HTML 结构

<form class="el-form">
    <div class="el-form-item">
        <label class="el-form-item__label">名称:</label>
        <div class="el-form-item__content">
            <div class="el-input">
                <div class="el-input__wrapper">
                    <input class="el-input__inner" />
                </div>
            </div>
        </div>
    </div>
</form>

通过 JS 生成 BEM 规范名称

在编写组件的时候如果通过手写 classname 的名称,那么需要经常写 el-__--,那么就会变得非常繁琐,通过上文我们可以知道 BEM 命名规范是具有一定规律性的,所以我们可以通过 JavaScript 按照 BEM 命名规范进行动态生成。

贡献者: huxiguo