BEM风格指南

==特征==

The block name describes its purpose ("What is it?" — menu or button), not its state ("What does it look like?" — red or big)

块名称描述了它的用途(“它是什么?”-菜单或按钮),而不是它的状态(“它看起来像什么?”-红色或大的)。


<!--正确示例-->

<div class="error"></div>

<!--错误示例-->

<div class="red-text"></div>

使用规则

  • 块可以嵌套块

  • 可以嵌套任意的块


<header class="header">

    <div class="logo"></div>

    <form class="search-form"></form>

</header>

元素

属于块的一部分,不能单独使用

==特征==

元素名称描述了它的用途(“它是什么?”-菜单或按钮),而不是它的状态(“它看起来像什么?”-红色或大的)。

命名规范block-name__element-name


<!-- `search-form` 块 -->

<form class="search-form">

    <!-- 这是`search-form` 块的元素`input` -->

    <input class="search-form__input">

    <!-- 这是`search-form` 块的元素`button` -->

    <button class="search-form__button">Search</button>

</form>

使用规则

  • 元素里面可以嵌套元素

  • 始终是块里面的成员(不能单独使用)

  • 块里面可以没有元素

可嵌套


<div class="block">

    <div class="block__elem1">

        <div class="block__elem2">

            <div class="block__elem3"></div>

        </div>

    </div>

</div>

成员


<!-- 这样单独使用元素是错的-->

<button class="search-form__button">Search</button>

可选


<!--这些块里面都没有元素-->

<div class="search-form">

    <input class="input">

    <button class="button">Search</button>

</div>

应该创建块还是元素?

创建一个块

如果一段代码可能被重用,并且它不依赖于正在实现的其他页面组件。

创建一个元素

如果一段代码不能单独使用,或者没有父实体(块)就不能使用。

修饰符

==特征==

该修改名称描述其外观(“多大?”或者“哪个主题?”等等- size_s或theme_islands)其状态(“它和其它的块(元素)有什么不同?” - disabled,focused等),其行为(“如何它的行为是什么?“或”它如何响应用户?“ - 例如directions_left-top)。

修饰符名称通过单个下划线(_)与块或元素名称分隔。

布尔类型

  • 仅在修饰符的存在或不存在很重要时使用,并且其值无关紧要。例如,disabled。如果存在布尔修饰符,则假定其值为true。

  • 修饰符全名的结构遵循以下模式:

    • block-name_modifier-name

    • block-name__element-name_modifier-name


<!-- `search-form`块带有`focused`修饰符  -->

<form class="search-form search-form_focused">

    <input class="search-form__input">

    <!-- `button` 元素带有 `disabled`修饰符 -->

    <button class="search-form__button search-form__button_disabled">Search</button>

</form>

键值对类型

  • 在修饰符值很重要时使用。例如,“具有islands设计主题的菜单”:menu_theme_islands。

  • 修饰符全名的结构遵循以下模式:

    • block-name_modifier-name_modifier-value
- block-name__element-name_modifier-name_modifier-value

<!-- `search-form` 块的修饰符是 `theme` 它的值为 `islands` -->

<form class="search-form search-form_theme_islands">

    <input class="search-form__input">

    <!-- `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">

    <button class="search-form__button

                  search-form__button_size_s

                  search-form__button_size_m">

    </button>

</form>

修饰符使用规则

  • 修饰符不能单独使用

<!--这是正确的,存在`search-form`块,有`theme`修饰符,它的值为islands-->

<form class="search-form search-form_theme_islands">

    <input class="search-form__input">

    <button class="search-form__button">Search</button>

</form>

<!-- 这是不正确的,因为`search-form`块样式不见了 -->

<form class="search-form_theme_islands">

    <input class="search-form__input">

    <button class="search-form__button">Search</button>

</form>

混合


<!-- `header` block -->

<div class="header">

    <!--

        The `search-form` block is mixed with the `search-form` element

        from the `header` block

    -->

    <div class="search-form header__search-form"></div>

</div>

文件格式

==特征==

  • 单个块对应于单个目录。

  • 块和目录具有相同的名称。例如,header块位于header/目录中,menu块位于menu/目录中。

  • 块的实现分为单独的技术文件。例如,header.css和header.js。

  • 块目录是其元素和修饰符的子目录的根目录。

  • 元素目录的名称以双下划线(__)开头。例如,header/__logo/和menu/__item/。

  • 修饰符目录的名称以单个下划线(_)开头。例如,header/_fixed/和menu/_theme_islands/。

  • 元素和修饰符的实现分为单独的技术文件。例如,header__input.js和header_theme_islands.css。


search-form/                          # 块目录 search-form

    __input/                          # 元素目录 search-form__input

        search-form__input.css        # 实现search-form__input元素的css文件

        search-form__input.js          # 实现search-form__input元素的js文件

    __button/                          # 元素目录 search-form__button

        search-form__button.css

        search-form__button.js

    _theme/                            # 修饰符目录 search-form_theme

        search-form_theme_islands.css  # 实现search-form_theme_islands的css文件

        search-form_theme_lite.css    # 实现search-form_theme_islands的css文件



    search-form.css                    # 实现search-form块的css文件

    search-form.js                    # 实现search-form块的js文件

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