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

相关推荐
用头发抵命18 小时前
Vue 3 中优雅地集成 Video.js 播放器:从组件封装到功能定制
开发语言·javascript·ecmascript
蓝冰凌18 小时前
Vue 3 中 defineExpose 的行为【defineExpose暴露ref变量】详解:自动解包、响应性与实际使用
前端·javascript·vue.js
奔跑的呱呱牛18 小时前
generate-route-vue基于文件系统的 Vue Router 动态路由生成工具
前端·javascript·vue.js
柳杉18 小时前
从动漫水面到赛博飞船:这位开发者的Three.js作品太惊艳了
前端·javascript·数据可视化
TON_G-T19 小时前
day.js和 Moment.js
开发语言·javascript·ecmascript
Irene199120 小时前
JavaScript 中 this 指向总结和箭头函数的作用域说明(附:call / apply / bind 对比总结)
javascript·this·箭头函数
2501_9219308320 小时前
ReactNative项目OpenHarmony三方库集成实战:react-native-appearance(更推荐自带的Appearance)
javascript·react native·react.js
还是大剑师兰特20 小时前
Vue3 中 computed(计算属性)完整使用指南
前端·javascript·vue.js
csdn_aspnet20 小时前
查看 vite 与 vue 版本
javascript·vue.js