1. 程式人生 > 程式設計 >iOS新版微信底部工具欄遮擋問題完美解決

iOS新版微信底部工具欄遮擋問題完美解決

一、問題描述:

蘋果裝置(iOS)微信中開啟H5頁面,從首頁跳轉到其他頁面後,頁面的底部會出現一個帶有前進和後退按鈕工具欄,而該工具欄會遮擋住面底部的內容,影響頁面的正常使用。

二、原因分析:

造成該現象的原因是,當頁面跳轉時,微信瀏覽器會通過window.history讀取到瀏覽的歷史記錄,此時便會在頁面底部顯示出前進後退按鈕的工具欄,造成頁面底部內容遮擋。

三、解決方案:

瞭解了該問題出現的原因,我們也就有了解決辦法。首先想到的方案就是控制瀏覽器的歷史記錄。由於考慮到安全性問題,瀏覽器的歷史記錄不支援刪除和修改等操作,只能通過新增或替換的方式來實現對瀏覽歷史的操作,因此可以有以下方案:

(一)方案一:將頁面的路由跳轉方式更換為 “replace” 方式,原生寫法可以使用 window.location.replace() 替代 window.location.href ;vue中可以用this.$router.replace() 替代 this.$router.push()。

本以為這樣就可以解決該問題,但是經過測試發現該方案也會出現一些弊端:

  • 無法使用後退功能,在其他機型(安卓機型)上後退會直接退出;
  • 跳轉到某些外部頁面再後退回來,底部的工具欄還會出現。

為了解決第一個問題,想到了第二個方案——監聽瀏覽器返回功能:

(二)方案二:通過history的state來監聽瀏覽器的返回事件,通過js程式碼來模擬瀏覽器的頁面後退操作,以此來解決無法後退的問題。但是該方案由於程式碼改動較大且頁面間的跳轉情況過於繁瑣,暫時擱置。

考慮到操作history比較繁瑣,轉而考慮是否可以通過修改樣式來實現相容:

(三)方案三:使用媒體查詢,手動設定兩種頁面樣式,通過判斷機型是否為iOS來展示不同的頁面樣式,將iOS端的底部按鈕欄位置預留出來。 但是由於首次進入頁面時並無底部欄,且該方案需要判斷的iOS機型和版本條件過多,樣式的改動也較大,暫時擱置。

進一步分析該問題發生的原因,發現出現遮擋的主要原因是,底部的工具欄是在頁面完成渲染之後才渲染的,因此才會出現覆蓋原頁面的問題,如果能讓該工具欄優先於頁面渲染,則頁面的視口高度就會是瀏覽器去掉底部工具欄之後的高度,這樣就不會出現頁面內容被遮擋的問題。想到了這一層面後我有如醍醐灌頂,終於找到可以完美解決的辦法了!

(四)最終方案:在頁面載入之前通過主動新增空的歷史記錄,觸發瀏覽器的history監聽機制,讓瀏覽器先於頁面調出底部工具欄,從而解決遮擋問題。

所以我們需要在路由守衛中增加對 window.history 的處理,程式碼如下:

router.beforeEach((to,from,next) => {
 window.history.replaceState(null,null,window.localtion.href);
 next();
})

由於專案使用的是vue,這裡只展示vue中的寫法,使用其他寫法的同學可以類比一下。

這裡之所以用replaceState 而不用 pushState ,是因為後者會在瀏覽器中多增加一條歷史資料,這會導致在瀏覽器後退操作時需要後退兩次才可以返回到之前的頁面;而使用replaceState 則是替換瀏覽歷史中的上一條記錄,用當前頁面的地址替換上一條記錄,本質上瀏覽歷史是不變的,自此關於iOS端微信的底部工具欄遮擋問題就可以完美解決了。

到此這篇關於iOS新版微信底部工具欄遮擋問題完美解決的文章就介紹到這了,更多相關iOS 微信底部工具欄遮擋內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!