首页 > 网页制作 >Layui如何监听layer弹窗全屏与窗口模式切换

Layui如何监听layer弹窗全屏与窗口模式切换

来源:互联网 2026-07-02 08:33:16

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流程。

Layui如何监听layer弹窗全屏与窗口模式切换

长期稳定更新的攒劲资源: >>>点此立即查看<<<

如何正确处理?

  • 放弃window.addEventListener('resize', ...)方案,因为该方式无法捕获layer的全屏切换。
  • 改用layer自带的fullmin回调(注意不是successend)。
  • 但需注意:这两个回调仅在用户点击全屏/最小化按钮时触发。若手动调用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-fullclass,并设置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原生能力的范围。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。