介绍一下 CSS 的 BEM

本贴最后更新于 2158 天前,其中的信息可能已经时异事殊

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

返回总目录

每天 30 秒

  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 8 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    198 引用 • 550 回帖
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • zjhch123

    话说 css 隔离一直是痛点啊!
    如果是 react 项目,可以用 css-module、stylues、css in js…等
    如果是 Vue 项目,可以用自带的 scope 标签
    但是这些实际上都不是很好的隔离方法,最终都是通过加类加 attr 解决。
    如果是普通的前端项目,不带任何框架的,是不是只能用 scss/less 的 语法来解决呢?

    我感觉,css 隔离的最好方案还是使用 shadow-dom,浏览器层面原生支持,再也不需要框架辅助了!
    奈何 shadow-dom 的兼容性目前看来还是太差了 😭

    1 回复
  • Vanessa

    除了隔离还需要公用。写着写着要抽一下,重构一下,也是头痛。

    Shadow Dom 做样式太方便么?

Vanessa
我们终此一生,就是要摆脱他人的期待,找到真正的自己。 昆明