登录
首页 >  文章 >  前端

BEM框架命名规范详解

时间:2026-04-26 23:53:36 185浏览 收藏

BEM命名规范远不止是“用双下划线和短横线”的形式主义,其本质是通过block__element--modifier这一严谨结构实现样式作用域解耦与DOM重构的低风险保障——乱改符号会瓦解语义层级,引发样式冲突、状态失效和维护噩梦;文章直击实践痛点:从HTML中如何正确表达层级关系、到与Ant Design等第三方库的理性共存策略,再到何时该果断放弃BEM的清醒判断,层层揭示真正关键的不是死记符号,而是每个class是否清晰传达“它属于谁、扮演什么角色”,帮你避开看似省事实则埋雷的命名陷阱。

CSS项目如何规范命名系统_利用BEM框架建立命名准则

为什么 BEM 的 block__element--modifier 结构不能乱改

BEM 不是命名“风格”,而是为了解耦样式作用域和 DOM 变更成本。一旦把 __ 写成 - 或删掉双下划线,CSS 选择器就失去语义层级,.btn-primary.btn__primary 在组件重构时表现完全不同。

  • block__element 表示强归属关系:这个 element 只在 block 内部有意义,移出去就失效
  • --modifier 必须作用于 blockelement 本身,不能单独存在,否则无法通过 class 切换状态
  • btn-large 替代 btn--large 会导致和 btn__icon--large 冲突,失去修饰目标锚点

HTML 中怎么写才不破坏 BEM 语义

关键不是“有没有双下划线”,而是 class 是否真实反映 DOM 结构层级。BEM 要求每个 class 只表达一个角色:要么是 block,要么是它的 element,要么是它的 modifier。

  • 禁止嵌套 block:
    —— button 是独立 block,不是 card 的 part
  • element 必须直属于 block:

    ✅;

    ❌(不存在 __header__ 这种三级)

  • modifier 永远附加在主体 class 后:class="card card--featured"class="card__body card__body--compact",不能写成 card-featured__body

遇到第三方组件库(如 Ant Design)怎么兼容 BEM

不要强行给第三方 class 改名或加 BEM 前缀。它们的 class 是封装好的实现细节,硬套 BEM 只会让维护更糟。

  • 用 wrapper 元素隔离:
    ,只对 wrapper 应用 BEM
  • 覆盖样式时用 BEM 规则写 CSS,但 selector 目标仍是第三方 class:.my-form .ant-select-selector { … },而非试图重写 .ant-select-selector.my-form__select
  • 如果必须复刻 UI,就新建纯 BEM 组件,别在第三方 class 上叠 layer

什么时候该放弃 BEM,而不是硬套

BEM 在中大型项目里降低协作成本,但它不是银弹。当出现这些信号,说明当前场景不适合:

  • 组件粒度极小且无复用(比如一页只有一个 hero-banner),加 hero-banner__title 反而增加认知负担
  • 使用 CSS-in-JS(如 styled-components),天然靠 JS 作用域隔离,const Title = styled.h1 已隐含归属关系
  • 团队已稳定使用其他约定(如 SUIT CSS),强行切换带来的沟通成本 > 命名混乱成本

真正难的不是记住 __--,而是每次加 class 前问一句:这个 class 是为了让人一眼看懂结构,还是为了方便 grep 替换?后者往往埋雷。

以上就是《BEM框架命名规范详解》的详细内容,更多关于的资料请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>