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

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

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

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

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

pointer メディア クエリ

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

  • 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 フックは、プライマリ ポインターの型を決定します。 useMatchMedianonecoarse ポインタ型のクエリで fine を呼び出し、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

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

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

メディア クエリは、使用可能なポインタの精度をチェックします。 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

動作デモ

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

高度な検出: 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

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

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 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
カーソルの次のレベルCSSスタイリングカーソルの次のレベルCSSスタイリングApr 23, 2025 am 11:04 AM

CSSを備えたカスタムカーソルは素晴らしいですが、JavaScriptを使用して次のレベルに物事を引き出すことができます。 JavaScriptを使用して、カーソル状態間で移行し、カーソル内に動的テキストを配置し、複雑なアニメーションを適用し、フィルターを適用できます。

Worlds Collide:スタイルクエリを使用したキーフレーム衝突検出Worlds Collide:スタイルクエリを使用したキーフレーム衝突検出Apr 23, 2025 am 10:42 AM

2025年には、互いに互いに跳ね返る要素を伴うインタラクティブなCSSアニメーションは、CSSにPongを実装する必要はありませんが、CSSの柔軟性とパワーの増加はLee'の疑いを補強します。

UI効果にCSSバックドロップフィルターを使用しますUI効果にCSSバックドロップフィルターを使用しますApr 23, 2025 am 10:20 AM

CSSバックドロップフィルタープロパティを使用してユーザーインターフェイスをスタイルするためのヒントとコツ。バックドロップフィルターを複数の要素間でレイヤー化する方法を学び、それらを他のCSSグラフィカル効果と統合して、精巧なデザインを作成します。

微笑んでいますか?微笑んでいますか?Apr 23, 2025 am 09:57 AM

まあ、SVG'の組み込みのアニメーション機能は、計画どおりに非推奨されることはありませんでした。確かに、CSSとJavaScriptは負荷を運ぶことができる以上のものですが、以前のようにSmilが水中で死んでいないことを知っておくのは良いことです

「かわいい」は見る人の目にあります「かわいい」は見る人の目にありますApr 23, 2025 am 09:40 AM

イェーイ、テキストワラップのジャンプを見てみましょう:サファリテクノロジーのプレビューにかなり着陸してください!しかし、それがChromiumブラウザーでの仕組みとは異なることに注意してください。

CSS-Tricks XLIIIを記録しますCSS-Tricks XLIIIを記録しますApr 23, 2025 am 09:35 AM

このCSS-Tricksアップデートは、アルマナック、最近のポッドキャスト出演、新しいCSSカウンターガイド、および貴重なコンテンツを提供するいくつかの新しい著者の追加の大幅な進歩を強調しています。

Tailwind'の@Apply機能は、響きよりも優れていますTailwind'の@Apply機能は、響きよりも優れていますApr 23, 2025 am 09:23 AM

ほとんどの場合、人々はTailwind'の@Apply機能を紹介します。このように展示されたとき、@Applyはまったく有望な音をしません。だからobvio

私はリリースがないように感じます:正気な展開への旅私はリリースがないように感じます:正気な展開への旅Apr 23, 2025 am 09:19 AM

馬鹿のように展開することは、展開に使用するツールと複雑さの報酬と複雑さの減少との間の不一致になります。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境