【译】BEM CSS命名规范二 Key concepts

原文

关键概念

<h2 id="block">模块</h2>

一个在逻辑和功能上独立的页面组件,与 Web 组件中的组件概念是等同的。一个模块封装了行为(JavaScript),模板,样式(CSS),和其他技术实现。模块是独立的,允许我们重用,从而更好地促进项目的开发

模块的特征

嵌套结构

模块可以被其他的模块嵌套在内部。
  比如:一个 head 模块可以包含一个 logo(logo),一个搜索框(search),和一个授权(登录/注册)模块(auth)。

1
1

任意位置

模块可以在一个页面上使用,在多个页面间使用,或者在多个项目间使用。模块被实现为独立的实体,从而使得在页面中改变模块的位置成为可能,同时确保他们的功能和外观是正常的。

因此,logo 和 认证表单模块可以在不更改 CSS 和 JavaScript 代码的情况下互相交换位置。


2
2

3
3

重用

一个界面可以包含多个相同模块的实例。


4
4

<h2 id="element">元素</h2>

元素是一个模块的组成部分,并且不可以在模块之外使用。

例如,一个菜单项不可以被单独使用在菜单模块的上下文之外,一次它是一个元素。

5
5

我应该在什么时候使用模块或元素

BEM 方法论中,创建元素的元素是不被推荐的

<h2 id="modifier">修饰符</h2>

一个可以定义模块元素外观和行为的 BEM 实体。

是否使用修饰符,是可选择的。

本质上,修饰符和 HTML 属性是相似的。相同的模块看起来不同,正式由于使用了修饰符。

例如,菜单模块(menu)可能会改变它自己的外观,这取决于一个修饰符被使用在菜单模块上。

6
6

修饰符可以在程序运行时被改变(例如,模块的某个 DOM 事件被触发时),或者被其他模块所改变。

<h2 id="bem-entity">BEM 实体</h2>

模块元素修饰符都被称为 BEM 实体。

这个概念可以被应用在一个单独的 BEM 实体上,也可以作为模块,元素和修饰符的统称。

<h2 id="mix">混合模式</h2>

可以将多个不同的 BEM 实体整合为一个单独的 DOM 节点

混合模式允许我们

  • 结合多个 BEM 实体的行为和风格(样式),以及减少代码的重复
  • 在已经存在的 BEM 实体的基础上创建新的新的界面组件。

让我们考虑一个将一个模块和另一个模块的元素混合的案例。

让我们假定通过一个 link 模块来实现你项目中的链接。我们需要将菜单项全部用链接实现。这有一些方式来实现我们的目的。

  • 为菜单项创建一个可以将其转换为链接的修饰符。为了实现这样一个修饰符,必然会复制 link 模块的行为和样式。这将会造成代码的重复。
  • 将一个通用的 link 模块和一个 ·menu· 模块的 link 元素结合在一起。这两个 BEM 实体的混合模式允许我们使用 link 模块的链接功能,并且可以在不复制代码的情况下使用 menu模块额外的 CSS 规则。

<h2 id="beem-tree">BEM 树</h2>

一种使用模块,元素和修饰符的 web 页面结构的表示。是通过 BEM 实体名称对 DOM 树的抽象描述,包括他们的状态,顺序,嵌套和一些辅助性的数据。

在真实的项目中,一个 BEM 树可以被呈现在任何支持树结构的格式中。

让我们来看一个 DOM 树的例子:

<header class="header">
    <img class="logo">
    <form class="search-form">
        <input type="input">
        <button type="button"></button>
    </form>
    <ul class="lang-switcher">
        <li class="lang-switcher__item">
            <a class="lang-switcher__link" href="url">en</a>
        </li>
        <li class="lang-switcher__item">
            <a class="lang-switcher__link" href="url">ru</a>
        </li>
    </ul>
</header>

相应的 BEM 树看起来是这个样子的

header
    ├──logo
    └──search-form
        ├──input
        └──button
    └──lang-switcher
        └──lang-switcher__item
            └──lang-switcher__link
        └──lang-switcher__item
            └──lang-switcher__link

在 XML 和 BEMJSON格式中,相同的 BEM 树如下:

XML

<block:header>
    <block:logo/>
    <block:search-form>
        <block:input/>
        <block:button/>
    </block:search-form>
    <block:lang-switcher>
        <elem:item>
            <elem:link/>
        </elem:item>
        <elem:item>
            <elem:link/>
        </elem:item>
    </block:lang-switcher>
</block:header>

BEMJSON

{
    block: 'header',
    content : [
        { block : 'logo' },
        {
            block : 'search-form',
            content : [
                { block : 'input' },
                { block : 'button' }
            ]
        },
        {
            block : 'lang-switcher',
            content : [
                {
                    elem : 'item',
                    content : [
                        { elem : 'link' }  
                    ]
                },
                {
                    elem : 'item',
                    content : [
                        { elem : 'link' }
                    ]
                }
            ]
        }
    ]
}

<h2 id="block-implementation">模块实现</h2>

决定一个 BEM 实体包含如下一组不同的技术

  • 行为
  • 外观
  • 测试
  • 模板
  • 文档
  • 依赖关系描述
  • 辅助性数据(例如,图片)

<h2 id="block-implementation-tec">实现技术</h2>
  用于实现一个模块的相关技术。

模块可以使用一种或多种技术实现,比如:

  • 行为 —— JavaScript,CoffeeScript
  • 外观 —— CSS,Stylus,Sass
  • 模板 —— BEMHTML,BH,Pug,Handlebars,XSL
  • 文档 —— Markdown,Wiki,XML.

例如,如果一个模块的外观使用 CSS 定义,这表明这个模块使用 CSS 技术被实现。同样。如果使用 Markdown 书写一个模块的文档,那么该模块使用 Markdown 技术实现。

<h2 id="block-redefinition">模块重定义</h2>
  通过在不同的级别上添加新的功能来更改模块的实现。

<h2 id="redefinition-level">重新定义级别</h2>

重定义级别指一组 BEM 实体和他们的部分实现。

模块的最终实现可以被分成不同的定义级别上。每一个新的级别继承或者覆盖之前的对模块的实现。最终的结果是由按照连续顺序的每个重定义的级别上的模块的实现技术组装而成的。

7
7

每一个级别上对 BEM 实体的实现技术都可以被重新定义。

例如,这里有一个项目,在该项目的一个单独的级别上使用了一个第三方库。该第三方库实现有现成的模块。该具体项目的模块被保存在另一个重定义级别上。

比方说,我们需要修饰第三库其中的某一个模块的外观。不需要在第三方库的源码中修改模块的 CSS 规则,或者将代码复制到项目级别中。我们只需要在项目级别上为模块创建一些额外的 CSS 规则。在项目构建过程中,最终实现将会结合库级别的原有规则和项目级别中新的样式规则。

本人才疏学浅,如果文中有错误,或者歧异,或者不恰当的地方,希望大家提出来,非常愿意接受大家的批评与建议。

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

推荐阅读更多精彩内容