CSS使用BEM命名规范

当你看到一个class的时候,你想得到什么信息?###

  • 这个class用在什么地方,作用是什么?
  • 是否在其他地方也有使用该class,修改会不会引起其他地方的样式问题?
  • class 是否在js中被使用?
  • ...

此时,你最想一眼看到这个class就解决以上所有的问题,而BEM你值得拥有

什么是BEM

BEM(块,元素,修饰符)由 Yandex 团队提出的一种前端 CSS 命名方法论。是基于组件的Web开发的一种前端命名方法论,主要针对CSS。其背后的想法是将用户界面分为独立的块。即使使用复杂的UI,这也使界面开发变得容易和快速,并且允许重用现有代码而无需复制和粘贴。

优势

  • 避免样式冲突
  • 减小名称长度
  • 提高可阅读性
  • 增加样式重用

怎么使用BEM

  1. Block

一个功能独立的页面组件,可以重复使用

块不应影响其环境,这意味着您不应设置块的外部几何形状(边距)或位置

<!--
    good
-->
<div  class = "header" > </ div >

<!--
    bad
    red-text 是描述外观
-->
<div  class = "red-text" > </ div >
  1. Element

块的复合部分,不能单独使用

元素全名的结构为 block-name__element-name

<!-- 块 `search-form` -->
<form class="search-form">
    <!-- `input button` 元素 在 `search-form` 块中 -->
    <input class="search-form__input">
    <button class="search-form__button">Search</button>
</form>

一个元素始终是块的一部分,而不是另一个元素,因此元素名称不可定义为 block__elem1__elem2 的层次结构

<!--
    good
    遵循 `block-name__element-name`
-->
<form class="search-form">
    <div class="search-form__content">
        <input class="search-form__input">
        <button class="search-form__button">Search</button>
    </div>
</form>

<!--
    bad
    ' search-form__content__button ' 不遵循 `block-name__element-name`
-->
<form class="search-form">
    <div class="search-form__content">
        <input class="search-form__content__input">
        <button class="search-form__content__button">Search</button>
    </div>
</form>

元素始终是一个块的一部分,您不应该与该块分开使用

<form class="search-form">
    <!-- 
        good
        元素在块 search-form 的里面
     -->
    <input class="search-form__input">
    <button class="search-form__button">Search</button>
</form>

<form class="search-form"></form>
<!--
    bad 
    元素不在块 search-form 的里面
-->
<input class="search-form__input">
<button class="search-form__button">Search</button>

  1. Modifier

定义块或元素的外观,状态或行为的实体

  • Boolean
    修饰符全名的结构遵循以下模式:
    • block-name_modifier-name
    • block-name--modifier-name
    • block-name_element-name_modifier-name
    • block-name_element-name--modifier-name
<form class="search-form search-form_focused">
    <input class="search-form__input">

    <!-- 'disabled' 是 'button' 的元素 -->
    <button class="search-form__button search-form__button_disabled">Search</button>
</form>
  • Key-value
    修饰符全名的结构遵循以下模式:
    • block-name_modifier-name_modifier-value
    • block-name_modifier-name--modifier-value
    • block-name__element-name_modifier-name_modifier-value
    • block-name__element-name_modifier-name--modifier-value
<form class="search-form search-form_theme_islands">
    <input class="search-form__input">

    <!-- 
        good
        `button` 的修饰符 `size` 的值是 `m` 
    -->
    <button class="search-form__button search-form__button_size_m">Search</button>
</form>

<form class="search-form
             search-form_theme_islands
             search-form_theme_lite">
    <input class="search-form__input">

    <!-- 
        bad
        不可同时使用两个不同值的相同修饰符 
    -->
    <button class="search-form__button
                   search-form__button_size_s
                   search-form__button_size_m">
   </button>
</form>

不能将修饰符与修饰的块或元素隔离使用。修饰符应更改实体的外观,行为或状态,而不是替换它

<!--
    good
-->
<form class="search-form search-form_theme_islands">
    <input class="search-form__input">
    <button class="search-form__button">Search</button>
</form>

<!-- 
    bad
    缺少了块名称 'search-form' 
-->
<form class="search-form_theme_islands">
    <input class="search-form__input">
    <button class="search-form__button">Search</button>
</form>

在修饰符和元素名称中添加块名称的好处

  • 有助于减少一个块的元素和修饰符对另一个块的实现的影响
  • 可更清楚的知道修饰符应用于该DOM节点上的哪个实体
  • 唯一名称使查找代码或文件系统中的实体变得更加容易

什么时候应该用 BEM 格式

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

命名规范

双下划线风格 block-name__elem-name--mod-name--mod-val

  • 名称以小写拉丁字母书写。
  • BEM实体名称中的单词由连字符(-)分隔。
  • 元素名称与块名称之间用双下划线(__)分隔。
  • 布尔修饰符用双连字符(--)与块或元素的名称分隔。
  • 修饰符的值与其名称之间用双连字符(--)分隔。

重要提示: 注释(--)中的双连字符可能会在HTML文档验证期间导致错误。)
CamelCase style blockName-elemName_modName_modVal

  • 名称以拉丁字母书写。
  • 名称中的每个单词都以大写字母开头。
  • 块,元素和修饰符名称的分隔符与标准方案中的相同

React命名范式 BlockName-ElemName_modName_modVal

  • 名称以拉丁字母书写。
  • 块和元素的名称以大写字母开头。修饰符的名称以小写字母开头。
  • 名称中的每个单词都以大写字母开头。
  • 元素名称与块名称之间用单个连字符(-)分隔。
  • 修饰符的名称和值之间的分隔符与标准方案中的相同。

没有命名空间样式 _available

  • 名称以拉丁字母书写。
  • 修饰符之前不包括块或元素的名称

此命名方案限制了mixs的使用,因为它无法确定修饰符属于哪个块或元素。

命名名称使用简写

命名名称使用全写

常用的CSS命名

  1. vant 组件 css 命名
    使用的命名是双下划线风格:block-name__element-name--modifier-name
<div class="van-doc">
    <div class="van-doc-header">
        <div class="van-doc-row">
            <div class="van-doc-header__top">
                <a class="van-doc-header__logo">搜索</a>
                <ul class="van-doc-header__top-nav">
                    <li class="van-doc-header__top-nav-item">
                        <a class="van-doc-header__logo-link">
                    </li>
                </ul>
            </div>
        </div>
    </div>
    <div class="van-doc-container van-doc-row van-doc-container--with-simulator">
        ......
    </div>
</div>
  1. weui 组件 css 命名
    使用的命名是 React命名风格:block-name__element-name_modifier-name
<div class="page button js_show">
    <div class="page__hd">
        <h1 class="page__title">Button</h1>
        <p class="page__desc">按钮</p>
    </div>
    <div class="page__bd">

        <div class="button-sp-area">
            <a class="weui-btn weui-btn_primary">页面主操作</a>
            <a class="weui-btn weui-btn_loading">页面主操作</a>
            <a class="weui-btn weui-btn_disabled>页面主操作</a>
            <a class="weui-btn weui-btn_default">页面次要操作</a>
            <a class="weui-btn weui-btn_warn">警告类操作</a>
        </div>
        ....
        <div class="button-sp-area cell">

校验 BEM 规范工具

stylelint-selector-bem-pattern

相关参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • BEM 是对 CSS 命名的一种规范,推崇将 WEB 页面模块化,从而提高代码的重用度,减少后期维护的成本。原文 ...
    Jadyn阅读 5,866评论 0 12
  • 什么是BEM BEM是Block(块)、Element(元素)、Modifier(修饰符)的简写,是一种组件化的 ...
    前白阅读 498评论 0 1
  • BEM 基于组件方式的web开发方法,基本思想是将用户界面分成独立的模块。 Block(块) 通常指模块,组件 B...
    xwwawj阅读 930评论 0 2
  • 什么是 BEM 命名规范 Bem 是块(block)、元素(element)、修饰符(modifier)的简写 块...
    甘草倚半夏阅读 692评论 0 0
  • [规范]css BEM书写规范 BEM是基于组件的web开发方法。其思想是将用户界面分隔为独立的块,从而使开发复杂...
    Maco_wang阅读 961评论 0 1