初识 BEM 命名规范与 WeUI 框架的组件化开发

在前端开发中,随着项目越来越大,多人协作越来越频繁,类名命名混乱、样式冲突、组件难以复用等问题也逐渐浮现。为了解决这些问题,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 规范来重构你的项目吧!

相关推荐
im_AMBER24 分钟前
React 17
前端·javascript·笔记·学习·react.js·前端框架
一雨方知深秋32 分钟前
2.fs模块对计算机硬盘进行读写操作(Promise进行封装)
javascript·node.js·promise·v8·cpython
一晌小贪欢1 小时前
【Html模板】电商运营可视化大屏模板 Excel存储 + 一键导出(已上线-可预览)
前端·数据分析·html·excel·数据看板·电商大屏·大屏看板
街尾杂货店&3 小时前
css - 实现三角形 div 容器,用css画一个三角形(提供示例源码)简单粗暴几行代码搞定!
前端·css
顺凡3 小时前
删一个却少俩:Antd Tag 多节点同时消失的原因
前端·javascript·面试
小白路过3 小时前
CSS transform矩阵变换全面解析
前端·css·矩阵
前端大卫3 小时前
动态监听DOM元素高度变化
前端·javascript
Cxiaomu3 小时前
React Native App 图表绘制完整实现指南
javascript·react native·react.js
qq. 28040339844 小时前
vue介绍
前端·javascript·vue.js
Mr.Jessy4 小时前
Web APIs 学习第五天:日期对象与DOM节点
开发语言·前端·javascript·学习·html