現在使用中のデバイスがタッチデバイスかどうかを判定するコードとして、ざっくり下記のような手法がWEB上ではよく紹介されています。
'ontouchstart' in window
でチェックnavigator.maxTouchPoints > 0
でチェックnavigator.msMaxTouchPoints > 0
でもチェック( 旧Edge・IE用? )matchMedia('(pointer:coarse)').matches
でチェック'orientation' in window
でチェック
これらの組み合わせ方が色々なパターンで紹介されていて、結局どれが必要なの?というのがあやふやだったのでChatGPTさんに聞いてみました。
ChatGPTさんとのやりとり
※ ざっくり概要だけ再現します。
JSでタッチデバイスかどうかを判定するコードを教えて〜。(まずは普通にきいてみた)
自分
以下のコードでチェックできます。
GPTif ('ontouchstart' in window || navigator.maxTouchPoints) { // タッチデバイスの場合の処理 }
自分
ontouchstart
でのチェックと、maxTouchPoints
でのチェックは両方必要なの?
はい。一部のデバイスやブラウザでは、
maxTouchPoints
が未定義または null である場合があります。そのため、ontouchstart
も併用することで、より信頼性の高いチェックができます。したがって、両方をチェックすることで、より幅広い範囲のタッチデバイスに対応することができます。
GPT
WEB上には
自分matchMedia
を使ったチェック方法も紹介されていますが、これは不要ですか?
たしかに、
matchMedia
を使用してメディアクエリをチェックすることで、タッチデバイスかどうかを判定する方法もあります。以下はそのコード例です。
if (matchMedia("(pointer: coarse)").matches) { // タッチデバイスの場合の処理 }
この方法は、CSSプロパティ
pointer
を使用して、デバイスのポインティングデバイスの種類を判定します。pointer: coarse
は、指やタッチペンなどの粗いポインティングデバイスを持つデバイスにマッチします。ただし、この方法にはいくつかの欠点があります。一部のブラウザでは
matchMedia
がサポートされていない場合があるため、ブラウザの互換性に問題が生じる可能性があります。したがって、
GPTontouchstart
とmaxTouchPoints
を併用した方法が、最も広くサポートされ、最も信頼性が高いと言えます。ただし、ブラウザのサポート状況や要件によっては、matchMedia
を使用することも選択肢の一つとして考慮できます。
なるほど…!
自分
追加で質問です。maxTouchPoints
だけでなくmsMaxTouchPoints
を併用する方法も見かけたのですが、これはモダンブラウザでは不要ですか?
msMaxTouchPoints
プロパティは、Microsoft Edge および Internet Explorer 11 でのみ使用されます。したがって、これらのブラウザ以外では、このチェックは不要です。現代的なブラウザでは、maxTouchPoints
プロパティのみを使用すれば、タッチデバイスを検出することができます。したがって、モダンブラウザでこのチェックを行う必要はありません。ただし、古いバージョンの Microsoft Edge がインストールされた Windows デバイスで動作する Web アプリケーションをサポートする場合は、
msMaxTouchPoints
プロパティを使用することが必要になるかもしれません。また、Microsoft Edge の最新バージョンでは
GPTnavigator.maxTouchPoints
プロパティを使用することが推奨されており、msMaxTouchPoints
プロパティは非推奨になっています。
では、モダンブラウザでは
自分msMaxTouchPoints
は不要ですよね?
はい。現代的な Web アプリケーションで
GPTmsMaxTouchPoints
プロパティを使用する必要はありません。ただし、過去のバージョンの Microsoft Edge をサポートする必要がある場合は、msMaxTouchPoints
プロパティを使用する必要があります。
Edgeで
自分maxTouchPoints
がサポートされたのはいつからですか?
Microsoft Edge 17 以降でサポートされています。これは、2018年4月にリリースされたバージョンです。したがって、2018年4月以降にリリースされた Microsoft Edge バージョンでは、
GPTmaxTouchPoints
プロパティを使用することができます。
ありがとう。さらに追加で質問です。
自分'orientation' in window
でタッチデバイスかどうか判定する方法もあるようなのですが、これは現在でも有効ですか?
"orientation"
を使用してタッチデバイスかどうかを判定する方法は、かつては広く使われていましたが、現在では推奨されていません。このプロパティは、デバイスの方向(縦向きまたは横向き)を返すプロパティであり、タッチデバイスかどうかを判定するために使用することが意図されていないためです。また、”orientation”プロパティは、一部のブラウザではサポートされていない場合があります。さらに、最新のモバイルデバイスでは、”orientation”プロパティが廃止され、代わりに
window.screen.orientation.type
を使用することが推奨されています。したがって、”orientation”プロパティを使用してタッチデバイスかどうかを判定することは、推奨されていません。代わりに、
GPT'ontouchstart' in window
やnavigator.maxTouchPoints
、matchMedia("(pointer: coarse)").matches
を使用することをお勧めします。
結論
これらのやりとりをふまえ、msMaxTouchPoints
は不要と判断し(orientation
での判定はもともと採用していない)、私は下記のコードを採用しました!
const IS_TOUCH_DEVICE =
'ontouchstart' in window ||
navigator.maxTouchPoints > 0 ||
window.matchMedia('(pointer:coarse)').matches;