【译】前端BEM命名方法论之三:命名惯例

【译】前端BEM命名方法论之一:BEM 官方简介文档
【译】前端BEM命名方法论之二:BEM中的重要概念

使用 BEM entity(BEM 实体)开发需要了解它们的命名规范。

这个命名惯例的主要理念是使 CSS 选择器的命名 尽可能地富含信息和明确。这有助于令代码开发和调试(debugging)更加容易,同时利于解决web开发者面临的一些问题。

比如说,我们有一个命名为menuitemvisible的 CSS 选择器。快速过目这样的一个记号/标记(notation)并不能让我们从选择器的名称中识别出 BEM entity 的类型。

让我们加入一个分隔符(delimiter):
menu-item-visiblemenuItemVisible

被写成这样,选择器的名称就被清晰地分成带有逻辑的几个部分。我们可以假设 “menu ” 是一个 block,“item ” 是一个element,“visible”是一个 modifier。然而,现实中的例子往往更加复杂并且没那么(not as)直接了当/明确,而这也正是 BEM 命名惯例的用武之地(and that’s where the BEM naming convention comes in useful)。

BEM 方法论提供了一种用来创建命名规范的思想/理念(idea),并且在它权威的 CSS 选择器命名惯例 中实施这种理念。可是,也有大量基于 BEM 原则的替代方案(alternative schemes )存在于 web 开发世界中。

CSS 选择器命名惯例

  • BEM entity 的名称使用 数字和小写拉丁字母 书写。
  • 名称中各个独立的单词之间使用连字符(hyphen)-)隔开。
  • 使用 CSS class(类)保存 blockelementmodifier名称的信息。(译者注:文档的意思应该是使用 class 作为选择器)

以下是 blockelementmodifier 的命名规范:

Block 的名称

block 的名称沿用(follow)block 命名方案(scheme)并且elementmodifier 定义了一个命名空间(namespace)
有时候 block 的名称可以使用各式各样的的前缀(prefix)。 BEM 的历史这篇文章详细介绍了我们使用前缀的经验。

示例

menu
lang-switcher

HTML

<div class="menu">...</div>

CSS

.menu { color: red; }

Element 的名称

block 的名称定义的命名空间标识了 element 属于该 blockelement 的名称由双下划线(double underscore)__)分隔。

一个 element 的全称是用下面的这个方案创建的:

block-name__elem-name

如果一个 block 拥有几个完全相同的 element,例如在菜单项(menu items)的案例中,所有的菜单项都将具有相同的名称:“menu_item”。


非常重要的提醒!BEM 方法论不建议在 element 中使用 element

示例

menu__item
lang-switcher__lang-icon

HTML

<div class="menu"> ... <span class="menu__item"></span> </div>

CSS

.menu__item { color: red; }

Modifier 的名称

block 的名称定义的命名空间标识了 modifier 属于该 block 或 该blockelementmodifier 的名称由单下划线(single underscore)_)分隔。

一个 modifier 的全称是用下面的这个方案创建的:

  • 对于 Boolean(布尔) 类型的 modifier —— owner-name_mod-name
  • 对于 键值对(key-value)类型的 modifier—— owner-name_mod-name_mod-val

非常重要的提醒!在 BEM 方法论中,modifier 不能在其所有者的上下文范围之外使用(a modifier cannot be used outside of the context of its owner )

Block modifier

  • 布尔型的 modifier。这种 modifier 的值是没有被指定的。其全称是用 block-name_mod-name方案创建的。例如: menu_hidden

  • 键值对型的 modifier。这种 modifier 的值 与 它的名称 之间用单下划线_)分隔。其全称是用 block-name_mod-name_mod-val 方案创建的。例如: menu_theme_morning-forest

HTML

<div class="menu menu_hidden">...</div>
<div class="menu menu_theme_morning-forest">...</div>

不正确的标记方法

<div class="menu_hidden">...</div>

这里的标记缺少(is missing)由该 modifier 影响的 block

CSS

.menu_hidden { display: none }
.menu_theme_morning-forest { color: green; }

Element modifier

  • 布尔型的 modifier。这种 modifier 的值是没有被指定的。其全称是用 block-name__elem-name_mod-name方案创建的。例如: menu__item_visible 。

  • 键值对型的 modifier。这种 modifier 的值 与 它的名称 之间用单下划线(_)分隔。其全称是用 block-name__elem-name_mod-name_mod-val 方案创建的。例如: menu__item_type_radio

HTML

<div class="menu"> ... <span class="menu__item menu__item_visible menu__item_type_radio"></span> </div>

CSS

.menu__item_type_radio { color: blue; }

使用命名惯例的例子

用 HTML 和 CSS 实现登录表单:

HTML

<form class="form form_login form_theme_forest">
    <input class="form__input">
    <input class="form__submit form__submit_disabled">
</form>

CSS

.form {}
.form_theme_forest {}
.form_login {}
.form__input {}
.form__submit {}
.form__submit_disabled {}

其他可选的命名方案

有一些其他的 基于 BEM 命名惯例的方法。

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

推荐阅读更多精彩内容