shadeclose: false 仍关闭是因 esc 监听、css 穿透、下层弹窗主动关闭、快捷方法默认启用或封装覆盖等干扰;shade 与 shadeclose 控制不同维度,shade 为 0 或 false 时 shadeclose 无效。

默认就不关闭,不用额外操作——只要没写 shadeClose: true,点遮罩层根本不会触发关闭。
为什么写了 shadeClose: false 还是关了?
不是配置失效,而是其他机制在“代打”:
-
Esc键被响应:Layer 默认监听Escape,和遮罩无关;需加closeBtn: 0并手动拦截keydown中的e.key === 'Escape' - 遮罩被 CSS 穿透:比如父容器设了
pointer-events: none,点击直接穿透到下层按钮或layer.close()调用处 - 多层弹窗嵌套时,上层
shadeClose: false,但下层监听了全局click并主动调用layer.close(),造成“点哪都关”假象 - 用了
layer.msg/layer.alert等快捷方法:它们内部默认启用shadeClose: true,必须显式传参覆盖,例如layer.msg('提示', { shadeClose: false })
shade 和 shadeClose 的关系别搞混
二者控制不同维度:
-
shade: false或shade: 0→ 遮罩 DOM 不生成(false)或透明度为 0(0),此时shadeClose完全无效(没东西可点) -
shade: 0.3+shadeClose: false→ 遮罩可见,但点击无反应(这才是“禁用点击关闭”的标准组合) -
shade: 0.01+shadeClose: false→ 遮罩几乎不可见,但保留 DOM 和事件绑定能力,适合需要视觉分层又不想用户误关的场景
封装过 layer 的项目,要检查统一调用入口
很多团队会封装 myLayer.open(),并在其中强制设置 shadeClose: true —— 即使你传入 shadeClose: false,也可能被覆盖。排查时重点看:
- 是否在封装函数里用了
Object.assign({ shadeClose: true }, options)类逻辑 - 是否全局重写了
layer.config({ shadeClose: true })(注意:该配置对快捷方法如layer.msg无效) - 拼写是否正确:
shadeClose不是shadeclose、shade_close或shadeClosee,大小写错误会导致静默忽略
最易被忽略的一点:移动端点击遮罩变色或抖动动画失效,往往不是 shadeClose 没设对,而是 iOS Safari 下 click 事件延迟或被吞掉,尤其在快速滚动后立刻点击遮罩边缘——这时得换 touchstart 或加 { passive: false } 显式声明。











