說明
最近在用
vue
寫幾個H5頁面在微信上展現,遇到一個在彈窗上
input
輸入完成以後點擊鍵盤的完成,頁面底部留出一片空白的問題
出現緣由分析
- 當鍵盤擡起時,
window.scrollY
會從0變到鍵盤的高度,因此解決辦法就是當input
失去焦點的時候,將window.scrollY
從新設置爲0
解決
- 給全部的
input
`textarea組件設置獲取焦點和設置焦點事件,失去焦點的時候將
`window.scrollY`設置爲0
- 由於的是
vue
因此結合vue
來寫代碼
<template>
<input class="m-input" :value="value" @input="$emit('input', $event.target.value)" @focus="inputFocus()" @focusout="inputFocusOut">
</template>
<script>
export default {
name: "MInput",
props:['value'],
data(){
return{
timer:null
}
},
methods:{
inputFocus(){
if(this.timer){
clearTimeout(this.timer)
}
},
inputFocusOut(){
this.timer = setTimeout(() => {
window.scrollTo(0,0)
},10)
}
},
destroyed(){
if(this.timer){
clearTimeout(this.timer)
}
}
}
</script>
- 獲取焦點事件,判判定時器是否存在若是存在的話清除掉(上一個input設置的定時器)
- 失去焦點事件,將
window.scrollY
設置爲0
,而且給一個10
的定時器,減小頁面失去焦點的突兀感(爲了順滑一點點)
-
destroyed
vue
組件中若是使用了定時器,必定要記得在組件銷燬的生命週期裏將清時期清除掉,防止全局定時器過多,容易爆棧
補充:解決方案2
- 在input上分別增長
focus
和blur
的方法,基本能夠解決鍵盤迴落後留白問題;
handleFocus(event) {
let e = event.currentTarget;
setTimeout(() => {
e.scrollIntoView({
block: 'start',
behavior: 'smooth'
});
}, 300);
}
handleblur() {
let e = event.currentTarget;
setTimeout(() => {
e.scrollIntoView({
block: 'end',
behavior: 'smooth'
});
}, 300);
window.scrollTo(0, 0);
}
補充:解決方案3
//解決鍵盤彈出後擋表單的問題
window.addEventListener('resize', function() {
if(
document.activeElement.tagName === 'INPUT' ||
document.activeElement.tagName === 'TEXTAREA'
) {
window.setTimeout(function() {
if('scrollIntoView' in document.activeElement) {
document.activeElement.scrollIntoView();
} else {
document.activeElement.scrollIntoViewIfNeeded();
}
}, 0);
}
});
補充:頁面來回彈跳
- 問題:失焦時的scrollTop=0形成的頁面彈跳。原本iOS是作了這方面的優化,在軟鍵盤彈出和收起時頁面會smooth的平滑,因爲我加了scrollIntoView破壞了原生的優化致使彈跳了
- 解決:
handleFocus(event) {
clearTimeout(this.timer);
}
handleblur() {
this.timer = setTimeout(() => {
document.body.scrollTop = 0;
window.pageXOffset = 0;
document.documentElement.scrollTop = 0;
}, 100);
}
最後