安卓上键盘一弹出,吸底的提交按钮就被顶到屏幕中间,盖住上面的输入框,收起来又自己回到底部。日志里能对上时间点,这种反而好排。

安卓键盘弹出时压缩的是布局视口,fixed 元素按新高度重新算底部位置,得靠 visualViewport 拿到真实可视区再补偿。只用 bottom: 0 一定会飘,差值算准了位置就对了。这一点先确认清楚,后面就不用反复试。

const vv = visualViewport;
const gap = innerHeight - vv.height;
bar.style.transform = 'translateY(-' + gap + 'px)';

「键盘顶起 fixed」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。

处理上按这个顺序:用 visualViewport 的高度和窗口高度做差,判断键盘弹起了多少,差值就是键盘高度;弹起时把底栏平移到可视区上方,收起时还原位置,用 transform 比改 bottom 顺;实在处理不好就在键盘弹起时把底栏藏起来,输入完成再显示。

结果对不对很好判断,键盘弹起时底栏不挡输入框,收起后回到原位,滚动位置也不乱。

作者 9823189