现象:
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();
})
}
}
}
},