移動端點選 300ms 延遲的主要原因是瀏覽器在使用者點選螢幕後會等待 300ms,以判斷使用者是否會進行雙擊(例如縮放頁面)。這是由於早期移動端瀏覽器為了模擬雙擊縮放功能而設計的機制。
具體來說,當使用者觸控螢幕時,瀏覽器並不能立即判斷使用者是要進行單擊還是雙擊操作。因此,它會等待大約 300ms,看看使用者是否會再次點選螢幕。如果在 300ms 內發生了第二次點選,則瀏覽器會將其解釋為雙擊操作;否則,則將其解釋為單擊操作。這導致了 300ms 的延遲。
解決方案:
-
禁用縮放: 最簡單直接的解決方案是在 viewport meta 標籤中設定
width=device-width
和user-scalable=no
來禁用縮放功能。這會告訴瀏覽器不需要監聽雙擊縮放,從而消除 300ms 的延遲。<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
注意: 禁用縮放可能會影響使用者體驗,尤其是在內容需要縮放的情況下。
-
使用 FastClick 庫 (已過時,但仍有專案在用): FastClick 是一個輕量級的庫,它可以消除移動端瀏覽器上的 300ms 點選延遲。它透過監聽 touchstart 和 touchend 事件來模擬點選事件,並在 touchend 事件觸發時立即觸發模擬的 click 事件,從而繞過了瀏覽器的 300ms 等待時間。 雖然曾經很流行,但現在由於瀏覽器改進和新的解決方案出現,已經不再推薦使用。
-
使用指標事件 (Pointer Events): 指標事件提供了一種更現代化的方法來處理所有輸入型別,包括觸控、滑鼠和手寫筆。由於指標事件的設計考慮了觸控裝置,因此它們不會有 300ms 的延遲。 然而,瀏覽器相容性需要考慮。
-
CSS touch-action 屬性:
touch-action
屬性允許開發者控制瀏覽器對觸控手勢的預設行為。 將touch-action
設定為none
可以阻止瀏覽器對觸控事件的預設處理,包括雙擊縮放,從而消除 300ms 延遲。.element { touch-action: none; }
這是目前推薦的解決方案之一,因為它簡單有效且對使用者體驗的影響最小。
-
使用框架/庫內建的解決方案: 許多現代前端框架和庫,例如 React、Vue 和 Angular,都內建了處理移動端點選延遲的機制。 使用這些框架/庫時,通常不需要手動處理 300ms 延遲問題。
最佳實踐:
- 優先使用
touch-action: none;
這通常是最簡單和最有效的解決方案。 - 如果需要更精細的控制,可以使用指標事件。
- 避免使用 FastClick,因為它已經過時,並且可能與其他庫或框架衝突。
- 確保你的解決方案不會影響使用者體驗,例如,不要禁用縮放功能,除非你確定你的內容不需要縮放。
透過以上方法,可以有效地消除移動端 300ms 點選延遲,提升使用者體驗。 選擇哪種方法取決於你的具體專案需求和技術棧。 建議優先考慮 touch-action
和框架/庫的內建解決方案。