首頁 > web前端 > css教學 > 如何使用瀏覽器媒體查詢偵測觸控設備

如何使用瀏覽器媒體查詢偵測觸控設備

Barbara Streisand
發布: 2025-01-20 18:10:12
原創
1072 人瀏覽過

本文探討了在 Web 開發中偵測使用者輸入裝置(觸控、滑鼠、觸控筆)的可靠方法,超越了螢幕尺寸檢查或使用者代理嗅探等不可靠的技術。 重點是利用 CSS 媒體查詢,特別是 pointerhoverany-pointer 來進行準確的設備功能檢測。 這些查詢提供有關輸入模式的精確信息,從而實現更易於訪問和響應更快的 Web 應用程式。

雖然更簡單的方法可能看起來很方便,但它們通常會產生不準確的結果。例如,使用者將滑鼠連接到智慧型手機會使基於尺寸的假設失效。 CSS 媒體查詢提供了卓越的解決方案,根據實際設備特性提供精確的資料。

CSS 媒體查詢:可靠的方法

本文深入研究了 pointerhover 媒體查詢,示範了它們作為 React hooks 的實作。

pointer媒體查詢

pointer 媒體查詢決定定點設備的存在與精確度。它會傳回三個值之一:

  • none:沒有可用的指點設備(例如語音控制設備)。
  • coarse:存在指點設備,但缺乏精確度(例如,手指放在觸控螢幕上)。
  • fine:可以使用高精度的指點設備(例如滑鼠)。

window.matchMedia 方法提供了在程式碼中方便地存取媒體查詢結果。

useMatchMedia鉤子

為了避免程式碼冗餘,建立了一個自訂的 useMatchMedia 掛鉤來檢索和追蹤媒體查詢結果。 此掛鉤利用 window.matchMedia 並新增事件偵聽器來偵測查詢匹配狀態的變化。 清理函數可確保在元件卸載或查詢變更時刪除偵聽器。

export const useMatchMedia = (query: string) => {
  const [matches, setMatches] = useState(false);

  useEffect(() => {
    const media = window.matchMedia(query);
    if (media.matches !== matches) {
      setMatches(media.matches);
    }
    const listener = () => setMatches(media.matches);
    media.addEventListener('change', listener);
    return () => media.removeEventListener('change', listener);
  }, [matches, query]);

  return matches;
};
登入後複製
登入後複製

偵測主要指標功能

usePrimaryPointerQuery 鉤子決定主指標類型。它呼叫 useMatchMedia 並查詢 nonecoarsefine 指標類型,從 Pointers 枚舉傳回適當的值。

import { useMatchMedia } from './useMatchMedia.ts';
import { Pointers } from './types.ts';

export const usePrimaryPointerQuery = () => {
  const isNone = useMatchMedia('(pointer: none)');
  const isCoarse = useMatchMedia('(pointer: coarse)');
  const isFine = useMatchMedia('(pointer: fine)');
  if (isNone) {
    return Pointers.none;
  } else if (isCoarse) {
    return Pointers.coarse;
  } else if (isFine) {
    return Pointers.fine;
  }
};
登入後複製
登入後複製

How to detect touch devices using browser media queries

偵測額外的指標功能

雖然只有一個主指針存在,但設備可以有輔助指針(例如藍牙鍵盤、操縱桿)。 any-pointer 媒體查詢檢查任何可用指標的精確度。 useAnyPointerQuery 掛鉤接受指標類型,並將 useMatchMedia 與動態產生的查詢字串一起使用。

export const useMatchMedia = (query: string) => {
  const [matches, setMatches] = useState(false);

  useEffect(() => {
    const media = window.matchMedia(query);
    if (media.matches !== matches) {
      setMatches(media.matches);
    }
    const listener = () => setMatches(media.matches);
    media.addEventListener('change', listener);
    return () => media.removeEventListener('change', listener);
  }, [matches, query]);

  return matches;
};
登入後複製
登入後複製

How to detect touch devices using browser media queries

工作展示

展示鉤子的完整示範現已推出:

進階偵測:hoverany-hover

hoverany-hover 媒體查詢透過檢查懸停功能進一步完善偵測。 將這些與 pointer 查詢結合可以實現更精確的設備識別。

Pointer value Hover value Device
coarse none Modern touch screens
fine none Stylus-based devices
coarse hover Joystick or TV remote
fine hover Mouse

例如,偵測手寫筆作為主要輸入:

import { useMatchMedia } from './useMatchMedia.ts';
import { Pointers } from './types.ts';

export const usePrimaryPointerQuery = () => {
  const isNone = useMatchMedia('(pointer: none)');
  const isCoarse = useMatchMedia('(pointer: coarse)');
  const isFine = useMatchMedia('(pointer: fine)');
  if (isNone) {
    return Pointers.none;
  } else if (isCoarse) {
    return Pointers.coarse;
  } else if (isFine) {
    return Pointers.fine;
  }
};
登入後複製
登入後複製

這種方法可確保更強大、更準確地偵測使用者輸入設備,從而帶來更好的使用者體驗和可訪問性。

以上是如何使用瀏覽器媒體查詢偵測觸控設備的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板