jQueryでデバイスを判定する方法完全ガイド|スマホ・タブレット・タッチ対応まで

スマホとPCで処理を切り替えたい、タッチデバイスのみスワイプを有効にしたい――そんな要件に対応するには「デバイス判定」の実装が必要です。

jQueryでのデバイス判定には主に3つの方法があり、それぞれ特性が異なります。この記事では各方法の使い方と使い分けを、実務で役立つパターンとともに解説します。

この記事でわかること

  • matchMedia(推奨)・userAgent・window.width の3方法と使い分け
  • タッチデバイス・iOS/Android の個別判定
  • iPadOS 13以降でuserAgentが使えない問題と対策
  • ウィンドウリサイズに対応したリアルタイム検知
  • デバイス別UIの実践パターン
スポンサーリンク

方法1: matchMedia(推奨)

window.matchMedia() はCSSのメディアクエリをJavaScriptで評価できるAPIです。画面幅に基づく判定として最も信頼性が高く、現在の標準的な方法です。

$(function () {
  const mq = window.matchMedia("(max-width: 768px)");

  function handleDevice(e) {
    if (e.matches) {
      // スマホ・タブレット幅(768px以下)
      console.log("モバイル表示");
      $(".menu").hide();
      $(".hamburger").show();
    } else {
      // PC幅(769px以上)
      console.log("PC表示");
      $(".menu").show();
      $(".hamburger").hide();
    }
  }

  handleDevice(mq);                           // 初回判定
  mq.addEventListener("change", handleDevice); // リサイズ時にも反応
});

ブレイクポイントの目安:

デバイス 一般的なブレイクポイント
スマートフォン ~480px(縦)/ ~767px(横含む)
タブレット 768px ~ 1024px
PC・デスクトップ 1025px ~

matchMedia が推奨な理由: CSSのメディアクエリと同じ基準で判定できるため、デザインの切り替えタイミングと一致します。userAgentと違い偽装されず、スマホ横向きの場合も画面幅で正確に判定できます。

方法2: userAgent(機種・OS判定に使う)

ブラウザが送信するUser Agent文字列でデバイスのOS・機種を判定します。「iOSのみ特定CSSを適用」などの場面で使います。

$(function () {
  const ua = navigator.userAgent;

  const isIOS     = /iPhone|iPad|iPod/i.test(ua);
  const isAndroid = /Android/i.test(ua);
  const isMobile  = isIOS || isAndroid;
  const isTablet  = /iPad/i.test(ua) || (isAndroid && !/Mobile/i.test(ua));
  const isPC      = !isMobile;

  if (isIOS) {
    $("body").addClass("device-ios");
    console.log("iOS端末");
  } else if (isAndroid) {
    $("body").addClass("device-android");
    console.log("Android端末");
  } else {
    $("body").addClass("device-pc");
    console.log("PC");
  }
});

iPadOS 13以降の注意点: 2019年のiPadOS 13からiPadのUser AgentがMacのSafariと同じになりました。そのため /iPad/i.test(ua) では判定できません。iPadを正確に判定するには、後述のタッチ判定と組み合わせる必要があります。

// iPadOS 13以降の対応: UAがMacのSafariと同じになるため
// navigator.platform + maxTouchPoints で判定する
const isIpadOS = (
  /Mac/i.test(navigator.platform) &&
  navigator.maxTouchPoints > 1
);

if (/iPad/i.test(ua) || isIpadOS) {
  console.log("iPad(iPadOS 13以降を含む)");
}

方法3: window.width(レスポンシブ対応時の補助的な判定)

ウィンドウの幅を数値で取得し、閾値で判定します。matchMedia で十分な場面が多いですが、幅の数値が必要なロジック(例:スライダーのコマ数)に使います。

$(function () {
  function getDeviceType() {
    const w = $(window).width();
    if (w <= 480)  return "smartphone";
    if (w <= 768)  return "tablet";
    return "pc";
  }

  function onResize() {
    const device = getDeviceType();
    $("body").removeClass("device-smartphone device-tablet device-pc")
             .addClass("device-" + device);
    console.log("現在のデバイス:", device);
  }

  onResize();  // 初回
  $(window).on("resize", onResize);
});

注意: resize イベントはスクロールのたびに大量に発火するため、パフォーマンスに影響します。処理が重い場合は debounce を使って間引いてください。

// debounce で resize を間引く(300ms後に実行)
function debounce(fn, delay) {
  let timer;
  return function () {
    clearTimeout(timer);
    timer = setTimeout(() => fn.apply(this, arguments), delay);
  };
}

$(window).on("resize", debounce(function () {
  onResize();
}, 300));

タッチデバイスを判定する

スマホ・タブレットなどタッチ操作が可能なデバイスを判定します。マウスとタッチでUIを切り替えるのに使います。

// タッチデバイス判定(複数の方法を組み合わせて精度を上げる)
function isTouchDevice() {
  return (
    "ontouchstart" in window ||
    navigator.maxTouchPoints > 0 ||
    window.matchMedia("(pointer: coarse)").matches
  );
}

$(function () {
  if (isTouchDevice()) {
    console.log("タッチデバイス");
    // スワイプイベントを有効化、ホバーエフェクトを無効化など
    $(".hover-effect").addClass("no-hover");
  } else {
    console.log("マウス操作デバイス");
  }
});

pointer: coarse について: CSSメディアクエリの (pointer: coarse) は「精度の低いポインター(指タッチ)」を意味します。(pointer: fine) はマウス・スタイラスペンです。現在最も信頼性の高いタッチ判定方法の一つです。

モダンAPI: navigator.userAgentData

Chrome 90以降(Edgeも対応)では navigator.userAgentData という新しいAPIが使えます。mobile プロパティで簡単にモバイル判定できます。

// userAgentData が使えるブラウザ(Chrome・Edge)
if (navigator.userAgentData) {
  const isMobile = navigator.userAgentData.mobile;
  const platform = navigator.userAgentData.platform;  // "Android", "Windows", "macOS"など

  console.log("モバイル:", isMobile);
  console.log("プラットフォーム:", platform);

  if (isMobile) {
    $("body").addClass("is-mobile");
  }

// Safari・Firefox ではフォールバック
} else {
  const ua = navigator.userAgent;
  if (/iPhone|iPad|iPod|Android/i.test(ua)) {
    $("body").addClass("is-mobile");
  }
}

より詳細な情報(ブランド名・バージョンなど)は getHighEntropyValues() で取得できますが、ユーザーの許可が必要になります。

// 詳細なUA情報を取得(Chrome・Edgeのみ対応)
if (navigator.userAgentData) {
  navigator.userAgentData.getHighEntropyValues([
    "platform", "platformVersion", "architecture", "model", "uaFullVersion"
  ]).then(function (ua) {
    console.log("OS:", ua.platform, ua.platformVersion);
    console.log("モデル:", ua.model);        // Androidデバイスのモデル名
    console.log("アーキテクチャ:", ua.architecture);
  });
}
API Safari対応 Firefox対応 Chrome/Edge対応
navigator.userAgent
navigator.userAgentData ✅(Chrome 90+)

3つの方法 比較一覧

方法 判定基準 精度 リサイズ対応 主な用途
matchMedia 画面幅(CSS基準) ◎ 高い ○ addEventListener レイアウト・表示切替
userAgent OS・ブラウザ文字列 △ 偽装・変更リスクあり × iOS/Android固有の処理
window.width 画面幅(px数値) ○ 中 ○ resize イベント 幅の数値が必要な処理

実践パターン

スマホのみスワイプイベントを有効化

$(function () {
  const isMobile = window.matchMedia("(max-width: 768px)").matches;

  if (isMobile) {
    let startX = 0;
    $("#slider").on("touchstart", function (e) {
      startX = e.originalEvent.changedTouches[0].clientX;
    });
    $("#slider").on("touchend", function (e) {
      const endX = e.originalEvent.changedTouches[0].clientX;
      if (startX - endX > 50)  { nextSlide(); }   // 左スワイプ
      if (endX - startX > 50)  { prevSlide(); }   // 右スワイプ
    });
  }
});

デバイスに応じたリンクを出し分ける

$(function () {
  const ua = navigator.userAgent;
  const isIOS     = /iPhone|iPad|iPod/i.test(ua);
  const isAndroid = /Android/i.test(ua);

  // App Store / Google Play リンクをデバイスに応じて切り替え
  if (isIOS) {
    $("#app-link").attr("href", "https://apps.apple.com/app/id000000");

  } else if (isAndroid) {
    $("#app-link").attr("href", "https://play.google.com/store/apps/details?id=com.example");
  } else {
    // PCでは非表示
    $("#app-download-section").hide();
  }
});

よくある質問(FAQ)

Q. userAgentでの判定はなぜ信頼性が低いと言われるのですか?
A. ユーザーやブラウザ拡張機能がUser Agent文字列を偽装できるためです。また前述のiPadOS 13問題のようにOSバージョンアップで内容が変わることもあります。レイアウト切り替えには matchMedia、OS固有の処理にのみ userAgent を使うのが現在のベストプラクティスです。
Q. navigator.userAgentDataという新しいAPIがあると聞きましたが?
A. はい。userAgentDataはUser-Agent Client Hints APIの一部で、より構造化されたデバイス情報を取得できます。ただし2024年時点ではSafariが非対応のため、クロスブラウザ対応が必要なプロジェクトでは従来のuserAgentとの併用が必要です。
Q. タブレットとスマホを正確に区別できますか?
A. 画面幅だけでは難しい場合があります(大画面スマホと小型タブレットが重なる)。userAgentと画面幅を組み合わせる方法や、pointer: coarse + 画面幅の組み合わせが比較的精度が高いです。ただし「タブレットかスマホか」より「タッチかマウスか」を判定基準にする方が実用的な場面が多いです。
Q. Androidのタブレットを判定するにはどうしますか?
A. Androidのタブレットは userAgent の “Android” に “Mobile” が含まれないことで判定できます。例: const isAndroidTablet = /Android/i.test(ua) && !/Mobile/i.test(ua);
Q. jQueryなしで同じことはできますか?
A. はい。window.matchMedia()・navigator.userAgent・window.innerWidth はすべてVanilla JSで使えます。document.querySelectorAll() などDOM操作も jQueryなしで書けるため、モダンなプロジェクトでは jQuery不使用も選択肢です。

あわせて読みたい

まとめ

jQueryデバイス判定のポイント

  • レイアウト切り替えには matchMedia() が最も信頼性が高く推奨
  • iOS/Android固有の処理には userAgent を使うが、iPadOS 13以降の問題に注意
  • タッチ判定は navigator.maxTouchPointspointer: coarse の組み合わせが精度が高い
  • resize イベントには debounce を適用してパフォーマンスを守る
  • 「スマホかPCか」よりも「タッチかマウスか」を判定する方が実用的な場面が多い

デバイス判定は単一の方法に頼らず、目的に応じて matchMedia・userAgent・タッチ判定を組み合わせるのがベストプラクティスです。