H5页面 ios 键盘收起后弹出层焦点错位

请注明出处:https://blog.csdn.net/qq_23179075/article/details/86497498

解决H5页面 ios键盘收起后弹出层焦点错位问题

用 H5 写app页面的时候 IOS 上出现如下问题:(Android 中不存在)
在这里插入图片描述
布局如上图:背后是可滚动的列表,前面是弹出框。当打开键盘后,弹出框跟后面的列表都会被顶上去一段距离,如下图:
在这里插入图片描述
当再关闭键盘就可能出现:前面的弹出框回到了原来的位置,而后面的列表依然是顶上去的位置。这时后再去点击弹出框的输入框或者按钮的时候发现焦点依然停留在键盘弹出后顶上去的位置,造成了弹出层焦点错位。只有手动滑动后面的列表到原来位置后,弹出层的焦点才会恢复,影响体验。

解决方法

  import $d from 'devices.js'
  let isReset = true;//是否归为
  if ($d.device() === 'ios') {
    document.body.addEventListener('focusin', () => {
      //软键盘弹出的事件处理
      isReset = false;
    });
    document.body.addEventListener('focusout', () => {
      //软键盘收起的事件处理
      isReset = true;
      setTimeout(() => {
      	//当焦点在弹出层的输入框之间切换时先不归位
        if (isReset) {
          window.scroll(0, 0);//失焦后强制让页面归位
        }
      }, 300);
    });
  } else if ($d.device() === 'android') {
    window.onresize = function () {
      //键盘弹起与隐藏都会引起窗口的高度发生变化
      let resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;
      if (resizeHeight < h) {
        //当软键盘弹起,在此处操作
        isReset = false;
      } else {
        //当软键盘收起,在此处操作
        isReset = true;
        setTimeout(() => {
          if (isReset) {
            window.scroll(0, 0);//失焦后强制让页面归位
          }
        }, 300);
      }
    }
  }

贴上devices.js的代码

export default {
  device() {
    const u = navigator.userAgent;
    const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
    const isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
    if (isAndroid)
      return 'android';
    if (isiOS)
      return 'ios';
  }
};
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值