layer全屏/恢复操作不会触发window.resize事件,需借助full/restore回调手动维护isFullscreen状态,调用layer.full()时同步更新状态并延时重新计算尺寸。
先说一个实际开发中容易踩的坑:layer 弹窗的全屏切换,不会触发 window.onresize。这不是监听代码写错了,而是 layer 本身没有抛出这个事件——它只是内部修改了元素的 style 和 class,并未走标准的 DispatchEvent 流程。

那么,该如何处理?
- 放弃
window.addEventListener('resize', ...)这条路,它无法捕获 layer 的全屏切换。 - 改用 layer 自带的
full和min回调(注意不是success或end)。 - 但要注意,这两个回调仅在用户点击全屏/最小化按钮时触发。如果手动调用
layer.full(index)再还原,它们不会执行,需要自行补充逻辑。
如何在 full/min 回调中获取当前弹窗状态?
layer 未提供类似“当前是否全屏”的现成 API。layer.full(index) 和 layer.restore(index) 是命令式的,调用后不返回任何状态。因此,手动维护一个标志是必须的。
具体做法:
- 弹窗打开时,用变量或 data 属性记录初始状态,例如
let isFullscreen = false;。 - 在
full回调中设为true,在restore回调中设为false(注意min回调代表最小化,不是还原)。 - layer 2.8 以上版本支持
restore回调,但它只在用户点击还原按钮时触发。如果用户通过拖拽窗口大小被动退出全屏,该回调不会执行——这也算是一个设计上的“盲区”。
layer.open({
type: 1,
content: 'test
',
full: function(layero) {
isFullscreen = true;
console.log('已全屏');
},
restore: function(layero) {
isFullscreen = false;
console.log('已还原');
}
});
手动触发全屏后如何同步状态?
还需要注意一个细节:当直接用 layer.full(index) 或 layer.restore(index) 主动控制时,full/restore 回调并不会执行。这个点官方文档未明确说明,但实际表现确实如此。
应对策略:
- 手动调用之前,先同步更新状态变量:
isFullscreen = true; layer.full(index); - 如果需要响应式重绘(比如调整内部 iframe 高度),加一个
setTimeout(() => { /* 重新计算尺寸 */ }, 10)。这是因为 layer 的 DOM 更新是异步的,此时直接读取尺寸可能拿到的是旧值。 - 切忌在
full回调中再次调用layer.full(index),这会导致重复全屏或样式错乱。
兼容性与 DOM 更新时机
layer 的全屏实现,本质上是给弹窗容器添加 layui-layer-full class,并设置 top/left/width/height 为 0/0/100%/100%。但这个渲染节奏在不同浏览器中表现不一致,尤其在 iframe 弹窗里,常常无法获取到最新的尺寸数据。
一些实际测试中的经验:
- 不要在
full回调中直接读取layero.width(),改用layero.find('.layui-layer-content')来计算内部高度更可靠。 - Chrome 下可能需要等到
requestAnimationFrame才能读到真实尺寸;Firefox 有时需要等两个 tick。 - 移动端 Safari 对
vh的计算有特殊表现,全屏后建议使用document.documentElement.clientHeight,而不是window.innerHeight。
归根结底,最棘手的其实还是“用户拖拽退出全屏”这个行为——layer 完全不监听这类操作,也没有暴露底层 resize hook。如果想处理这种场景,只能靠轮询 getComputedStyle(layero[0]).width 或者监听 visibilitychange 来兜底。不过,这已经超出 layer 原生能力的范围了。
