2018-12-25
回答
BEM(Block, Element, Modifier)是一种基于组件的对 CSS 类名进行约定的 Web 开发方法。他通过定义命名空间来解决权重问题,从而使 CSS 更易于维护。 BEM 使用Block、Element、Modifier 来解释其结构。Block 是一个可跨项目重用的独立组件,且是子组件(Element)的“命名空间”。Modifier 可标示 Block 或 Element 处于某种状态、结构或特定的样式。
-
中划线 :仅作为连字符使用,表示多个单词之间的连接记号__
双下划线:用来连接 Block 和 Element--
双中划线:描述 Block 或 Element 的一种状态、结构或样式
/* block component */
.block-name {
}
/* element */
.block-name__element-name {
}
/* modifier */
.block-name__element-name--modifier-name {
}
示例如下:
<nav class="navbar">
<a href="/" class="navbar__link navbar__link--active"></a>
<a href="/" class="navbar__link"></a>
</nav>
在示例中,navbar
为 Block,navbar__link
是一个不能独立与 navbar
存在的 Element,navbar__link--active
是标明 navbar__link
不同状态的 Modifier。
加分回答
- BEM 实践中也有使用
_
替代--
的情况 - 类命名需要尽可能的简明清晰、没有二意性,例如
error
就比red-text
更加有语义。 - 建议 Block 只能有一层 Element 嵌套,且 Element 不能独立 Block 存在。如:
<form class="search-form">
<div class="search-form__content">
<input class="search-form__input">
<!-- 错误:建议使用 `search-form__button` 或 `search-form__content-button` -->
<button class="search-form__content__button">Search</button>
</div>
</form>
<!-- 错误:该 Element 应放在 `search-form` Block 中 -->
<i class="search-form__icon"></i>
- 建议同一个 Block 或 Element 上不能使用两个以上的 Modifier 去进行修饰,且 Modifier 需配合 Block 或 Element 使用,不能独立存在。如:
<!-- 错误:缺少 `search-form` Block -->
<form class="search-form_theme_islands">
</form>
<!-- 错误:使用多个 Modifier -->
<form class="search-form search-form_theme_islands search-form_theme_lite">
</form>
- CSS-in-JS 相关的解决方案:JSS