android h5端input聚焦后底部错位的根源是webview软键盘弹出时强制重排视口且不触发resize事件,导致fixed定位输入框被顶出;需用keyboardheightchange事件动态调整bottom值,并在blur时调用pagescrollto复位。

Android H5端input聚焦后底部错位的根源
这不是样式写错了,而是Android WebView在软键盘弹出时强行重排视口,且不触发标准resize事件,导致position: fixed或bottom: 0的输入框被“顶出”可视区域。尤其在Chrome内核较老的机型(如部分华为、小米)上,scrollIntoView也常失效。
pages.json里softinputMode对H5无效,别白配
H5平台完全不读取pages.json里的app-plus或mp-weixin配置项,所有softinputMode设置在这里对H5零影响。真要起效,必须走JS监听+手动调整。
- 删掉
pages.json中针对H5的softinputMode字段,避免误导 - 不要依赖
adjustResize或adjustPan——这些是原生App层概念,H5无对应实现 - 确认当前构建目标确实是
h5(uni.getSystemInfoSync().platform === 'android'且uni.getSystemInfoSync().environment === 'h5')
用keyboardheightchange事件动态修正bottom值
uni-app H5端提供了keyboardheightchange生命周期钩子(仅Android H5有效),它会在键盘弹起/收起时触发,并携带height参数。这是唯一可靠信号源。
- 在页面
onLoad或onShow中注册:uni.onKeyboardHeightChange - 拿到
height后,直接修改底部输入框容器的style.bottom为height + 'px' - 键盘收起时,
height为0,此时设bottom: '0'即可复位 - 务必用
uni.createSelectorQuery()查到真实DOM节点再改style,避免Vue响应式干扰渲染时机
示例关键代码:
uni.onKeyboardHeightChange(({ height }) => {
const query = uni.createSelectorQuery().in(this);
query.select('.bottom-input-wrapper').boundingClientRect();
query.exec(res => {
if (res[0]) {
const el = res[0].dataset.el; // 或通过ref获取
el.style.bottom = height + 'px';
}
});
});
失焦后页面卡在高位?手动pageScrollTo保底
Android H5键盘收起后,页面常卡在被推高的位置,滚动条无法拖回——因为WebView没触发scroll事件,且scrollTop未重置。
- 在
@blur事件里调用uni.pageScrollTo({ scrollTop: 0, duration: 0 }) - 加
setTimeout延迟100ms执行,避开键盘收起动画帧冲突 - 若页面用了
scroll-view,则需调用其scrollTo方法而非pageScrollTo - 避免在
v-if切换后立刻操作,先用nextTick确保节点已挂载
最易忽略的是:这个保底动作必须同时作用于input和textarea,二者在Android H5下行为不一致,textarea更容易残留滚动偏移。











