移動端300毫秒延遲問題
移動端300毫秒延遲的由來:
雙擊縮放,顧名思義,即用手指在螢幕上快速點選兩次,iOS 自帶的 Safari 瀏覽器會將網頁縮放至原始比例。 那麼這和 300 毫秒延遲有什麼聯絡呢? 假定這麼一個場景。使用者在 iOS Safari 裡邊點選了一個連結。由於使用者可以進行雙擊縮放或者雙擊滾動的操作,當用戶一次點選螢幕之後,瀏覽器並不能立刻判斷使用者是確實要開啟這個連結,還是想要進行雙擊操作。
解決方案:
1、設定meta標籤禁止縮放
@1 <meta name="viewport" content="user-scalable=no"/>
<meta name="viewport" content="initial-scale=1, maximum-scale=1">/
表明這個頁面是不可縮放的,那雙擊縮放的功能就沒有意義了,此時瀏覽器可以禁用預設的雙擊縮放行為並且去掉300ms的點選延遲。
這個方案有一個缺點,就是必須通過完全禁用縮放來達到去掉點選延遲的目的,然而完全禁用縮放並不是我們的初衷,我們只是想禁掉預設的雙擊縮放行為,這樣就不用等待300ms來判斷當前操作是否是雙擊。但是通常情況下,我們還是希望頁面能通過雙指縮放來進行縮放操作,比如放大一張圖片,放大一段很小的文字。
@2 <meta name="viewport" content="width=device-width"/>
一開始,為了讓桌面站點能在移動端瀏覽器正常顯示,移動端瀏覽器預設的視口寬度並不等於裝置瀏覽器視窗寬度,而是要比裝置瀏覽器視窗寬度大,通常是980px。我們可以通過以下標籤來設定視口寬度為裝置寬度。 因為雙擊縮放主要是用來改善桌面站點在移動端瀏覽體驗的,而隨著響應式設計的普及,很多站點都已經對移動端坐過適配和優化了,這個時候就不需要雙擊縮放了,如果能夠識別出一個網站是響應式的網站,那麼移動端瀏覽器就可以自動禁掉預設的雙擊縮放行為並且去掉300ms的點選延遲。如果設定了上述meta標籤,那瀏覽器就可以認為該網站已經對移動端做過了適配和優化,就無需雙擊縮放操作了。
這個方案相比方案一的好處在於,它沒有完全禁用縮放,而只是禁用了瀏覽器預設的雙擊縮放行為,但使用者仍然可以通過雙指縮放操作來縮放頁面。
2、FastClick
引入 <script src="https://cdn.bootcss.com/fastclick/1.0.6/fastclick.min.js "></script>
$(function() {
FastClick.attach(document.body);
})或者
if ('addEventListener' in document) {
document.addEventListener('DOMContentLoaded', function() {
FastClick.attach(document.body);
}, false);
}
3、可以使用zepto.js的tap事件替代click,Zepto 缺少合適的高度計算函式,在專案開發中發現第三方外掛和 Zepto 有衝突,維護多套程式碼很不容易
4、 可以使用touch.js的tap事件替代click(此處的touch.js並非zepto中的touch.js)