🔥 BEM规范实战:微信WeUI按钮组件开发,从命名冲突到样式复用的完整解决方案

166 阅读2分钟

一、BEM命名规范概述

BEM(Block Element Modifier)是一种面向对象的CSS命名方法论,通过明确的命名规则提升代码可维护性。其核心公式为:

class = "{框架名}-{block名}__{element名}"                  // 基础结构
class = "{框架名}-{block名}__{element名} {框架名}-{block名}_{Modifier}"  // 状态/变体

二、BEM核心概念解析

1. Block(模块)

  • 定义:独立功能单元,可复用的UI组件

  • 示例.weui-page(页面容器)、.weui-btn(按钮组件)

  • 特点

    • 可单独存在
    • 不依赖其他模块
    • 可嵌套包含子元素

2. Element(元素)

  • 定义:Block的组成部分,不能独立存在

  • 示例.weui-page__header(页面头部)、.weui-page__title(标题)

  • 命名规则

    {block名}__{element名}
    

3. Modifier(修饰符)

  • 定义:表示状态或变体的标识符

  • 示例.weui-btn_primary(主按钮)、.weui-btn_loading(加载状态)

  • 使用场景

    • 功能变体(.weui-btn_default vs .weui-btn_primary
    • 交互状态(.weui-btn_loading.weui-btn_unableclick

代码示例

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>WEUI BUTTON 设计</title>
  <link rel="stylesheet" href="index.css">
</head>
<body>
  <!-- Block -->
  <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">
        <button class="weui-btn weui-btn_primary">主要操作</button>
        <!-- 一个下划线表示状态 -->
        <button class="weui-btn weui-btn_loading "></button>
        <button class="weui-btn weui-btn_primary weui-btn_loading ">主要操作</button>
        <button class="weui-btn weui-btn_primary weui-btn_unableclick">主要操作</button>
        <button class="weui-btn weui-btn_default ">次要操作</button>
        <button class="weui-btn weui-btn_default weui-btn_unableclick">次要操作</button>
        <button class="weui-btn weui-btn_default weui-btn_loading">次要操作</button>
        <!-- btn可以单开,和page同级 为 Block -->
        
      </div>
     
  </div>
</body>
</html>
 /* index.css */
 *{
  margin: 0;
  padding: 0;
  box-sizing: border-box;
 }
 body{
  background-color: #ededed;
  height: 100%;
 }
 .weui-page {
  padding: 18px;
 }
 .weui-page__header {
  padding: 40px;
 }
 .weui-page__title{
  font-size: 20px;
  font-weight: bold;
  margin-bottom: 10px;
​
 }
 .weui-page__desc{
  font-size: 12px;
  color:#827856;
 }
 
 .weui-btn-sp-area{
   margin-top: 10px;
 }
 .weui-btn{
  display:block;
  border-width: 0px;
  width: 153px;
  height: 42px;
  font-size: 15px;
  background-color: #00b853;
  color: #fbfbfb;
  margin: 0 auto;
  margin-bottom: 12px;
  border-radius: 4px;
 }
 .weui-btn_default{
  background-color: #dddddd;
  color: #333;
 }
 .weui-btn_loading {
  background: url(./loding.png) no-repeat center center;
  background-color: #00b853;
 }
​
.weui-btn_default.weui-btn_loading{
  background: url(./wloding.png) no-repeat 30px  center;
  background-color: #dddddd;
 }
 .weui-btn_primary.weui-btn_loading{
  background: url(./loding.png) no-repeat 25px  center;
  background-color: #00b853;
 }
 .weui-btn_unableclick{
  color: #ccc8c9;
 }
 .weui-btn_primary.weui-btn_unableclick{
  background-color:#ddd ;
  color: #333;
​
 }

效果

image-20250529005120331.png

原型图

weui-button.png