layer全屏/还原操作不触发window.resize事件,需用full/restore回调并手动维护isFullscreen状态,手动调用layer.full()时需同步更新状态并延时重算尺寸。 在layer弹窗的实际开发中,全屏切换不触发window.onresize是一个常见问题。这并非监听
layer全屏/还原操作不触发window.resize事件,需用full/restore回调并手动维护isFullscreen状态,手动调用layer.full()时需同步更新状态并延时重算尺寸。
在layer弹窗的实际开发中,全屏切换不触发window.onresize是一个常见问题。这并非监听代码有误,而是layer本身未抛出该事件——它仅通过修改元素的style和class来实现全屏还原,并未走标准的DispatchEvent流程。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
如何正确处理?
window.addEventListener('resize', ...)方案,因为该方式无法捕获layer的全屏切换。full和min回调(注意不是success或end)。layer.full(index)再还原,它们不会执行,需自行补充逻辑。layer未提供类似“当前是否全屏”的现成API。layer.full(index)和layer.restore(index)是命令式的,调用后不返回任何状态。因此,手动维护一个标志是必要的。
具体做法:
let isFullscreen = false;。full回调中设为true,在restore回调中设为false(注意min回调代表最小化,不是还原)。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);setTimeout(() => { /* 重算尺寸 */ }, 10)。这是因为layer的DOM更新是异步的,此时直接读取尺寸可能仍为旧值。full回调中再次调用layer.full(index),否则会导致重复全屏或样式错乱。layer的全屏实现本质是给弹窗容器添加layui-layer-fullclass,并设置top/left/width/height为0/0/100%/100%。但该渲染节奏在不同浏览器中表现不一致,尤其在iframe弹窗中,常无法获取最新尺寸数据。
实际测试经验:
full回调中直接读取layero.width(),改为从layero.find('.layui-layer-content')计算内部高度更可靠。requestAnimationFrame才能读到真实尺寸;Firefox有时需等两个tick。vh的计算有特殊表现,全屏后建议使用document.documentElement.clientHeight而非window.innerHeight。归根结底,最棘手的仍是“用户拖拽退出全屏”这一行为——layer完全不监听此类操作,也未暴露底层resize hook。若需处理该场景,只能靠轮询getComputedStyle(layero[0]).width或监听visibilitychange做兜底。不过,这已超出layer原生能力的范围。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述