20號新推送的IOS13給很多app廠商和RD帶來了便秘的感覺,目前復現的問題如下,后續還會持續更新:
1.H5 hybrid輸入框導致的頁面上移,卡住不動。收起減半后,頁面出現半截白屏。(IOS12 + IOS13)
IOS12會在鍵盤彈出時將頁面上推,並壓縮body的高度。
IOS13會在鍵盤彈出時將頁面上推,但html,body的高度全部不變。
目前移動端的輸入框不外乎一下三種:
(1)原生input
(2)可編輯DIV
(3)自家或他家的富文本編輯器
我司目前使用第二種方案,即可編輯DIV+本地原聲虛擬鍵盤(后續會改為原聲H5鍵盤),可從兩個層面解決上述問題。
首先需要在根節點最底部添加一個占位的DIV,並且設置不可見。
<div id="app"> <div v-if="loadingFlag && !timeoutFlag" class="hw-box"> <hw-entrance class="do-entrance"></hw-entrance> </div> <!-- IOS13用於兼容處理鍵盤彈出后頁面上拉的問題 --> <div id="bottomBackToView"></div> </div>
接下來要添加樣式:
#app #bottomBackToView{ display: block; width: 100%; height: 0; opacity: 0; }
H5層面:通過監聽焦點移除設置
oDom.addEventListener('blur', function () { document.body.scrollTop = 0; // IOS12 document.body.style.height = document.body.clientHeight; // IOS12 backView.scrollIntoView(); // IOS13用於兼容處理鍵盤彈出后頁面上拉的問題 })
上述解決方法在非可編輯DIV的方案中也許時能夠解決問題的,但是在Hybrid H5中可編輯DIV還有其他各種兼容性問題,在此,我們的最終解決方案時需要IOS配合解決的,利用IOS監聽鍵盤收起然后做對應的處理:
bridgeClass.jsEventHook.keyboardWillHide = function() { if (!switchFlag) { document.body.scrollTop = 0; // IOS12 document.body.style.height = document.body.clientHeight; // IOS12 backView.scrollIntoView(); // IOS13用於兼容處理鍵盤彈出后頁面上拉的問題 } };