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

本文解决H5应用在iOS设备上遇到的键盘收起后弹出层焦点错位问题,通过监听键盘弹出与收起事件,强制页面归位,提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请注明出处:https://blog.youkuaiyun.com/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';
  }
};
<think>首先,用户的问题是:“iosH5页面键盘收起页面没有恢复,底部出现大片空白”。这是一个关于iOSH5页面键盘收起后布局问题的描述。 我需要用中文回答这个问题。回答后,必须提出3-5个相关问题。这些相关问题必须以“§§相关问题§§”开头,并且不能换行分散,意思是“§§相关问题§§”必须在一行中完整输出,然后列出问题。 回顾示例格式: - 回答部分:解释了快速排序的基本思想并提供了代码。 - 然后,直接输出“§§相关问题§§”,后跟相关问题列表(1. ··· 2. ··· 3. ···)。 所以,我的回答结构: 1. 回答用户的问题:解释iOS H5页面键盘收起后出现空白的原因,并提供解决方案。 2. 在回答末尾,输出“§§相关问题§§”,然后列出3-5个相关问题。 确保所有内容符合规则:回答必须完整,相关问题不可缺少。 现在,针对用户的问题:iOSH5页面键盘收起后,页面没有恢复,底部出现大片空白。这是一个常见的移动端Web开发问题,通常是由于键盘弹出页面被压缩,但收起时没有正确恢复。 常见原因: - 键盘弹出时,iOS可能会改变视口(viewport)或布局,导致页面元素位置错乱。 - 特别是当使用position: fixed的元素时,更容易出现问题。 解决方案: 1. 监听键盘收起事件,并触发页面重绘或滚动。 2. 使用JavaScript来调整页面布局。 3. 确保viewport设置正确。 一个典型的解决方案是: - 在键盘收起时,调用window.scrollTo(0, 0) 或类似方法,强制页面滚动到顶部,从而恢复布局。 - 或者使用setTimeout来延迟执行一些操作。 用中文回答: - 解释原因:iOS键盘弹出时调整了视口,收起时可能没有正确重置。 - 提供代码示例或步骤。 然后,提出相关问题: - 相关问题应该基于用户的问题和我的回答。例如: 1. 如何监听iOS键盘收起事件? 2. 还有其他方法解决键盘收起后的布局问题吗? 3. 为什么iOS会有这个问题,而Android没有? 4. 如何优化H5页面在移动端的键盘交互? 5. 使用position: fixed时需要注意什么? 我需要确保有3-5个相关问题。 最终输出: - 回答部分(用中文)。 - 然后“§§相关问题§§”一行。 - 然后相关问题列表,如“1. ... 2. ... 3. ...” 不能换行分散,意思是“§§相关问题§§”必须在一行,相关问题可以换行但列表要连续。 在示例中是: §§相关问题§§ 1. ··· 2. ··· 3. ··· 所以,我可以这样输出。 现在,构建回答。</think>### iOSH5页面键盘收起页面未恢复的解决方案 在iOSH5页面中,键盘收起页面未恢复、底部出现大片空白是一个常见问题,主要原因是iOS键盘弹出时改变了视口(viewport)高度,但键盘收起后未自动触发页面重排或滚动复位。这通常发生在使用`position: fixed`或`position: absolute`布局的元素上,导致页面高度计算错误。以下是解决方法: #### 原因分析 - **视口高度变化**:iOS键盘弹出时,会压缩页面高度;收起时,系统未自动恢复原始高度。 - **滚动位置问题**:输入框聚焦页面可能被滚动,键盘收起后未复位。 - **布局错乱**:固定定位元素(如底部导航栏)在键盘交互后位置异常。 #### 解决方案 1. **监听键盘收起事件并强制滚动**: - 使用JavaScript监听`resize`或`focusout`事件,在键盘收起时触发滚动操作。 - 示例代码: ```javascript // 监听窗口大小变化(键盘收起会触发resize) window.addEventListener('resize', function() { // 延迟执行,确保键盘完全收起 setTimeout(function() { // 强制滚动到当前滚动位置,触发重排 window.scrollTo(0, window.scrollY); }, 100); }); // 或者针对输入框失焦事件 document.querySelectorAll('input, textarea').forEach(function(element) { element.addEventListener('blur', function() { setTimeout(function() { window.scrollTo(0, window.scrollY); }, 100); }); }); ``` 2. **优化CSS布局**: - 避免使用`position: fixed`作为底部元素,改用`position: absolute`结合`flex`布局。 - 设置viewport元标签:`<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">`。 - 添加CSS修复: ```css body { position: relative; min-height: 100vh; /* 确保最小高度为视口高度 */ } .fixed-bottom { position: absolute; bottom: 0; width: 100%; } ``` 3. **使用框架或库**: - 集成如`fastclick`或`ionic`库处理移动端交互。 - 在Vue/React中,使用生命周期钩子监听键盘事件。 #### 测试建议 - 在iOS Safari或微信浏览器中测试,确保键盘交互后页面正常重绘。 - 如果问题依旧,检查是否有第三方脚本冲突。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值