在前端开发中,随着项目越来越大,多人协作越来越频繁,类名命名混乱、样式冲突、组件难以复用等问题也逐渐浮现。为了解决这些问题,BEM(Block-Element-Modifier) 这种命名规范应运而生。
本文将带你初步认识 BEM 的基本概念,并结合微信开源 UI 框架 WeUI,了解它是如何利用 BEM 来组织代码结构和实现组件化的。
一、什么是 BEM?
BEM 是一种用于 HTML 和 CSS 类名命名的方法论,全称为:
B lock - E lement - Modifier
它通过清晰的命名规则,帮助开发者构建可维护、可复用的 UI 组件。
1. Block(块)
- 表示一个独立的功能模块或组件。
- 它是顶级容器,具有语义上的独立性。
- 命名格式:
.block-name
例如:
html
<div class="weui-page">...</div>
这里 .weui-page
就是一个 Block,表示一个页面级别的组件。
2. Element(元素)
- 表示 Block 中的一个组成部分。
- 必须依附于某个 Block,不能单独存在。
- 命名格式:
.block-name__element-name
例如:
html
<h1 class="weui-page__title">标题</h1>
<p class="weui-page__desc">描述信息</p>
这里的 __title
和 __desc
都是 .weui-page
这个 Block 的子元素。
3. Modifier(修饰符)
- 表示 Block 或 Element 的状态或变体。
- 通常用于控制样式的变化,如主题、禁用状态等。
- 命名格式:
.block-name_modifier-name
或.block-name__element-name_modifier-name
例如:
html
<button class="weui-btn weui-btn_primary">主要按钮</button>
<button class="weui-btn weui-btn_default">默认按钮</button>
这里的 _primary
和 _default
是 .weui-btn
这个 Block 的不同修饰符,代表不同的样式状态。
二、WeUI 中的 BEM 实践
WeUI 是微信官方出品的一套 UI 样式库,模仿了 iOS 和 Android 原生 UI 效果。它的源码很好地遵循了 BEM 命名规范,使得组件结构清晰、易于理解和扩展。
示例:WeUI Button 组件
html
<button class="weui-btn weui-btn_primary">主要按钮</button>
<button class="weui-btn weui-btn_default">默认按钮</button>
.weui-btn
是 Block,表示一个按钮组件。.weui-btn_primary
和.weui-btn_default
是该 Block 的 Modifier,表示不同的样式状态。
这种命名方式不仅让开发者一眼看出按钮的类型和状态,也方便后期维护和重构。
三、BEM 在组件化开发中的优势
1. 提升代码可读性
通过统一的命名规则,即使是不熟悉项目的开发者也能快速理解 DOM 结构和样式意图。
2. 提高组件复用性
每个 Block 都是独立的,可以在多个页面中复用。例如 .weui-cell
可以在表单页、设置页等多个场景下使用。
3. 减少命名冲突
传统的命名方式容易出现类名重复的问题(如 .title
, .header
),而 BEM 的命名方式几乎可以避免这种情况。
4. 支持团队协作
BEM 提供了一种标准化的沟通语言,使得多人协作更加高效。无论你是写模板、样式还是逻辑,都能清楚地知道某一块属于哪个组件。
四、从 WeUI 学习到的最佳实践
1. 页面由多个 Blocks 构成
WeUI 的页面结构通常是多个 Block 的组合,比如:
html
<div class="weui-page">
<div class="weui-header">头部</div>
<div class="weui-content">内容区域</div>
<div class="weui-footer">底部</div>
</div>
每个 Block 独立开发、测试、复用,实现了真正的组件化开发。
2. Block 包含 Elements
每一个 Block 内部又包含多个 Elements,构成完整的 UI 结构:
html
<div class="weui-cell">
<div class="weui-cell__bd">左侧内容</div>
<div class="weui-cell__ft">右侧内容</div>
</div>
这样可以让结构更清晰,便于样式管理和维护。
3. Modifier 控制状态和样式变化
通过 Modifier 来控制组件的不同状态,例如禁用、加载中、错误提示等:
html
<input class="weui-input_weui-input_disabled" disabled />
<span class="weui-loading"></span>
五、总结
BEM 不仅仅是一种 CSS 命名规范,更是一种前端工程化的思维方式。它通过清晰的层级划分和命名规则,帮助我们构建出结构清晰、易于维护、高度复用的组件系统。
WeUI 作为一套优秀的 UI 框架,完美诠释了 BEM 的精髓。学习并实践 WeUI 的源码结构和命名方式,不仅能提升我们的编码质量,更能让我们在大型项目中游刃有余地进行协作开发。
如果你也希望写出"大厂级"的代码,不妨从今天开始尝试使用 BEM 规范来重构你的项目吧!