ios原生导致window高度减小的问题(现象:ios软件盘或原生的下拉框等弹出后,页面没有下滑恢复)

现象:

ios软件盘或原生的下拉框等出现后,window高度减小,导致软键盘等关掉后,页面整体出现“被顶起”的现象,fiedx的元素虽然会回归原位“假象”,但是绑定在上面的事件等位置已改变;

测试发现(现象):

document.body.addEventListener('focusin',function(){
   //软键盘弹出的事件处理
   if(_this.isIphone()){
     console.log(window.innerHeight)//604;
   }
 })

 document.body.addEventListener('focusout', function(){
   //软键盘收起的事件处理
   if(_this.isIphone()){
     console.log(window.innerHeight)//308;
   }
})

先贴下面用的系统判断:

isIphone:function(){
  var u = navigator.userAgent;
  var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
  return !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
},

解决方式:

1 修改fixed为absolute定位;

适用:

1)按钮需始终定位于底部

2)遮罩输入表单等

不适用:

1)当页面中需要监听scrollTop等时,这种不适用,如有上下拉加载刷新的布局;

2 监听事件触发window的滚动;

例,如果是输入框,监听软键盘的弹出收起(vue):

mounted: function () {
  var _this=this;
  document.body.addEventListener('focusin',function(){
    //软键盘弹出的事件处理
    if(_this.isIphone()){
      window.scroll(0,0);
    }
  })

  document.body.addEventListener('focusout', function(){
    //软键盘收起的事件处理
    if(_this.isIphone()){
      window.scroll(0,0);
    }
 })

},

3 通过触发隐形的input焦点让window自己恢复原位

测试代码:

<ul id="ulBox" style=" position: fixed;top: 0;bottom: 0;background-color: antiquewhite;">
    <li>fixed定位</li>
    <li><input type="text" name="用户名" placeholder="请输入用户名"></li>
    <li><textarea name="message" rows="10" cols="30" placeholder="请输入信息"></textarea></li>
    <li><input id="click1" onclick=" alert('点击天女散花')" type="text" placeholder="点击天女散花"></li>
    <li><input id="click2" onclick="alert('点击福运连连')" type="text" placeholder="点击福运连连"></li>
    <li>
        <select>
            <option value ="1">天女散花</option>
            <option value ="2">福运连连</option>
        </select>
    </li>
</ul>

当触发ios原生下拉筛选或软键盘后,window被顶起,我们可以发现“touch”能够使页面“恢复正常”,点击其他的‘用户名’后(虽然是焦点的获取对象不是你目标的‘用户名’,这里触发了textarea),再点击其他发现页面恢复正常。

上面两种方式都能是页面恢复正常,但是touch没法js自动触发,所以可以使用第二种,思路是在ios原生控件‘消失’时(select应该是change改变,input是上面的键盘收起),js在页面生成隐形的input,让它获取焦点并且失去焦点(思路是这样,下面摘了一段别人回复的代码,vue封装指令,在触发ios原生的元素上绑定就行);

directives: {
      'resetInput':{
        // 当被绑定的元素插入到 DOM 中时……
        inserted: function (el) {
          var u = navigator.userAgent;
          if(!!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)){
            el.addEventListener('blur',function(){
              var input = document.getElementById('reset-input');
              if (!input) {
                input = document.createElement('INPUT');
                input.type = 'text';
                input.style.height = '0px'
                input.style.width = '0px'
                input.style.position = 'absolute'
                input.id = 'reset-input';
                document.body.prepend(input);
              }
              input.focus();
              input.blur();
            })
          }
        }
      }
    },

猜你喜欢

转载自blog.csdn.net/github_38928905/article/details/85286402
今日推荐