说一说BEM

149 阅读3分钟

嗯,这是一篇自我的归纳总结

主要参考和翻译了这个网站

介绍

BEM (Block, Element, Modifier) 是一种基于组件的Web开发的方法,他的主要目的是把UI分割成独立的block。这会让整个UI开发既快又简单,并且能提高代码的重用率,而不是简单的复制粘贴。

Block

Block可以理解为一个独立的可以被重复利用的功能组件。在HTML中,是用class这个属性来表示。

几个注意点:

  • Block的名称是用来表示这个组件的用处的(简单来说就是用来做什么的,比如菜单menu或者按钮button)而不是用来表示当前这个组件的状态(颜色red,大小big)
<!-- Correct. The `error` block is semantically meaningful -->
<div class="error"></div>

<!-- Incorrect. It describes the appearance -->
<div class="red-text"></div>
  • Block不应该影响他的外部环境,也就是说你不应该使用margin/position之类东西
  • 在使用BEM的时候CSS的tag或者ID选择器也不应该使用

以上这些保证了Block具有必要的独立性,方便他被在各个地方重用。

Element

Element从字面意思理解,就是组成Block的元素。并且不能被单独使用

几个注意点:

  • Element的名称需要描述他的使用目的(用来做什么,item或者text)而不是他当前的状态(颜色red,大小big)
  • Element的结构的全名是这样表示的block-name__element-name。Element的名称用双下划线( __ )来和Block的名称分隔开。
<!-- `search-form` block -->
<form class="search-form">
    <!-- `input` element in the `search-form` block -->
    <input class="search-form__input">

    <!-- `button` element in the `search-form` block -->
    <button class="search-form__button">Search</button>
</form>

什么时候用Block,什么时候用Element?

如果一个组件是可以被重用的,并且和其他的组件没有关联(独立使用),可以使用Block。

如果一个组件不能独立使用,必须依赖于他的父组件,则可以用Element。

Modifier

Modifier是用来描述组件外观,状态,行为的。简单来说,就是用来修饰的。

几个注意点:

  • Modifier名称用来描述外观(是什么样的大小/主题? 比如size_s/theme_islands),状态(用来与其他的组件做区别,比如disable,focused,等),行为(行为是怎样?对用户来说的响应是什么?比如directions_left-top)
  • Modifier的名称用单下划线( _ )来和Block的名称和Element名称分隔开。

Modifier的几种类型

boolean型

当Modifier的值不是很重要,而代码仅仅是关心这个Modifier是否存在的时候,可以使用。当一个Boolean的Modifier出现的时候,他的值默认是true的。

使用时候的结构如下:

block-name_modifier-name

block-name__element-name_modifier-name

举个例子

<!-- The `search-form` block has the `focused` Boolean modifier -->
<form class="search-form search-form_focused">
    <input class="search-form__input">

    <!-- The `button` element has the `disabled` Boolean modifier -->
    <button class="search-form__button search-form__button_disabled">Search</button>
</form>

Key-Value型

当Modifier的值是什么是重要时,比如表示theme的状态:theme_islands的时候,可以使用这种方式。

使用时候的结构如下:

block-name_modifier-name_modifier-value

block-name__element-name_modifier-name_modifier-value

举个例子

<!-- The `search-form` block has the `theme` modifier with the value `islands` -->
<form class="search-form search-form_theme_islands">
    <input class="search-form__input">

    <!-- The `button` element has the `size` modifier with the value `m` -->
    <button class="search-form__button search-form__button_size_m">Search</button>
</form>

<!-- You can't use two identical modifiers with different values simultaneously -->
<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">
        Search
    </button>
</form>