ホームページ >ウェブフロントエンド >CSSチュートリアル >ブラウザのメディアクエリを使用してタッチデバイスを検出する方法

ブラウザのメディアクエリを使用してタッチデバイスを検出する方法

Barbara Streisand
Barbara Streisandオリジナル
2025-01-20 18:10:12946ブラウズ

この記事では、画面サイズのチェックやユーザー エージェント スニッフィングなどの信頼性の低い手法を超えて、Web 開発におけるユーザー入力デバイス (タッチ、マウス、スタイラス) を検出するための信頼できる方法を探ります。 正確なデバイス機能の検出のために、CSS メディア クエリ、特に pointerhover、および any-pointer を活用することに重点が置かれています。 これらのクエリは入力モダリティに関する正確な情報を提供し、よりアクセスしやすく応答性の高い Web アプリケーションにつながります。

単純なアプローチは便利に見えるかもしれませんが、多くの場合不正確な結果が得られます。たとえば、ユーザーがマウスをスマートフォンに接続すると、サイズに基づく仮定が無効になります。 CSS メディア クエリは、実際のデバイス特性に基づいた正確なデータを提供する優れたソリューションを提供します。

CSS メディア クエリ: 信頼できるアプローチ

この記事では、pointerhover メディア クエリについて詳しく説明し、React フックとしての実装を示します。

pointer メディア クエリ

pointer メディア クエリは、ポインティング デバイスの存在と精度を決定します。 3 つの値のいずれかを返します:

  • none: 使用可能なポインティング デバイスがありません (音声制御デバイスなど)。
  • coarse: ポインティング デバイスは存在しますが、精度が不足しています (タッチスクリーン上の指など)。
  • fine: 高精度のポインティング デバイス (マウスなど) が利用可能です。

window.matchMedia メソッドは、コード内でメディア クエリ結果に簡単にアクセスできるようにします。

useMatchMedia フック

コードの冗長性を避けるために、メディア クエリの結果を取得して追跡するためのカスタム useMatchMedia フックが作成されます。 このフックは window.matchMedia を利用し、クエリの一致ステータスの変化を検出するイベント リスナーを追加します。 クリーンアップ関数により、コンポーネントがアンマウントされるかクエリが変更されたときにリスナーが確実に削除されます。

<code class="language-typescript">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;
};</code>

プライマリ ポインター機能の検出

usePrimaryPointerQuery フックは、プライマリ ポインターの型を決定します。 useMatchMedianonecoarse ポインタ型のクエリで fine を呼び出し、Pointers 列挙型から適切な値を返します。

<code class="language-typescript">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;
  }
};</code>

How to detect touch devices using browser media queries

追加のポインター機能の検出

プライマリ ポインタは 1 つだけ存在しますが、デバイスはセカンダリ ポインタを持つことができます (Bluetooth キーボード、ジョイスティックなど)。

メディア クエリは、使用可能なポインタの精度をチェックします。 any-pointer フックはポインター型を受け入れ、動的に生成されたクエリ文字列で useAnyPointerQuery を使用します。useMatchMedia

<code class="language-typescript">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;
};</code>

How to detect touch devices using browser media queries

動作デモ

フックを紹介する完全なデモが利用可能です:

高度な検出: hover および any-hover

hover および any-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

たとえば、プライマリ入力としてスタイラスを検出する場合:

<code class="language-typescript">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;
  }
};</code>

このアプローチにより、ユーザー入力デバイスのより堅牢かつ正確な検出が保証され、ユーザー エクスペリエンスとアクセシビリティが向上します。

以上がブラウザのメディアクエリを使用してタッチデバイスを検出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。