layer全屏/还原操作不触发window.resize事件,需用full/restore回调并手动维护isFullscreen状态,手动调用layer.full()时需同步更新状态并延时重算尺寸。
layer 的全屏/还原操作本身不触发 window.onresize,也不是标准 dom resize 事件源。你监听不到,不是代码写错了,是 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,在 min 回调里设为 false(注意:min 不等于还原,而是最小化;真正还原对应的是 restore 回调)restore 回调,但仅当用户点击「还原」按钮时触发;若用户拖拽窗口大小导致退出全屏,则仍不会触发任何回调示例片段:
layer.open({ type: 1, content: '<div>test</div>', full: function(layero) { isFullscreen = true; console.log('已全屏'); }, restore: function(layero) { isFullscreen = false; console.log('已还原'); }});
用 layer.full(index) 或 layer.restore(index) 主动控制时,full/restore 回调并不会执行——这是 layer 的设计缺陷,文档也没说明。
实操建议:
isFullscreen = true; layer.full(index);
setTimeout(() => { /* 重算尺寸 */ }, 10),因为 layer 的 DOM 更新是异步的full 回调里再调一次 layer.full(index),会引发重复全屏或样式错乱layer 全屏本质是给弹窗容器加 layui-layer-full class 并设置 top/left/width/height 为 0/0/100%/100%,但这个过程在不同浏览器中渲染节奏不一致,尤其在 iframe 弹窗里容易拿不到最新尺寸。
实操建议:
full 回调里直接读 layero.width(),应改用 layero.find('.layui-layer-content') 再算内部高度requestAnimationFrame 才能读到真实尺寸;Firefox 下有时要等两个 tickvh 计算异常,全屏后建议用 document.documentElement.clientHeight 而非 window.innerHeight
事情说清了就结束。最麻烦的其实是「用户拖拽退出全屏」这种行为——layer 完全不监听,也没暴露底层 resize hook,只能靠轮询 getComputedStyle(layero[0]).width 或监听 document 的 visibilitychange 做兜底,但这已经超出 layer 原生能力范围了。