















BEM 是一种前端 CSS 命名方法论,全称是 Block Element Modifier。它的核心思想是将用户界面拆分成独立的块(Block),通过元素(Element)和修饰符(Modifier)来描述其状态和结构,以此来解决 CSS 样式冲突、命名混乱以及代码难以维护的问题。
- 连接(如果单词较多),通常没有前缀。.menu { ... }
.search-form { ... }
.header { ... }
__(两个下划线) + 元素名。.menu__item { ... }
.search-form__input { ... }
.header__logo { ... }
--(两个连字符) + 修饰符名。.menu--horizontal { ... }
.menu__item--active { ... }
.search-form__button--disabled { ... }
HTML 结构:
<form class="search-form search-form--large">
<input class="search-form__input" type="text" />
<button class="search-form__button search-form__button--primary">搜索</button>
</form>
CSS 样式:
.search-form { ... } /* Block */
.search-form--large { ... } /* Block Modifier */
.search-form__input { ... } /* Element */
.search-form__button { ... } /* Element */
.search-form__button--primary { ... } /* Element Modifier */
可读性强
通过命名就能清晰了解 HTML 结构和组件关系,例如 .user-card__avatar--large 一眼就能看出是“用户卡片组件中的头像,且为大尺寸”。
避免样式冲突
每个类名都是唯一的,且不依赖页面结构(如无嵌套选择器 .menu .item),避免了 CSS 作用域污染。
模块化与可复用性
组件(Block)独立,可以在项目的不同页面、不同位置随意复用,而无需担心样式错乱。
便于团队协作
统一的命名规则让团队成员即使不熟悉代码,也能快速理解和维护样式。
.block__elem1__elem2。.button--primary 不能脱离 .button 单独存在)。__ 和 --,但有些团队为了简洁会使用单下划线或驼峰,但核心思想不变。& 符号简化书写:.search-form {
&__input { ... }
&__button {
&--primary { ... }
}
}
BEM 不是一套框架或库,而是一种命名规范和组件化思维。它通过严格的命名约定,让 CSS 代码具备高可读性、高可维护性,尤其适合大型项目或多人协作的场景。虽然名字看起来有些冗长,但换来的代码清晰度和协作效率提升,在复杂项目中是非常值得的。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。