根本原因是iOS Safari(含微信内置浏览器)软键盘收起后不自动恢复window.innerHeight,导致layui组件高度计算错误而留白;需用微滚动+双scrollTop修复,并避免height硬编码、慎用padding-bottom。

为什么 layui 在 iOS 软键盘收起后总留白
根本原因不是 CSS 没生效,也不是 JS 没触发,而是 iOS Safari(尤其微信内置浏览器)在软键盘收起时不会自动恢复 window.innerHeight,导致 document.body.clientHeight 仍维持“被顶高”后的错误值;而 layui 的表格、弹窗、滚动容器等组件高度计算严重依赖这个值,一旦错位,底部就卡住一块空白,手动下拉才能恢复。
必须加的 iOS 键盘收起兜底 scroll 逻辑
仅靠 window.scrollTo(0, 0) 不够稳定——某些 iOS 版本(如 16.6+、17.5+)或微信 8.0.50+ 会忽略该调用。真正有效的做法是:在输入框 blur 后强制触发一次「微滚动」,让渲染引擎重新评估视口边界:
- 用
setTimeout延迟 100–300ms 执行,避开键盘动画未结束的竞态 - 先滚到
scrollY + 1,再立刻滚回scrollY,比直接设0更可靠 - 必须同时操作
document.documentElement.scrollTop和document.body.scrollTop,iOS 对两者处理不一致
示例代码(全局注册,推荐放在 main.js 或公共 mixin):
const fixIOSKeyboardBlank = () => {
if (!/iPhone|iPad|iPod/.test(navigator.userAgent)) return;
const restoreScroll = () => {
const y = window.scrollY;
window.scrollTo(0, y + 1);
setTimeout(() => window.scrollTo(0, y), 16);
};
document.addEventListener('blur', (e) => {
if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') {
setTimeout(restoreScroll, 200);
}
}, true);
};
layui 表格自身 height 参数加剧留白问题
如果你用了 height: 400 这类固定高度配置,那留白是双重叠加:iOS 视口失真 + layui 强制撑高容器。此时改用 minHeight 是最轻量解法:
- Layui 2.8+ 原生支持
minHeight,直接替换掉height即可 - 旧版(2.7 及以下)需在
done回调里手动补min-height到外层容器:$(table.elem).closest('.layui-table-view').css('min-height', '400px') - 绝对不要给
.layui-table-box设height或min-height,否则滚动条失效
别漏掉 body 和 layout 的 padding-bottom 干扰
部分项目用 layui-layout-admin,其默认样式里有 .layui-layout-admin .layui-body { padding-bottom: 44px }——这个值在软键盘收起后不会自动重置,会和残留视口高度叠加出更大空白。解决方式很直接:
- 定位到你项目中实际加载的
layui.css文件(注意不是 CDN 地址,是本地打包后的那份) - 搜索
padding-bottom,找到.layui-layout-admin .layui-body块,注释或删掉该行 - 如果用了自定义 skin 或主题,检查对应 class 是否也带类似 padding
复杂点在于:这个留白往往和键盘行为无关,但会在键盘问题发生后被放大成“怎么都清不掉”的假象;调试时建议先禁用所有自定义 CSS,确认是否来自 layui 原生样式。


















