携帯デバイスを判別する

画面サイズで判別

CSS等で横幅サイズを指定、または横幅より縦幅が狭いものをスマホ等のデバイスを判定する。
最近は解像度もPCディスプレイの解像度に近づいている&横画面にされると判別できなくなるのであまり当てにできない。

入力系統で判別する

  • タッチ操作があるか
  • マウスがあるか
  • ホバー(カーソルを乗せる)があるか
  • キーボードがあるか

を組み合わせてUIを変えるのが主流です。

① タッチ対応か判定

最も簡単なのはこれです。

判定例

デバイス結果
iPhonetrue
Androidtrue
iPadtrue
Surface タブレットtrue
普通のPCfalse

ただし最近のノートPCはタッチ対応もあります。

そのため

if (isTouchDevice) {
// スマホUI
}

だけだと少し危険です。

② ホバー可能か判定

CSSでもJSでも判定できます。

デバイス結果
スマホfalse
iPadfalse
マウス付きPCtrue

ゲームの場合はこちらの方が便利です。

③ ポインター精度判定

結果

デバイス結果
マウスtrue
指タッチfalse

例えば

const isMobileLike =
window.matchMedia('(pointer: coarse)').matches;

これは

  • スマホ
  • タブレット

をほぼ検出できます。

④ Canvasゲームなら

⑤ iPadとPCを区別したい場合

昔はUserAgentを見ていましたが、

最近のiPadはSafariがPCモードを名乗るため面倒です。

例えば

const isIPad =
navigator.maxTouchPoints > 1 &&
/Macintosh/.test(navigator.userAgent);

みたいな裏技がありますが、

将来的に壊れる可能性があります。

Canvasゲームならどうする?

実は

「iPadかPCか」

を判定する必要はほぼありません。

代わりに

const useTouchUI =
navigator.maxTouchPoints > 0;

として、

  • 仮想十字キー表示
  • 仮想ボタン表示
  • ドラッグ操作

を有効化。

const useMouseUI =
window.matchMedia('(pointer: fine)').matches;

なら

  • マウス操作
  • ホイール操作
  • ホバー表示

を有効化。

こうすると

  • iPhone
  • Android
  • iPad
  • Surface
  • Mac
  • Windows
  • Linux

全部に対応しやすくなります。

キーボード検出

「キーボードが接続されているか」を確実に検出するAPIはブラウザにはありません。

これはプライバシーやセキュリティ上の理由です。

1. キー入力があったら判定する

一番現実的なのはこれです。

let keyboardUsed = false;

window.addEventListener('keydown', () => {
keyboardUsed = true;
});

ユーザーが一度でもキーを押せば

console.log(keyboardUsed);

が true になります。

2. マウス・タッチ・キーボードを自動判定

ゲームではこれが便利です。

例えば

if (lastInput === 'keyboard') {
// キーボード操作UI
}

のようにできます。

最近のゲーム機のUI切り替えと同じ考え方ですね。

3. Gamepadも検出できる

ブラウザはゲームパッドも対応しています。

window.addEventListener('gamepadconnected', (event) => {
console.log('接続:', event.gamepad.id);
});

例えば

  • Xboxコントローラー
  • PS5コントローラー
  • Switch Proコントローラー

などが検出できます。

4. 実際のCanvasゲームなら

操作したものmode
画面タッチtouch
マウス移動mouse
キーボード入力keyboard
コントローラーgamepad

コメント

タイトルとURLをコピーしました