如何使用CSS BEM命名规范提升前端代码的可维护性?

轻雪同学_7215

轻雪同学_7215

2026-07-24

545人浏览

原创

直接写 .btn 会埋雷,因为它未声明归属、用途和状态,导致跨模块复用时样式冲突;bem 通过 block__element--modifier 强制显式上下文,确保语义唯一、结构可维护。

如何使用css bem命名规范提升前端代码的可维护性?

为什么直接写 .btn 会埋雷?

不是类名太短,而是它没说清“这个按钮属于谁、在哪用、什么状态”。.btn 在项目里可能被 header、card、form 各自塞进去,改一次样式,三处 UI 突然错位。BEM 不是加长名字,是强制显式归属——每个类名自带上下文。

常见错误现象:.btn-primary 看似合理,但一旦页面里出现两个不同逻辑的“主按钮”(比如表单提交 vs 模态框确认),它们就共享同一套样式,后续加 margin 或 font-size 必然冲突。

  • Block 必须语义化且唯一:用 .search-form 而不是 .form,用 .article-card 而不是 .card
  • Element 只能属于一个 Block:禁止出现 .header__btn 和 .modal__btn 共用同一份 CSS;各自定义 .header__action 和 .modal__confirm
  • Modifier 必须表达状态或意图:用 .button--loading,不用 .button--blue;用 .input--error,不用 .input--big

.block__element--modifier 这串下划线和短横怎么不写错?

双下划线 __ 是硬性分隔符,表示“属于”;双短横 -- 表示“是某种状态”。写反或混用(比如 .block--element)会导致类名语义断裂,团队协作时没人敢动。

实际场景中容易漏掉层级判断:一个按钮在 .user-profile 里,它是不是该叫 .user-profile__cta?答案取决于它是否只服务于该模块。如果它会被复用到 .settings-page,那它就应该是一个独立 Block .profile-cta,而不是依附于 .user-profile 的 Element。

PigX UI 前端开发
PigX UI 前端开发

PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。

下载
  • Block 名不能带位置信息:.left-nav ❌,应为 .main-nav ✅
  • Element 名不能是纯视觉描述:.btn-red ❌,应为 .btn--danger ✅
  • Modifier 可叠加但不可嵌套:.btn--primary--loading 允许,但 .btn--primary__icon 违反结构,图标应属 .btn__icon,状态由 .btn__icon--loading 承担

HTML 结构必须和 BEM 类名严格对齐吗?

必须。BEM 不是命名游戏,是结构契约。如果 HTML 里写 <button class="search-form__submit"></button>,但 DOM 实际嵌套在 .header 下且未包裹在 .search-form 内,CSS 就失去上下文依据,后期维护者第一反应是“这样式为啥生效?”而不是“这结构哪来的?”

性能影响很小,但可维护性断崖下跌:没有结构约束的 BEM,和随便起个 .u-margin-top-sm 没本质区别。

  • Block 必须有对应容器元素:.product-list 应包裹整个列表,不能只加在 <ul></ul> 上而漏掉标题或分页
  • Element 必须直属于 Block:.card__title 不能出现在 .card 外层的 <div> 里 <li>Modifier 类必须和 Block/Element 同级共存:<code><button class="btn btn--disabled"></button> 正确;<button class="btn--disabled"></button> 错误(丢失 Block 根)
  • BEM 和 CSS-in-JS、Tailwind 怎么共存?

    不冲突,但角色要分清。BEM 解决的是“这个样式属于谁”,而 Tailwind 解决的是“这个样式长什么样”。你在 React 组件里用 className="search-form search-form__input",完全可搭配 class="w-full p-2 border";但不要用 Tailwind 的 utility class 替代 BEM 的 Block 名。

    最容易被忽略的点:组件库封装时,BEM 前缀必须透传。比如封装一个 Button 组件,它输出的 DOM 应该是 <button class="button button--primary"></button>,而不是让使用者自己拼 "button button--primary"——否则 Block 归属就散掉了。

    • React/Vue 中,组件名即 Block 名:SearchBar → .search-bar,内部元素自然为 .search-bar__input
    • 禁用动态拼接类名:className={`${prefix}__item ${prefix}__item--${state}`} ❌;应预设完整类名或用条件对象
    • CSS-in-JS 里仍需保留 BEM 结构:css`&.button--loading { ... }` 比 css`&[data-loading] { ... }` 更易追溯

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

css 前端

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2323

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5023

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6110

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5638

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

803

5

css
css

css是层叠样式表,用来表现HTML或XML等文件样式的计算机语言,不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

4396

6

css居中
css居中

css居中:1、通过“margin: 0 auto; text-align: center”实现水平居中;2、通过“display:flex”实现水平居中;3、通过“display:table-cell”和“margin-left”实现居中。本专题为大家提供css居中的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

977

5

css如何插入图片
css如何插入图片

cssCSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述网页或应用程序外观和样式的标记语言。CSS可以控制网页的字体、颜色、布局、大小、背景、边框等方面,使得网页的外观更加美观和易于阅读。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.28

1818

6

css超出显示...
css超出显示...

在CSS中,当文本内容超出容器的宽度或高度时,可以使用省略号来表示被隐藏的文本内容。本专题为大家提供css超出显示...的相关文章,相关教程,供大家免费体验。

2023.08.01

3446

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 5.9万人学习

CSS教程
CSS教程

共754课时 | 96.5万人学习