CSS BEM 解读

栏目: CSS · 发布时间: 6年前

内容简介:BEM 分别代表着:Block(块)、Element(元素)、Modifier(修饰符),是一种组件化的 CSS 命名方法和规范,由俄罗斯 Yandex 团队所提出。其目的是将用户界面划分成独立的(模)块,使开发更为简单和快速,利于团队协作开发。不同的命名模式,区别在于

概要

BEM 分别代表着:Block(块)、Element(元素)、Modifier(修饰符),是一种组件化的 CSS 命名方法和规范,由俄罗斯 Yandex 团队所提出。其目的是将用户界面划分成独立的(模)块,使开发更为简单和快速,利于团队协作开发。

特点

  • 组件化/模块化的开发思路。
  • 书写方式解耦化,不会造成命名空间的污染,如: .xxx ul li 写法带来的潜在嵌套风险。
  • 命名方式化扁平,避免样式层级过多而导致的解析效率降低,渲染开销变大。
  • 组件结构独立化,减少样式冲突,可以将已开完成的组件快速应用到新项目中。
  • 有着较好的维护性、易读性、灵活性。

规则

BEM 的命名模式在社区中有着不同方式,以下为 Yandex 团队所提出的命名规则为(本文中的代码使用该规则):

.[Block 块]__[Element 元素]_[Modifier 修饰符]

不同的命名模式,区别在于 BEM 之间的连接符号不同,依个人而定:

.[Block 块]__[Element 元素]--[Modifier 修饰符]

任何一种规范,都是基于实际需求而定,便于团队开发和维护扩展,每个规范都是经过合理评估后所得出的一种“思路”和“建议”。

Block(块)

是一个独立的实体,即通常所说的模块或组件。

例: headermenusearch

规则

  • 块名需能清晰的表达出,其用途、功能或意义,具有唯一性。
  • 块名称之间用 - 连接。
  • 每个块名前应增加一个前缀,这前缀在 CSS 中有命名空间(如: m-u- 、分别代表: mod 模块ui 元件 )。
  • 每个块在逻辑上和功能上都相互独立。
  • 由于块是独立的,可以在应用开发中进行复用,从而降低代码重复并提高开发效率。
  • 块可以放置在页面上的任何位置,也可以互相嵌套。
  • 同类型的块,在显示上可能会有一定的差异,所以不要定义过多的外观显示样式,主要负责结构的呈现。
  • 这样就能确保块在不同地方复用和嵌套时,增加其扩展性。

综上所述,最终我们可以把 BEM 规则最终定义成:

.[命名空间]-[组件名/块]__[元素名/元素]--[修饰符]

情景

需要构建一个 search 组件。

写法

.m-search{}

结构

<!-- header 组件(m- 作为命名空间始终) -->
    <div class="m-header">
        <!-- search 组件(可以嵌套在其他组件内) -->
        <form class="m-search">

        </form>
    </div>

如果打算开发一套框架,可以使用具有代表性的缩写,用来表示命名空间:Element UI(el-)、Ant Design(ant-)、iView(ivu-)。

Element(元素)

是块中的组成部分,对应块中的子元素/子节点。

例: header titlemenu itemlist item

规则

__
block__elem1__elem2

情景

search 组件中包含 inputbutton ,是列表中的一个子元素。

写法

.m-search{}
    .m-search__input{}
    .m-search__button{}

结构

<!-- search 组件 -->
    <form class="m-search">
        <!-- input 是 search 组件的子元素 -->
        <input class="m-search__input">
        <!-- button 是 search 组件的子元素 -->
        <button class="m-search__button">Search</button>
    </form>

原则上书写时不会出现两层以上的嵌套,所有样式都为平级,嵌套只出现在 .m-block_active ,状态激活时的情况。

Modifier(修饰符)

定义块和元素的外观、状态或类型。

例: colordisabledsize

规则

  • 修饰符需能直观易懂表达出,其外观、状态或行为。
  • 修饰符用 _ 连接块与元素。
  • 修饰符不能单独使用。
  • 在必要时可进行扩展,书写成: block__elem_modifier_modifier ,第一个 modifier 表示其命名空间。

情景

假定 search 组件有多种外观,我们选择其中一种。并且在用户未输入内容时, button 显示为禁用样式。

写法

.m-search{}
    .m-search_dark{}
    .m-search__input{}
    .m-search__button{}
    .m-search__button_disabled{}

结构

<!-- dark 表明 search 组件的外观 -->
    <form class="m-search m-search-form_dark">
        <input class="m-search__input">
        <!-- disabled 表明 search__button 的状态 -->
        <button class="m-search__button m-search__button_disabled">Search</button>
    </form>

小结

很多人觉得 BEM 写法难看,审美本是“智者见智,仁者见仁”的事。刚刚接触可能是会觉得有点奇怪,但所有东西都有一个适应过程。如果仅仅为了好看,规避其优点,我认为得不偿失。个人建议可以尝试使用 BEM 规范来书写代码。

BEM 命名会使得 Class 类名变长,但经过 GZIP 等压缩后,文件的体积其实并无太大影响。

就和早年提出 CSS语义化 一样,不要为了语义而去语义,语义化本身的作用就是帮助大家更好的识别代码,所有的规范都是基于项目的发展和团队的协作,团队可以根据成员的意愿选择最合适的方式。

参考资料:


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

学习Web设计

学习Web设计

罗宾斯 / 靳志伟 / 机械工业出版社 / 2009-1 / 65.00元

《学习Web设计(第3版)》从说明网站和网页是如何工作开始,逐步深入。当你看完《学习Web设计(第3版)》时,你将掌握使用优化的图像文件来创建多列CSS布局的技术,而且你将知道如何创建网页。这一版经过了彻底的修订,它可以教你如何根据现代设计的实践经验和专业标准来创建网站。《学习Web设计(第3版)》包含了一些练习,可以帮助你学习各种技术,还有一些小测验可以确保你及时掌握重要的概念。如果你对网站设计......一起来看看 《学习Web设计》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具