引子:为什么我们要关心按钮怎么写?
你有没有遇到过这样的情况?一个项目刚接手,打开 CSS 文件一看,全是 .red、.left、.big 这样的类名,看得你一脸懵逼。然后你改了一行样式,整个页面乱了套——仿佛中了“牵一发而动全身”的诅咒。
这说明我们缺的不是代码,而是命名规范。而今天要讲的这个东西,就是让你告别“样式混乱地狱”的神器——BEM 命名规范,以及它在微信官方 UI 框架 WEUI 中的实战应用。
第一章:BEM 是什么鬼?
BEM 其实是一个听起来很高级、但其实特别接地气的命名规范。它的全称是:
Block Element Modifier
翻译成人话就是:
- Block(块) :一个独立的功能模块,比如按钮、表单、导航栏。
- Element(元素):属于某个 Block 的一部分,不能脱离 Block 存在,比如按钮里的文字、图标。
- Modifier(修饰符):用来描述状态或样式的变体,比如按钮的“主要”、“次要”、“禁用”状态。
看个例子你就懂了!
<div class="weui-page">
<h1 class="weui-page__title">这是标题</h1>
<button class="weui-btn weui-btn_primary">主要按钮</button>
</div>
在这个例子里:
.weui-page
是 Block;.weui-page__title
是 Block 下的 Element;.weui-btn_primary
是 Button 的 Modifier,表示这是一个“主要按钮”。
是不是比以前那种 .btn-blue
或者 .btn-red
干净多了?
第二章:WEUI 的 BEM 实践 —— 把按钮玩出花来
WEUI 是微信官方推出的一套 UI 样式库,风格简洁现代,适用于微信小程序和 H5 页面开发。它完美地运用了 BEM 命名规范,使得代码结构清晰、易于维护。
我们来看一段典型的 WEUI 结构:
<div class="weui-page">
<!-- ELement -->
<header class="weui-page__header">
<h1 class="weui-page__title">Button</h1>
<p class="weui-page__desc">按钮</p>
</header>
<main class="weui-page__body">
<div class="button-sp-area">
<a href="#" class="weui-btn weui-btn_primary">主要操作</a>
<a href="#" class="weui-btn weui-btn_default">次要操作</a>
</div>
</main>
</div>
这段 HTML 展示了一个完整的页面结构,使用了 WEUI 提供的多个组件,每个组件都遵循了 BEM 命名规则:
weui-page
是页面级别的 Block;weui-page__header
和weui-page__body
是该 Block 的 Elements;"button-sp-area
就是包裹按钮的一个区域weui-btn
是按钮 Block;weui-btn_primary
和weui-btn_default
是按钮的 Modifiers,分别表示主要按钮和次要按钮。
这样写的代码,不仅一眼就能看懂结构,还方便后期维护和扩展。
第三章:BEM 的三大法宝 —— Block、Element、Modifier
1. Block:项目的“积木”
Block 是一个独立的功能单元,它可以单独存在,也可以包含其他元素。比如:
.weui-btn
:按钮;.weui-cell
:列表项;.weui-form
:表单。
这些 Block 都可以被复用到不同的页面中,就像搭积木一样简单。
举个栗子🌰:
<button class="weui-btn">普通按钮</button>
<button class="weui-btn weui-btn__disabled">禁用按钮</button>
这样也方便复用,不需要重新写一个类来修饰我们的按钮
2. Element:Block 的“小弟”
Element 是 Block 的组成部分,不能脱离 Block 使用。例如:
.weui-cell__hd
:cell 组件的头部;.weui-cell__bd
:cell 的主体内容;.weui-cell__ft
:cell 的尾部。
举个栗子🌰:
<div class="weui-cells">
<h3 class="weui-cells__title">个人信息</h3>
<div class="weui-cell">
<div class="weui-cell__hd">
<img src="" alt="">
</div>
<div class="weui-cell__bd">
<p>标题文字</p>
</div>
<div class="weui-cell__ft">
说明文字
</div>
</div>
</div>
分析如下:
类名 | 角色 | 解释 |
---|---|---|
.weui-cells | ✅ Block | 表示“一组 cell 的容器”,是 WEUI 提供的一个组件 |
.weui-cells__title | ✅ Element | 属于 weui-cells 的标题部分 |
.weui-cell | ✅ Block | 单个 cell 组件本身也是一个 Block |
.weui-cell__hd | ✅ Element | 属于 weui-cell 的头部元素 |
.weui-cell__bd | ✅ Element | 属于 weui-cell 的主体内容 |
.weui-cell__ft | ✅ Element | 属于 weui-cell 的尾部内容 |
3. Modifier:给 Block 或 Element 加点“料”
Modifier 是 Block 或 Element 的状态或样式变化。通常以 _ 开头,表示它是某种变体。
- .weui-btn_primary:主要按钮;
- .weui-btn_disabled:禁用按钮;
- .weui-cell_access:带箭头的 cell。
举个栗子🌰:
<button class="weui-btn weui-btn_primary">主要按钮</button>
<button class="weui-btn weui-btn_disabled">禁用按钮</button>
下面两个表示的都是状态
- weui-btn_primary:主要按钮
- weui-btn_disabled:禁用的按钮
也是方便后期复用,不需要写多余的类来修饰另一个block的按钮
第四章:为什么大厂都在用 BEM?
你以为 BEM 只是写个类名那么简单吗?不,它背后藏着一套工程化思维。
✅ 清晰的结构
BEM 让你在写代码的时候就明确知道:
- 这个组件是什么(Block);
- 它里面有哪些部分(Elements);
- 它有什么状态(Modifiers)。
✅ 易于协作
想象一下,如果你和五个同事一起开发一个大型项目,大家随便起名字,那 CSS 就会变成一个“谁也不知道哪个类是干嘛的”的恐怖现场。而 BEM 规范统一了命名方式,让团队成员都能轻松理解彼此的代码。
✅ 便于维护和重构
有了 BEM,你可以很容易地定位某个组件的样式,并且不会影响到其他部分。比如你想改一下“主要按钮”的颜色,只需要修改 .weui-btn_primary
即可,不需要担心会不会误伤到别的按钮。
✅ 更好的组件化思想
BEM 鼓励我们把页面拆分成一个个小的组件,这种“组件化开发”思想正是现代前端开发的核心之一。不管是 Vue、React 还是 Angular,它们的本质也都是组件化。
第五章:从模仿到创新 —— 学习 WEUI 源码的正确姿势
很多小伙伴学习框架都喜欢“抄”,直接复制粘贴代码。但如果你想真正提升自己,建议你去看看 WEUI 的源码是怎么写的。
比如,你可以在 GitHub 上找到 WEUI 的开源项目,研究它的 CSS 文件结构:
.weui-btn {
/* 基础样式 */
}
.weui-btn_primary {
/* 主要按钮的样式 */
}
.weui-btn_default {
/* 次要按钮的样式 */
}
你会发现,它对每一个 Block、Element、Modifier 都有非常清晰的命名逻辑,几乎不需要注释也能看懂。
第六章:动手实践 —— 用 BEM 写一个自己的组件
纸上得来终觉浅,咱们来实战一把。
假设我们要写一个“用户卡片”组件:
<div class="user-card">
<div class="user-card__avatar">
<img src="avatar.jpg" alt="头像">
</div>
<div class="user-card__info">
<h3 class="user-card__name">张三</h3>
<p class="user-card__bio">前端开发者 | 爱写博客 | 喜欢吃火锅</p>
</div>
<button class="user-card__action user-card__action_follow">关注</button>
</div>
对应的 CSS:
.user-card {
display: flex;
padding: 16px;
border: 1px solid #eee;
border-radius: 8px;
}
.user-card__avatar img {
width: 60px;
height: 60px;
border-radius: 50%;
}
.user-card__name {
font-size: 18px;
margin: 0;
}
.user-card__bio {
color: #666;
}
.user-card__action {
margin-left: auto;
padding: 8px 16px;
background-color: #07c160;
color: white;
border: none;
border-radius: 4px;
}
.user-card__action_follow {
background-color: #ff9900;
}
你看,这个组件结构清晰、样式独立,还能通过 Modifier 来切换不同状态(比如“已关注”和“未关注”),简直不要太爽
第七章:结语 —— 成为更好的自己
写到这里,我突然想起一句话:
“代码是写给人看的,偶尔给机器跑一下。”
没错,编程不仅是写给计算机执行的指令,更是写给人类阅读的文档。而 BEM 命名规范,就是帮助我们写出更清晰、更易读、更可维护代码的重要工具。
希望你能从这篇文章中学到一点东西,哪怕只是记住一句:“Block 是爸爸,Element 是儿子,Modifier 是穿衣服的道具。”😄
📌 附录:常用 WEUI 组件一览
组件名 | 描述 |
---|---|
.weui-btn | 按钮 |
.weui-cell | 列表项 |
.weui-form | 表单 |
.weui-toast | 轻提示 |
.weui-dialog | 对话框 |
.weui-loading | 加载动画 |