h5 解决ios端输入框失去焦点后页面不回弹或者底部留白问题
项目中遇到了这个问题,说实话 iOS 端问题挺多的,原因找起来比较简单,就是吊起键盘的时候把window的高度挤小了,然后,
关掉键盘页面高度没恢复,安卓手机会自动恢复页面高度。
原因找到了就想解决办法,刚开始想的是 iOS 它不恢复那我也没办法,这属于 iOS 的bug啊或者微信的 bug 啊,但领导不这么想,
页面显示出问题了当然得解决,就在google里翻,也是找到解决方法了,如下链接
微信6.7.4 ios12软键盘顶起页面后隐藏不回弹解决方案
解决方法很简单,让window滚动下就可以恢复window的高度了。
第一种方法,在输入框失去焦点后(关闭键盘)让页面滚一下(select 标签导致页面底部留白此方法行不通,当用户未改变select 选中
的项就关闭选择框不能触发 change 事件,当用户选中后关闭选择框也不会触发blur事件, 除非点击非select 区域才会blur)
1. 非框架搭建的页面
const windowHeight = window.innerHeight input.addEventListener('blur', function () { let windowFocusHeight = window.innerHeight if (windowHeight == windowFocusHeight) { return } console.log(windowHeight + '--' + windowFocusHeight); console.log('修复'); let currentPosition; let speed = 1; //页面滚动距离 currentPosition = document.documentElement.scrollTop || document.body.scrollTop; currentPosition -= speed; window.scrollTo(0, currentPosition); //页面向上滚动 currentPosition += speed; //speed变量 window.scrollTo(0, currentPosition); //页面向下滚动 })
2. 因为经常用 vue 所以就写了全局指令,在输入框上加下就可以了,指令代码如下
const windowHeight = window.innerHeight Vue.directive('fixedInput', function (el, binding) { el.addEventListener('blur', function () { let windowFocusHeight = window.innerHeight if (windowHeight == windowFocusHeight) { return } console.log(windowHeight + '--' + windowFocusHeight); console.log('修复'); let currentPosition; let speed = 1; //页面滚动距离 currentPosition = document.documentElement.scrollTop || document.body.scrollTop; currentPosition -= speed; window.scrollTo(0, currentPosition); //页面向上滚动 currentPosition += speed; //speed变量 window.scrollTo(0, currentPosition); //页面向下滚动 }) })
3. Vue 在全局添加
先写一个mixin,fixedInput.js
1 export default { 2 data() { 3 return { 4 windowHeight: 0 5 } 6 }, 7 mounted() { 8 this.windowHeight = window.innerHeight 9 }, 10 methods: { 11 temporaryRepair() { 12 let that = this 13 let windowFocusHeight = window.innerHeight 14 if (that.windowHeight == windowFocusHeight) { 15 return 16 } 17 console.log(that.windowHeight + '--' + windowFocusHeight); 18 console.log('修复'); 19 let currentPosition; 20 let speed = 1; //页面滚动距离 21 currentPosition = document.documentElement.scrollTop || document.body.scrollTop; 22 currentPosition -= speed; 23 window.scrollTo(0, currentPosition); //页面向上滚动 24 currentPosition += speed; //speed变量 25 window.scrollTo(0, currentPosition); //页面向下滚动 26 }, 27 } 28 }
在 App.vue 中引用
1 <template> 2 <div id="app"> 3 <router-view /> 4 </div> 5 </template> 6 <script> 7 import fixedInput from '@/mixins/fixedInput' 8 export default { 9 name: 'app', 10 mixins: [fixedInput], 11 updated() { 12 // 解决ios输入框弹出的页面样式问题 13 document.querySelectorAll("input").forEach(item => { 14 item.onblur = this.temporaryRepair; 15 }); 16 document.querySelectorAll("select").forEach(item => { 17 item.onchange = this.temporaryRepair; 18 }); 19 document.querySelectorAll("textarea").forEach(item => { 20 item.onblur = this.temporaryRepair; 21 }); 22 }, 23 } 24 </script>