スマートフォンだけに特定の処理を実行させたい場面は多くあります。たとえば「スマホ時のみハンバーガーメニューを有効化する」「タブレット以下ではスライドショーを無効化する」など、レスポンシブ対応の実装で必ず直面する課題です。
jQueryでスマホ判定を行う主な方法は次の4つです。
- window.matchMedia()(推奨・最もモダン)
- $(window).width()(ウィンドウ幅で判定)
- navigator.userAgent(ユーザーエージェント文字列)
- 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);
方法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)/ |
① 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/タブレット表示");
}
});
各方法の比較表
| 方法 | 判定基準 | リサイズ対応 | 信頼性 | 推奨度 |
|---|---|---|---|---|
| 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") でスマホ用イベントだけを解除できます。関連記事
- jQueryを使ったアニメーション付きハンバーガーメニューの実装方法 ― ハンバーガーメニューの具体的な実装方法を解説しています。
- jQueryが動かない時の解決策 ― スマホ判定処理が動かない場合のデバッグにも役立ちます。
- 【jQuery】attr()でHTMLの属性操作を行う方法 ― DOM操作の基本をおさえておきましょう。
よくある質問(FAQ)
window.matchMedia("(max-width: 480px)") とすることで小型スマホのみに絞ることができます。また (max-width: 768px) and (pointer: coarse) のようにタッチデバイスかどうかも組み合わせる方法もあります。navigator.maxTouchPoints > 1 で確認する方法が有効ですが、完全な判定は難しいため、画面幅ベースの判定を推奨します。$(window).width() はjQueryのメソッドでスクロールバーの幅を除いた値を返します。window.innerWidth はネイティブJSのプロパティでスクロールバーを含んだ値を返すことがあります。厳密なピクセル判定が必要な場合はどちらを使うか統一しておくことをおすすめします。まとめ
① window.matchMedia():CSSメディアクエリと同じ条件で判定できる最推奨の方法。addEventListenerでリサイズにも対応。
② $(window).width():ピクセル幅で判定するシンプルな方法。resizeイベントと組み合わせて使う。
③ navigator.userAgent:デバイス名を文字列で判定。UAは偽装可能でiPadOS13問題もあるため補助的に使う。
④ CSS連動(display:none チェック):CSSのブレークポイントをJSと共有したい場合に有効。
迷ったら window.matchMedia() を選ぶのが最もシンプルで保守しやすい実装です。