BEM通过将隐式DOM依赖显式写入类名(如.user-card__title)来防止样式跨模块污染和静默失效,确保改A不崩B。它用block__element--modifier三层结构声明语义,使类名自带作用域、脱离HTML结构独立存在,并强制单类名选择器以实现物理隔离与精准定位。
传统写法如 .user-card .title 把样式生效条件藏在 DOM 层级里,一旦把 <h3> 换成 <div role="heading">,样式就静默失效;更危险的是,它可能意外匹配到另一个模块的 .title —— 改 A 却崩 B。BEM 强制写成 .user-card__title,类名自带作用域,不依赖位置、不依赖标签、不依赖祖先,只认这个字符串。
BEM 不是拼名字游戏,而是三层语义显式声明:
.user-card 是 Block:独立功能单元,可复用、可移植,不依赖上下文.user-card__title 是 Element:必须依附 Block 存在,不能单独使用(class="title" 无效).user-card__title--small 是 Modifier:表示状态或变体,必须和 Block 或 Element 同时出现,不能单独用 .title--small
这种结构让类名自解释,别人不用翻 HTML 就知道这个元素属于哪个组件、处于什么状态。
BEM 是约束,不是万能膏药。以下场景不适合强行套用:
.u-text-center、.visually-hidden 本身无 Block 上下文,加前缀反而冗余.reset-list、.no-margin 是跨组件通用规则,不属于某个 Block.theme-dark 作用于整个页面,不是某块的变体强行给 Ant Design 的 Button 加 ant-button__icon 类,既违反其设计契约,又增加维护负担。
默认 stylelint 对 BEM 几乎零约束。.btn-primary、.modal-close-btn 全部畅通无阻。必须手动启用插件并严格配置:
selector-bem-pattern 设为 { "componentName": "[a-z][a-zA-Z0-9]+", "styleType": "bem" },拒绝大驼峰和下划线开头ignoreSelectors 加上 ["/^..+:(hover|focus|active|disabled)/"],避免误报伪类fix: true——语义纠错没法靠机器做,自动修复可能生成 .card__content__title 这种非法嵌套stylelint --config .stylelintrc.js src/**/*.css,不通过就阻断合并真正卡住问题的,从来不是人记不记得规范,而是机器能不能当场拦住错误写法。
virtualbox下怎么实现ubuntu20.04开机自动挂载共享文件夹?
ubuntu20.04怎么开启护眼模式? ubuntu夜间模式的设置方法
如何在Ubuntu 20.04上安装Microsoft Edge浏览器
Ubuntu20.10优麒麟触摸手势有哪些? 优麒麟系统新增手势汇总
优麒麟20.04.1发布 更新内容汇总(附下载)
Mermaid Visual Editor 如何同步可视化操作与 Mermaid 源码?