Block是独立可复用的功能单元,须具业务语义且不依赖父容器;Element必须依附Block存在、禁嵌套、命名用双下划线连接;Modifier描述状态或变体,须语义化、不可绑定具体值、禁止替代结构。
Block 是一个语义完整、功能自洽的 UI 单元,不依赖父容器就能存在。比如 .card、.header、.search-form,它们各自有明确边界和用途,能被复制粘贴到任意页面位置直接生效。
常见误判是把视觉分组当 Block —— 比如把整个 .main-content 区域当成 Block,但它只是容器,没具体功能;真正该拆的是里面的 .article-list、.sidebar-nav 这类可复用组件。
user-profile ✅,userProfile ❌).page-header 不如 .header —— “page” 是上下文,不是 Block 本身属性Element 必须依附于 Block 存在,它没有独立语义。比如 .card__title、.card__footer,一旦脱离 .card 就失去意义,样式也可能失效。
错误写法:
标题 —— 这里缺失了 Block 容器,CSS 选择器 .card__title 通常依赖 .card 的作用域或嵌套逻辑(即使实际没嵌套,BEM 理念也要求语义绑定)。
.card__close-btn ✅,.card__red-btn ❌(颜色应由 Modifier 控制)__ 是硬性分隔符,不能写成 .card_title 或 .card-element-title
.card__body__paragraph__link 是反模式,应拆成 .card__body + .paragraph(新 Block)Modifier 表示状态或变体,必须和 Block 或 Element 绑定使用,永远不单独出现。它的核心作用是“开关式变更”,不是“新增样式”。
典型错误:给 .button 加 .button--primary 同时又写 .button--large,但没在 HTML 中同时应用两个类 —— 结果按钮尺寸没变,只改了颜色。BEM 要求状态类显式叠加。
.button--disabled、.menu--fixed
.card__title--highlighted、.form-input--error
.list--horizontal 代替 .list + .list__item 布局,那是 display 层面的事,应交由工具类或 CSS Grid/Flex 控制--active 应始终表示“当前激活”,不能在 Tab 组件里表示选中,在 Button 里表示 hover真实项目里最常出问题的不是命名规则本身,而是组合时的隐含约束。比如 .card__content--collapsed 看似合规,但如果 .card__content 本身没定义基础样式(padding、font-size 等),这个 Modifier 就成了空中楼阁。
另一个高频坑:用 Sass 写嵌套时,习惯性写出 .card { &__title { ... } &--highlighted { ... } },这没问题;但若写成 .card { &__title { &--large { ... } } },就违背了 BEM 原则 —— 元素的 Modifier 应直接挂在元素上,而不是嵌套在元素内部。
...
.input--has-error 比 .input--error 更清晰,因为后者可能被误解为“输入框本身出错”stylelint-selector-bem-pattern 检查类名,比人工 review 可靠得多tlwdr7650路由器没有wps按钮(tlwdr7650路由器没有wps按钮怎么办)
tlwdr7632扩展器电脑怎么设置(tlwdr7632扩展器电脑设置方法)
tlwda6332re安装教程(tlwda6332re如何安装)
tlwdr7632扩展器手机怎么设置(tlwdr7632扩展器手机设置方法)
tlxdr3010怎么设置网速快(tlxdr3010网速快设置方法)
tlwdr5620易展版怎么克隆(tlwdr5620易展版克隆方法)