【jQuery】スマホのみ処理を実行する方法完全ガイド|userAgent・matchMedia・window.width比較

スマートフォンだけに特定の処理を実行させたい場面は多くあります。たとえば「スマホ時のみハンバーガーメニューを有効化する」「タブレット以下ではスライドショーを無効化する」など、レスポンシブ対応の実装で必ず直面する課題です。

jQueryでスマホ判定を行う主な方法は次の4つです。

  1. window.matchMedia()(推奨・最もモダン)
  2. $(window).width()(ウィンドウ幅で判定)
  3. navigator.userAgent(ユーザーエージェント文字列)
  4. CSS連動(display:noneチェック)
この記事ではそれぞれの特徴・コード例・注意点を解説し、最後に比較表でまとめます。目的に合わせた方法を選んでください。
スポンサーリンク

方法1: window.matchMedia()【推奨】

window.matchMedia() はCSSのメディアクエリをJavaScriptから直接使える最もモダンな方法です。CSSで @media (max-width: 768px) と書くのと同じ条件で判定できるため、デザインとロジックの一貫性が保てます。

基本的な使い方

// スマホ幅(768px以下)かどうかを判定
if (window.matchMedia("(max-width: 768px)").matches) {
  console.log("スマホ表示です");
  // スマホ専用の処理
} else {
  console.log("タブレット・PC表示です");
}

画面サイズ変更(リサイズ)にも対応する

ウィンドウサイズが変わった際にも再判定したい場合は addEventListener を使います。

var mq = window.matchMedia("(max-width: 768px)");

function handleSmartphone(e) {
  if (e.matches) {
    // スマホ幅になったときの処理
    console.log("スマホ幅に切り替わりました");
  } else {
    // PC幅に戻ったときの処理
    console.log("PC幅に切り替わりました");
  }
}

// 初回判定
handleSmartphone(mq);

// リサイズ時も判定
mq.addEventListener("change", handleSmartphone);
window.matchMedia() が推奨な理由:CSSとブレークポイントを共有できる・addEventListener で効率よくリサイズを監視できる・モダンブラウザ(Chrome/Firefox/Safari/Edge)でフルサポートされている

方法2: ウィンドウ幅で判定($(window).width())

jQueryの $(window).width() でウィンドウの横幅を取得し、768px以下をスマホとして判定する方法です。古くからよく使われていますが、現在は window.matchMedia() の利用を推奨します。

基本コード

$(function() {
  var winWidth = $(window).width();

  if (winWidth <= 768) {
    console.log("スマホ表示");
    // スマホ専用処理
  } else {
    console.log("PC/タブレット表示");
  }
});

リサイズイベントとの組み合わせ

function checkWidth() {
  var w = $(window).width();
  if (w <= 768) {
    $(".sp-only").show();
    $(".pc-only").hide();
  } else {
    $(".sp-only").hide();
    $(".pc-only").show();
  }
}

// ページ読み込み時
$(function() { checkWidth(); });

// ウィンドウリサイズ時
$(window).on("resize", function() {
  checkWidth();
});
注意:$(window).width() はスクロールバーの幅を含まない場合があります。また、resize イベントは頻繁に発火するためパフォーマンスに影響することがあります。デバウンス処理を加えるか、window.matchMedia() の使用を検討してください。

方法3: ユーザーエージェントで判定(navigator.userAgent)

navigator.userAgent はブラウザがサーバーに送る文字列で、デバイスの種類(iPhone / Android など)が含まれています。この文字列を解析してスマホかどうかを判定する方法です。

基本コード

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

  if (/iPhone|Android.+Mobile/.test(ua)) {
    console.log("スマートフォンです");
    // スマホ専用処理
  } else if (/iPad|Android/.test(ua)) {
    console.log("タブレットです");
  } else {
    console.log("PCです");
  }
});

よく使われるUAパターン

デバイス UA文字列の例 正規表現例
iPhone Mozilla/5.0 (iPhone; CPU iPhone OS …) /iPhone/
Android スマホ Mozilla/5.0 (Linux; Android …) Mobile /Android.+Mobile/
iPad Mozilla/5.0 (iPad; CPU OS …) /iPad/
Android タブレット Mozilla/5.0 (Linux; Android …) Safari /Android(?!.+Mobile)/
userAgentの注意点:
① UAは任意の文字列に偽装できるため、セキュリティ用途には使えません。
② 新しいデバイスや独自ブラウザではUAが想定外の形式になる場合があります。
③ iPad OS 13以降、iPadのUAがMacと同じになったため正確な判定が困難です。
表示幅ベースのコントロールには window.matchMedia() の方が適切です。

方法4: CSSと連動させる方法(display:noneチェック)

CSSのメディアクエリでスマホ時のみ特定要素を非表示(display:none)にし、JSからその状態を読み取る方法です。CSSとJSのブレークポイントを別管理したくない場合に有効です。

HTML・CSS・JS の実装

まず、スマホ判定用のダミー要素をHTMLに追加します。

<!-- スマホ判定用(画面に表示しないダミー要素) -->
<span id="sp-detector"></span>

次にCSSでスマホ時のみ display:none にします。

#sp-detector {
  display: none;
}

@media (min-width: 769px) {
  #sp-detector {
    display: block;
  }
}

JSでその表示状態を確認します。

$(function() {
  if ($("#sp-detector").css("display") === "none") {
    console.log("スマホ表示(#sp-detectorが非表示)");
    // スマホ専用処理
  } else {
    console.log("PC/タブレット表示");
  }
});
この方法のメリット:CSSで一元管理しているブレークポイントをJSでも流用できます。デザイナーとエンジニアで担当が分かれているプロジェクトで役立ちます。

各方法の比較表

方法 判定基準 リサイズ対応 信頼性 推奨度
window.matchMedia() CSSメディアクエリ ◎ addEventListener 高い ★★★
$(window).width() ピクセル幅 ○ resizeイベント 高い ★★
navigator.userAgent デバイス文字列 × 不要 中(偽装可能)
CSS連動(display) CSSの表示状態 △ 初回のみ容易 高い ★★

実装例: スマホのみハンバーガーメニューを有効化する

window.matchMedia() を使った実践例です。スマホ幅(768px以下)のときだけハンバーガーメニューのクリックイベントを有効にします。

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

  function initMenu(mq) {
    if (mq.matches) {
      // スマホ: ハンバーガーメニューを有効化
      $(".hamburger").on("click.sp", function() {
        $(".nav-menu").slideToggle(300);
        $(this).toggleClass("is-active");
      });
    } else {
      // PC: イベントを解除してナビを表示状態に戻す
      $(".hamburger").off("click.sp");
      $(".nav-menu").show();
    }
  }

  // 初回実行
  initMenu(mqSP);

  // リサイズ時にも再実行
  mqSP.addEventListener("change", initMenu);
});
ポイント:イベントの名前空間 click.sp を使うことで、PCに切り替わったときに off("click.sp") でスマホ用イベントだけを解除できます。

関連記事

よくある質問(FAQ)

768pxの基準はどこから来ているの?
Bootstrapなど主要CSSフレームワークがタブレット/スマホの境界を768pxとしていることに由来します。ただしサイトのデザイン要件によって600px・480pxなど異なる値を使うこともあります。プロジェクトのCSSブレークポイントに合わせてください。
window.matchMedia() は古いブラウザで動作しますか?
IE9以上・Chrome/Firefox/Safari の現行バージョンでサポートされています。IE8以下をサポートする必要がある場合は $(window).width() などのフォールバックを検討してください。ただし現在IE8をサポートするケースは稀です。
スマホ判定でタブレットを除外したい場合は?
min-widthとmax-widthを組み合わせたメディアクエリで範囲を絞れます。例: window.matchMedia("(max-width: 480px)") とすることで小型スマホのみに絞ることができます。また (max-width: 768px) and (pointer: coarse) のようにタッチデバイスかどうかも組み合わせる方法もあります。
userAgentでiPad(iPadOS 13以降)を判定できないのはなぜ?
iPadOS 13から、iPadのUser-AgentがMacintosh(Mac/PCと同じ)になりました。そのためUAだけでiPadを検出することが非常に困難です。タッチ対応かどうかを navigator.maxTouchPoints > 1 で確認する方法が有効ですが、完全な判定は難しいため、画面幅ベースの判定を推奨します。
$(window).width() と window.innerWidth の違いは?
$(window).width() はjQueryのメソッドでスクロールバーの幅を除いた値を返します。window.innerWidth はネイティブJSのプロパティでスクロールバーを含んだ値を返すことがあります。厳密なピクセル判定が必要な場合はどちらを使うか統一しておくことをおすすめします。

まとめ

jQueryでスマホ判定を行う4つの方法のまとめ:
window.matchMedia():CSSメディアクエリと同じ条件で判定できる最推奨の方法。addEventListenerでリサイズにも対応。
$(window).width():ピクセル幅で判定するシンプルな方法。resizeイベントと組み合わせて使う。
navigator.userAgent:デバイス名を文字列で判定。UAは偽装可能でiPadOS13問題もあるため補助的に使う。
CSS連動(display:none チェック):CSSのブレークポイントをJSと共有したい場合に有効。
迷ったら window.matchMedia() を選ぶのが最もシンプルで保守しやすい実装です。