0

0

CSS命名规范BEM详解_Block-Element-Modifier的结构化设计

P粉602998670

P粉602998670

发布时间:2026-02-20 10:41:02

|

750人浏览过

|

来源于php中文网

原创

bem是一种css命名方法论,通过block-element-modifier三段式命名(如.menu、.menu__item、.menu--horizontal)解决样式作用域冲突问题,避免同名类名相互影响。

css命名规范bem详解_block-element-modifier的结构化设计

什么是BEM,为什么直接写 .header-nav 不行 BEM强制用三段式命名:Block(模块)、Element(元素)、Modifier(状态),比如 .menu.menu__item.menu--horizontal。不是为了好看,是为了解决CSS作用域失控——你改了 .nav,结果首页轮播图的“导航”也塌了,因为两个 .nav 碰巧同名又没隔离。 常见错误是把语义当结构,比如写 .user-card__name,但实际这个 name 在用户列表页也复用,它本质是独立 Block;或者把 Modifier 当成样式开关,写成 .button--red,结果设计师说“红色只是品牌色,换主题就得全搜替换”,其实该用 .button--primary 这种语义化修饰符。

实操建议:

立即学习前端免费学习笔记(深入)”;

Flux AI
Flux AI

Flux AI,释放你的想象力,用文字生成图像

下载
  • Block 必须有独立功能和复用价值,不能只是视觉分组(比如 .section-2 就不合格)
  • Element 名称不带父级语义,.card__title 正确,.card__card-title 是冗余
  • Modifier 值必须可预测,避免 --v2--new 这类临时标签

嵌套层级怎么控制,scss 里能写多深 BEM本身禁止CSS嵌套超过一层,即只允许 .block__element.block--modifier,不允许 .block__element__subitem.block__element .subitem。这不是教条,是因为每多一层选择器,就多一分耦合风险:你改 .listdisplay,可能意外影响 .list__item__icon 的定位逻辑。 SCSS 里用 &__&-- 是安全的,但一旦出现 &__item &__icon(中间带空格),就等于生成了后代选择器,破坏BEM隔离性。

实操建议:

立即学习前端免费学习笔记(深入)”;

  • SCSS 中只用单层嵌套:.block { &__element {} &--modifier {} }
  • 遇到“子元素的子元素”,优先拆成新 Block,比如 .table 里的 .table-cell__badge 应改为 .badge(独立 Block)+ .badge--in-table
  • 如果真需两层视觉关系,用属性选择器替代,比如 [data-badge-type="status"],比 .cell__content__badge 更可控

React 组件里怎么用 BEM,classnames 怎么配 React 中最常踩的坑是把 BEM 当字符串拼接:写 className={`card__header ${isExpanded ? 'card__header--expanded' : ''}`。问题不在语法,而在于 Modifier 状态分散在 JSX 多处,后续加个 disabled 状态就得再补一串三元。 classnames 库能收敛逻辑,但要注意它不解决 Block 命名一致性问题——你传入 card__header,组件内部却用 header 作 Block 名,最终生成的类名对不上。

实操建议:

立即学习前端免费学习笔记(深入)”;

  • 每个组件顶部定义 Block 名,如 const BLOCK = 'user-profile',所有类名基于它派生
  • Modifier 用对象写法:classnames(`${BLOCK}__avatar`, { [`${BLOCK}__avatar--large`]: isLarge })
  • 避免在子组件里硬编码父级 Block 名,用 props 透传 Block 前缀,或用 useBem 自定义 Hook 统一管理

为什么 .btn--primary.btn-primary 更可靠 破折号(--)是 BEM 的语法锚点,它让类名具备机器可解析性。工具链能靠它区分 Block、Element、Modifier:PostCSS 插件可以自动校验 .menu__item--disabled 是否存在对应 .menu__item;VS Code 插件能高亮跳转到定义处;甚至 CI 脚本可以扫描出所有孤立的 Modifier 类名(写了 --hover 却没定义 __trigger)。 下划线风格(.btn_primary)或连字符风格(.btn-primary)会模糊边界:.btn-primary 看起来像 Block,但其实是 Modifier;.form-input-error 分不清是 form__input-error 还是 form-input__error

实操建议:

立即学习前端免费学习笔记(深入)”;

  • 全项目统一用双破折号 -- 表示 Modifier,双下划线 __ 表示 Element,这是 BEM 解析器唯一认的标准
  • 别为了“更短”改成单破折号,.btn-primary 在 Webpack + CSS Modules 下容易和本地作用域冲突
  • 如果团队已用 Tailwind,BEM 可退守为 Block 层命名规范(只约束 .card.modal 这些顶层类),Element/Modifier 交给 utility classes 承担
BEM 的复杂点从来不在语法,而在 Block 边界的判断——同一个 UI 区块,在列表页是 Element,在详情页可能就是独立 Block。这没法靠规则穷举,得靠每次写 __ 前问一句:它未来会被抽出来单独复用吗?没人问,就容易变成又一套“看起来规范”的技术债。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

371

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

548

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

594

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1555

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

640

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

965

2024.03.22

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

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

精品课程

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

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.4万人学习

CSS教程
CSS教程

共754课时 | 33.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号