遮罩层必须作为modal的Element(modal__overlay)而非独立Block,因其语义归属单一弹窗、需共享显隐状态与动画逻辑;若定义为.overlay则导致多弹窗状态耦合、z-index失控、BEM关系断裂,且违反样式作用域隔离原则。

弹窗组件的 Block 必须是 modal(或带业务前缀如 user-modal),遮罩层只能是 modal__overlay,不能单独定义 overlay Block。
为什么不能把遮罩层写成独立 Block
常见错误是定义 .overlay、.overlay__backdrop,结果多个弹窗共用同一套类名,导致 .overlay--visible 一加,所有遮罩全亮。这违背“单个弹窗独立控制”的基本需求。
-
.overlay缺乏归属语义,无法区分是 modal 还是 drawer 的遮罩 - 遮罩的
z-index、transition、开关逻辑必须和弹窗容器强绑定,脱离 Block 就失去上下文 - DOM 中若出现
,BEM 关系断裂——overlay不再是modal的 Element
modal__overlay 的 CSS 声明要点
过渡动画必须写在 Element 基础类里,而不是修饰符中;否则隐藏时无动画。
-
.modal__overlay必须设position: fixed,否则z-index失效 - 禁用
display: none控制显隐——它不可过渡,应组合visibility+opacity -
transition属性必须声明在.modal__overlay上,不是.modal__overlay--visible - 示例:
.modal__overlay { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0, 0, 0, 0.5); opacity: 0; visibility: hidden; transition: opacity 0.2s ease, visibility 0.2s step-end; } .modal__overlay--visible { opacity: 1; visibility: visible; }
弹窗内部元素的 BEM 写法边界
Element 只能是一级直属子节点,且名称不含 Block 语义。
-
modal__header✅,modal__modal-header❌(冗余) -
modal__close-btn✅,但若该按钮在其他组件(如drawer)也复用,就该抽成独立 Blockclose-button,而非硬塞进modal__下 -
modal__content必须是modal的直接子元素;如果中间夹了未命名 wrapper,就要重审结构或补上modal__wrapper - 状态类如
modal--open必须挂载在上,不能只加modal--open——Modifier 永远不单独存在真正容易被忽略的是:BEM 不是字符串拼接规则,而是语义绑定契约。
modal__overlay这个名字本身就在说“它只活在 modal 里,删掉 modal 容器,它就不该存在”。一旦你发现某个 Element 类名在别处也被复制使用,那说明它本该是一个 Block。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











