安卓键盘弹出会把窗口顶起来,但收起时又不会自动滚动回来,从而导致页面错位等问题
借鉴思路即可,还需要针对项目具体需求进行改造。
思路: 利用安卓键盘弹出收起会触发resize事件来进行相关操作, 在无滚动条的单页面直接用 window.scrollTo 重置下页面位置即可,在有滚动条的页面始终保证输入框在可视区域
已知缺陷:
1. 由于上述所说的 ‘在有滚动条的页面始终保证输入框在可视区域’ ,导致输入框位置可能会变化,给人的感觉是输入框在跳位置一样(实际 scrollIntoView 是滚动到固定的位置)
2. scrollIntoView 在设置了 behavior: "smooth"属性之后就不能正常工作了,在html,body设置了css属性 scroll-behavior 之后也不能正常工作 (测试时二者的取值都是 smooth)
// 解决键盘弹出遮挡 保证输入框在可视范围
const ua = window.navigator.userAgent.toLocaleLowerCase();
const isIOS = /iphone|ipad|ipod/.test(ua);
const isAndroid = /android/.test(ua);
if (isAndroid) {
var originHeight = document.documentElement.clientHeight || document.body.clientHeight;
var isScroll = (document.documentElement.scrollHeight || document.body.scrollHeight) > originHeight; // 有滚动条的页面(移动端的滚动条在body)
// 由于js获取不到键盘弹出事件,所以只能通过监听window.resize来执行相关操作 (安卓的键盘弹出会触发,iOS的不会)
window.addEventListener('resize', function () {
var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;
if (originHeight < resizeHeight) {
// Android 键盘收起后操作
if(isScroll) {
document.activeElement.scrollIntoView({ block: "center" }); // 键盘收起后将输入框挪到可视区域内
} else {
// 如果是没有滚动条的单页面的话直接滚动页面到初始位置即可
window.scrollTo({
top: 0,
behavior: "smooth"
});
}
} else {
// Android 键盘弹起后操作
document.activeElement.scrollIntoView({block: "center"}); // 兼容第三方输入法跟浏览器
}
originHeight = resizeHeight;
}, false)
}