加 readonly 是最直接有效的解法,不触发软键盘就避免视口压缩导致下拉浮层错位;layui 下拉组件本不依赖手动输入,设 readonly=true(非 disabled)可稳定兼容各移动端 WebView。

加 readonly 是最直接有效的解法,不触发软键盘,就根本不会被遮。
为什么移动端下拉框会被输入法遮住
这不是 layui 的 bug,而是移动端浏览器(尤其是 iOS Safari 和微信 WebView)的共性行为:点击可编辑的 <input> 或 <select> 时,系统强制弹出软键盘 → 视口(visualViewport)高度压缩 → 原本用 position: absolute 挂在 body 下的下拉浮层(如 lay-select 面板、laydate 日历)仍按旧视口计算位置,结果卡在键盘上方或底部被截断。
常见现象包括:下拉菜单只露一两条、滚动表格时面板错位、点击无反应、iOS 直接跳全屏选择器。
给 input 加 readonly 就能绕过整个链路
layui 的下拉组件(lay-select、laydate、autocomplete)本质都不依赖手动输入,只靠点击/选择触发。所以让输入框「不可编辑」反而更稳:
-
<input type="text" id="city" readonly>—— HTML 中直接写死 - JS 动态创建时,必须同步设
inputEl.readOnly = true(注意是readOnly,不是disabled) - 千万别用
disabled:它会让 layui 表单组件初始化失败,且样式变灰、无法触发事件 -
readonly在所有现代移动端 WebView(含微信、QQ、iOS Safari)中完全兼容
如果真要保留可编辑 + 下拉双模式
此时必须监听软键盘行为并主动干预,不能等它弹出来再补救:
- 确保下拉组件挂载目标是
document.body(例如elem: document.body),避免被局部overflow: hidden的父容器裁剪 - 监听
focusin事件,在聚焦瞬间调用inputEl.scrollIntoView({ block: 'center' }),强制输入框居中(iOS 15.4+ 已废弃scrollIntoViewIfNeeded,别用) - 定位计算优先用
window.visualViewport?.height,而不是window.innerHeight—— 后者在部分安卓浏览器中不随键盘实时更新 - 若用
laydate,必须设trigger: 'click'+position: 'fixed',否则默认trigger: 'focus'会尝试贴着 input 定位,一弹键盘就错位
真正容易被忽略的是:很多开发者以为改 z-index 或调高弹层层级就能解决,但实际是 overflow: hidden 和视口压缩导致的渲染裁剪,跟层级无关。动手前先确认你面对的是「键盘遮挡」还是「父容器裁剪」——前者靠 readonly 或 visualViewport 监听,后者得动 CSS 容器或组件挂载点。


















