BEM:让CSS选择器自己开口说话 在CSS的世界里,命名一直是个头疼事。但有一种方法,能让你的class名像说明书一样清晰——这就是BEM。它通过一套“块__元素--修饰符”的命名规则,让每个选择器的职责一目了然。比如,button__icon 直接告诉你这是按钮内部的图标元素,而 button-
在CSS的世界里,命名一直是个头疼事。但有一种方法,能让你的class名像说明书一样清晰——这就是BEM。它通过一套“块__元素--修饰符”的命名规则,让每个选择器的职责一目了然。比如,button__icon 直接告诉你这是按钮内部的图标元素,而 button--primary 则表明这是一个主色调的按钮变体。这套方法的核心在于,命名本身就能描述UI组件的逻辑结构,无需依赖上下文或额外的注释去猜。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
秘诀就在于它的“三段式”结构。BEM用固定的分隔符,把「组件名」、「子元素」和「修饰状态」这三者强行拆开。这样一来,header__logo--dark 这个类名,即便不打开HTML文件,你也能立刻解读出:这是 header 组件里的 logo 子元素,并且当前处于暗色模式的状态。
当然,实践中总有些常见的“跑偏”写法。比如写成 header-logo-dark,这就混淆了分隔符,丢失了BEM的语义层次。或者使用驼峰命名 headerLogoDark,不仅破坏了可读性,也与CSS选择器的常规风格格格不入。更隐蔽的一个坑是嵌套过深,例如 card__content__title__link —— BEM明确禁止出现三级子元素。遇到这种情况,通常意味着 title 本身应该被设计成一个独立的块,正确的写法应该是 title__link。
__(例如 button__icon),记住不是单下划线。--(例如 button--primary),别用单个 - 或下划线 _ 代替。header__button--submit 这样的东西;如果 button 是一个独立组件,就应该直接用 button button--submit。让我们从一个真实场景入手:你需要封装一个按钮组件,它要包含图标、支持加载状态,并且能切换主题色和尺寸。BEM的原则是“一个class只干一件事”,所以我们需要把不同维度的样式拆解成多个独立的类,而不是把所有语义都堆砌在一个类名里。
来看一个正确的例子:。在这里,button 是基础块,button--primary 和 button--large 是控制颜色和大小的修饰符。而 is-loading 则是一种常见的布尔状态类(BEM社区通常推荐用 is- 前缀来表示这类开关状态)。
立即学习“前端免费学习笔记(深入)”;
button__icon 和 button__text 这类元素类,必须是块的直接子元素。不要在外面再套一层 div 然后给它加类名。button--primary button--small 同时生效,互不影响。button--primary--loading 这种复合修饰符。加载态应该由独立的 is-loading 类来控制,这样逻辑更清晰。直接上手覆盖第三方组件自带的class,无异于给自己埋雷。BEM对此的解决方案是“作用域隔离”:用一个我们自己的BEM块作为容器,包裹住第三方组件,所有定制样式都通过这个容器块向下穿透控制,绝不直接修改第三方组件的原始类名。
举个例子,在使用Element Plus的 el-button 时,不要直接写 .el-button--primary { ... } 去覆盖。而是这样做:。随后,在CSS中通过 .my-form__submit ::v-deep .el-button { ... }(Vue单文件组件写法)或 .my-form__submit .el-button(常规写法)来定义样式。这样既保持了项目自身的BEM结构,又不会污染全局样式。
prefix-icon),而不是强行给内部元素添加类似 el-input__inner 的类。generateScopedName 的选项,确保分隔符 __ 和 -- 得以保留。问题出在默认行为上。CSS Modules 为了样式隔离,会给class名加上哈希后缀。于是,button__icon 可能就变成了 abc123__icon。这样一来,BEM精心构建的语义链就在DOM中“消失”了。开发者调试时,无法将看到的类名与源码对应,设计稿上的标注也变得无从查找。
如果非要结合使用,就必须关闭哈希,或者将BEM结构加入白名单:比如把配置从 localIdentName: '[name]__[local]--[hash:base64:5]' 改成不含哈希的 [name]__[local]。但这又背离了CSS Modules防止样式冲突的初衷。因此,一个更现实的选择是:既然决定采用BEM,就干脆放弃CSS Modules,转而使用PostCSS插件(如 postcss-bem)进行预处理,或者直接依靠严格的命名约定和代码审查来保证样式隔离。
card__header 在开发者工具里根本搜不到,极大地增加了跨角色协作的成本。u-text-center、布局类 o-layout-grid)是更顺畅的路径。说到底,BEM最难的地方不在于语法是否正确。真正的挑战在于,如何让团队中的每一个人——无论是新入职的同事、合作的外包伙伴,还是偶尔需要修改模板的后端开发——都能在不查阅冗长文档的前提下,仅凭直觉就写出符合规范、不产生冲突、也不越界的class名。这需要的不是某个一劳永逸的工具,而是持续的代码审查和一份清晰明确的命名字典。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述