BEM命名核心是“一个容器一个block,名称须体现业务职责而非DOM结构”,如editor-container代替page-layout,并拆分子模块为独立block;CSS禁用嵌套选择器,每个element需完整class名且不依赖层级;Grid/Flex容器本身即block,第三方组件须包裹隔离。
别把 BEM 当成套模板硬套,一上来就分 block__element--modifier,结果嵌套三层还搞不清哪个 __header 属于哪个 block。核心是:**一个容器对应一个 block,且 block 名必须反映它的业务/布局职责,不是 DOM 结构**。
比如一个带侧边栏、主内容区、底部操作栏的编辑页,别起名叫 page-layout——这等于没说;换成 editor-container,后续所有子元素都从它出发定义:editor-container__sidebar、editor-container__main、editor-container__footer-actions。
block 名必须可读、唯一、带语义(如 dashboard-grid、product-card-list),不能是 wrap、container、box 这类泛称__element 名(比如两个不同 block 都用 __title),容易在 CSS 里互相污染editor-container 里的实时预览区),优先拆成独立 preview-pane block,而不是塞进 editor-container__preview
复杂布局最怕写一堆 .editor-container .editor-container__sidebar .editor-container__sidebar-item 这种链式选择器——既难维护,又容易被更高权重覆盖。BEM 的价值恰恰是让你「放弃嵌套」。
每个 __element 必须有独立、完整、可复用的 class 名,CSS 规则只基于 class,不依赖 DOM 层级:
立即学习“前端免费学习笔记(深入)”;
.editor-container__sidebar { width: 280px; }.editor-container__sidebar-item { padding: 8px 12px; }.editor-container__sidebar-item--active { background: #007bff; }
.editor-container__sidebar .item ——.item 不是 BEM 命名,且语义丢失--modifier 只改状态或变体,不负责布局定位;位置、尺寸等交由 block 或 element 自身控制@media 直接重写 .editor-container__sidebar,而不是另起一套 .editor-container__sidebar--mobile
Grid 容器本身就是一个天然的 block,别把它当“工具”忽略。比如一个仪表盘用 display: grid 划分区域,就该定义为 dashboard-grid,各区域作为 __area 元素:
<div class="dashboard-grid"> <aside class="dashboard-grid__sidebar"></aside> <main class="dashboard-grid__content"></main> <footer class="dashboard-grid__status-bar"></footer></div>
dashboard-grid 负责定义 grid-template-areas 和整体 gap;子元素只管自身内容样式,不反向控制父级布局grid 和 float),否则 BEM 的语义边界会模糊__element 内部要用 Flex 排列按钮组,那就让它自己成为新 block:button-group,而不是写 .dashboard-grid__footer .btn
冲突往往不出在命名规则本身,而出在「没守住边界」。最典型的是:把第三方组件直接塞进你的 block,却不隔离样式。
比如在 editor-container__main 里用了 react-quill,它自带一堆 .ql-* class,这些不会自动带上 editor-container 前缀,就会和你全局的 .ql-toolbar 冲突。
:where() 或 [class^="editor-container"] 限定作用域(若支持)__element 上直接写 !important,这等于否定 BEM 的层级契约postcss-bem 类插件——它可能自动补全 modifier,也可能悄悄改掉你手写的 class真正难的不是写对第一个 block,而是当页面叠加到五层布局嵌套、三个异步加载模块、两套主题切换逻辑时,还能让每个 class 名一眼看出归属和意图。这时候,命名不是规范问题,是信息架构问题。