Sym - 一个用 Java 实现的现代化社区平台 • 源码注册

Pipe - 小而美的开源博客平台 • 体验皮肤
Solo - 一个用 Java 实现的博客系统,为你或你的团队创建个博客吧! • 源码下载
Wide - 一个基于 Web 的 Go 语言 IDE • 教程试用

介绍一下 CSS 的 BEM

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">
          
          <button class="search-form__content__button">Search</button>
      </div>
    </form>
    
    <i class="search-form__icon"></i>
  • 建议同一个 Block 或 Element 上不能使用两个以上的 Modifier 去进行修饰,且 Modifier 需配合 Block 或 Element 使用,不能独立存在。如:
    
    <form class="search-form_theme_islands">
    </form>
    
    <form class="search-form search-form_theme_islands search-form_theme_lite">
    </form>
  • CSS-in-JS 相关的解决方案:JSS

返回总目录

每天 30 秒


欢迎注册黑客派社区,开启你的博客之旅。让学习和分享成为一种习惯!

2 评论
zjhch123 • 2018-12-25
回复 删除

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

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

Vanessa • 2018-12-26
回复 删除

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

Shadow Dom 做样式太方便么?