Layui弹层需响应横竖屏切换:监听orientationchange事件,用layer.style重设尺寸,宽高按窗口比例计算并兜底screen.height,iframe需load后调用iframeAuto或postMessage通信,area应为返回适配数组的函数。

当用户在手机上将页面从竖屏旋转为横屏,Layui弹出层仍保持竖屏时的宽高尺寸,导致内容被裁剪、按钮错位或留白过大,必须让弹层立即响应横竖屏切换并重算尺寸。
监听 orientationchange 事件并触发重绘
移动端横竖屏切换不触发 window.resize,必须单独监听 orientationchange 事件。
第一步:在 layer.open 成功回调中保存弹层索引 index,并绑定 orientationchange 监听器。
第二步:使用 setTimeout 防抖(150ms),避免 iOS Safari 在快速翻转时多次触发;调用 table.resize 不适用,此处应调用 layer.style(index, { width: ..., height: ... }) 重设尺寸。
第三步:宽度取 $(window).width() * 0.92,高度取 $(window).height() * 0.78 —— 这两个系数避开系统状态栏、底部导航条及 layer 自带标题栏的占用,【iOS 微信内嵌浏览器中 $(window).height() 常严重偏高,必须用 Math.min($(window).height(), screen.height) 作兜底】。
针对 iframe 弹层的额外处理
方法一:在 success 回调中给 iframe 绑定 load 事件,load 完成后立刻调用 layer.iframeAuto(index)。
方法二:若 iframe 页面支持 postMessage,可在子页检测到 window.orientation 变化后,向父页发送 { type: 'resize' } 消息,父页收到后执行 layer.style + layer.iframeAuto。
注意:layer.iframeAuto(index) 必须在 iframe 加载完成后再调,否则会取到 0 高度;跨域 iframe 会静默失败,需加 try/catch 并 fallback 到固定高度 ['90vw', '70vh']。
用函数式 area 实现首次打开即适配
area 不要写死,必须定义为返回数组的函数:
area: function() { return $(window).width() > $(window).height() ? ['95%', '85%'] : ['90%', 'auto']; }
这个判断逻辑在弹层首次打开时就生效,确保横屏进入时直接按横屏比例渲染,而非先按竖屏尺寸打开再等 resize 补救。











