初识 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 规范来重构你的项目吧!

相关推荐
仟濹3 小时前
【HTML】基础学习【数据分析全栈攻略:爬虫+处理+可视化+报告】
大数据·前端·爬虫·数据挖掘·数据分析·html
烛阴5 小时前
Date-fns教程:现代JavaScript日期处理从入门到精通
前端·javascript
小蜜蜂嗡嗡5 小时前
flutter项目迁移空安全
javascript·安全·flutter
江城开朗的豌豆6 小时前
JavaScript篇:a==0 && a==1 居然能成立?揭秘JS中的"魔法"比较
前端·javascript·面试
江城开朗的豌豆7 小时前
JavaScript篇:setTimeout遇上for循环:为什么总是输出5?如何正确输出0-4?
前端·javascript·面试
惜.己7 小时前
MySql(十一)
java·javascript·数据库
天涯学馆7 小时前
TypeScript 在大型项目中的应用:从理论到实践的全面指南
前端·javascript·面试
robotmen8 小时前
CSS动态虚线边框
前端·css
北京小伙_盼9 小时前
开源项目分享:123 网盘 SDK - npm包已发布
前端·javascript·npm
骆驼Lara9 小时前
Vue3.5 企业级管理系统实战(二十一):菜单权限
前端·javascript·vue.js