移動端的fixed會有各種各樣奇怪的問題,比如說移動端鍵盤彈起后底部tab被頂到鍵盤上方,失去焦點后底部tab跳動到原位置,還有在底部tab加input的各種bug,還有被頂起后不回到原位,停留在頁面中間等等。
下面我總結一下github和各種前端技術網站的解決方案,主要就是以下幾種。
1. 使用iscroll.js(如果原生能解決,能不用第三方插件就不用,而且據說性能不是很好,實在沒辦法再用),但滾動頁面時input會有光標錯位的問題,解決方法是在滾動時讓input框失去焦點,收起鍵盤。
2. 把content部分設置為position:absolute,讓其中的內容內部滑動,這樣就不會影響到頭部和底部nav,頭部和底部也可以使用position:absolute,至於滑動不順暢,可以用-webkit-overflow-scrolling : touch,這種辦法依然有光標錯位的問題,原因是加了-webkit-overflow-scrolling : touch 這條代碼,導致滑動速度過快,光標來不及重繪,解決辦法同上。
嘗試過強制重繪,但無法解決。
3.
focus時把nav的定位改成static,讓他重回文檔流,blur時再移除變回fixed,這種辦法視覺體驗特別不好,會突然跳出來一個nav,不推薦使用,當然你可以用系統時鍾一直監控input框獲得焦點和失去焦點的狀態,但是嚴重浪費系統性能,所以放棄這種辦法。
4. 頭部底部nav還是用absolute,滾動時一直重新計算absolute位置,模擬fixed,這種辦法視覺體驗比上一種更差,一直抖動,不推薦使用。
5. 技術解決不了的,用業務解決,凡是有input的地方,都彈起一個新視圖,淘寶京東都是這么做的,完美避開nav和tab。
6. 不解決,頭部底部還是使用fixed,中間視圖就跟着body滾動,目前移動端瀏覽器端對原生fixed的支持也已經很好了,下面貼一張圖。
其實使用fixed對於移動端的瀏覽器親測沒有任何問題,但是對於完全仿原生App(固定到屏幕,並且把頭部導航欄去掉),還是會有input的bug,如果要強行使用fixed,我的解決辦法是固定到屏幕之后,還是以瀏覽器打開,不去頭部導航欄。