BEM命名规范:为什么 block__element 不能写成 block element 在实际开发中,很多人刚接触BEM时,常纠结于用双下划线还是空格,觉得“反正能选中DOM,没什么区别”。实际上,浏览器处理CSS选择器时,空格会被解析为后代选择器,含义完全不同。 例如 .card__title
在实际开发中,很多人刚接触BEM时,常纠结于用双下划线还是空格,觉得“反正能选中DOM,没什么区别”。实际上,浏览器处理CSS选择器时,空格会被解析为后代选择器,含义完全不同。
例如 .card__title 和 .card .title 看起来目标一致,但前者匹配的是元素自身的类名,后者匹配的是 .card 内部任意层级的 .title。一旦嵌套结构发生变化,样式要么失效,要么误命中其他元素。
长期稳定更新的攒劲资源: >>>点此立即查看<<<

BEM命名的核心是约束,目的是让类名唯一且不依赖DOM结构。空格、连字符或驼峰写法都会破坏这种约束。例如 cardTitle 这类驼峰命名,既无法保证唯一性,也无法在CSS层面表达“这是card的一部分”的语义关系。
实操建议:
cardTitle)card__title is-large),应改用修饰符 card__title--largeBEM修饰符失效的常见原因是CSS优先级被父级或全局样式劫持。例如 .button--primary 在弹窗中不生效,往往是因为弹窗组件使用了 !important 或更宽泛的选择器(如 .modal * { color: #333 })。
那么,如何确保修饰符只影响当前块?
实操建议:
.button.button--primary 或 .button--primary(配合BEM命名约束)才是正确写法,单纯的 .button--primary 容易与其他块冲突body 或布局类(如 .container)作为修饰符作用域,BEM不依赖DOM结构,只依赖类名多个BEM块嵌套时,可以复用样式,但不能依赖同名。例如 header__logo 和 footer__logo 虽然都是logo,但属于不同块,CSS规则不能混用,否则修改一个会影响另一个。
实操建议:
u-text-center、u-margin-smallicon),可定义原子级块 icon,再让 header__icon 和 footer__icon 通过 @apply 或CSS自定义属性继承[class*="__icon"] 这类属性选择器做自动复用,会破坏命名意图,且无法静态分析使用PostCSS或SCSS编写BEM时,很多人会写成 .card { &__title { ... } },编译结果却是 .card .card__title(中间有空格),这不是BEM要求的独立类名,而是后代选择器,性能差、可维护性低,还容易漏掉类名绑定。
需要提醒的是,预处理器只是工具,不会主动理解BEM的含义。你需要明确告诉它:要的是一组独立的类选择器,而不是嵌套结构。
实操建议:
#{$block}__title),禁用 &__titlepostcss-bem 可自动补全,但需确认生成的是独立类选择器,而非嵌套结构grep -r "__" dist/css/ | grep " " 快速扫描是否有空格残留真正难的并非写对名字,而是当团队多人协作、组件跨项目复用时,守住“块之间零隐式耦合”这条线。类名一旦松动,后续所有样式隔离、主题切换、微前端样式沙箱都会出现问题。BEM命名规范看似简单,但一旦放松,返工成本极高。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述