移動端點選300ms的延遲出現的原因是什麼?你的解決方案是什麼?

王铁柱6發表於2024-11-29

移動端點選 300ms 延遲的主要原因是瀏覽器在使用者點選螢幕後會等待 300ms,以判斷使用者是否會進行雙擊(例如縮放頁面)。這是由於早期移動端瀏覽器為了模擬雙擊縮放功能而設計的機制。

具體來說,當使用者觸控螢幕時,瀏覽器並不能立即判斷使用者是要進行單擊還是雙擊操作。因此,它會等待大約 300ms,看看使用者是否會再次點選螢幕。如果在 300ms 內發生了第二次點選,則瀏覽器會將其解釋為雙擊操作;否則,則將其解釋為單擊操作。這導致了 300ms 的延遲。

解決方案:

  1. 禁用縮放: 最簡單直接的解決方案是在 viewport meta 標籤中設定 width=device-widthuser-scalable=no 來禁用縮放功能。這會告訴瀏覽器不需要監聽雙擊縮放,從而消除 300ms 的延遲。

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    

    注意: 禁用縮放可能會影響使用者體驗,尤其是在內容需要縮放的情況下。

  2. 使用 FastClick 庫 (已過時,但仍有專案在用): FastClick 是一個輕量級的庫,它可以消除移動端瀏覽器上的 300ms 點選延遲。它透過監聽 touchstart 和 touchend 事件來模擬點選事件,並在 touchend 事件觸發時立即觸發模擬的 click 事件,從而繞過了瀏覽器的 300ms 等待時間。 雖然曾經很流行,但現在由於瀏覽器改進和新的解決方案出現,已經不再推薦使用。

  3. 使用指標事件 (Pointer Events): 指標事件提供了一種更現代化的方法來處理所有輸入型別,包括觸控、滑鼠和手寫筆。由於指標事件的設計考慮了觸控裝置,因此它們不會有 300ms 的延遲。 然而,瀏覽器相容性需要考慮。

  4. CSS touch-action 屬性: touch-action 屬性允許開發者控制瀏覽器對觸控手勢的預設行為。 將 touch-action 設定為 none 可以阻止瀏覽器對觸控事件的預設處理,包括雙擊縮放,從而消除 300ms 延遲。

    .element {
      touch-action: none;
    }
    

    這是目前推薦的解決方案之一,因為它簡單有效且對使用者體驗的影響最小。

  5. 使用框架/庫內建的解決方案: 許多現代前端框架和庫,例如 React、Vue 和 Angular,都內建了處理移動端點選延遲的機制。 使用這些框架/庫時,通常不需要手動處理 300ms 延遲問題。

最佳實踐:

  • 優先使用 touch-action: none; 這通常是最簡單和最有效的解決方案。
  • 如果需要更精細的控制,可以使用指標事件。
  • 避免使用 FastClick,因為它已經過時,並且可能與其他庫或框架衝突。
  • 確保你的解決方案不會影響使用者體驗,例如,不要禁用縮放功能,除非你確定你的內容不需要縮放。

透過以上方法,可以有效地消除移動端 300ms 點選延遲,提升使用者體驗。 選擇哪種方法取決於你的具體專案需求和技術棧。 建議優先考慮 touch-action 和框架/庫的內建解決方案。

相關文章