🎶 Sym - 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台

📕 思源笔记 - 一款桌面端笔记应用,支持 Windows、Mac 和 Linux

🎸 Solo - B3log 分布式社区的博客端节点,欢迎加入下一代社区网络

♏ Vditor - 一款浏览器端的 Markdown 编辑器

介绍一下 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">
        <!-- 错误:建议使用 `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 秒


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

推荐阅读
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 做样式太方便么?