メディアクエリとは、画面幅やOSの設定などの条件に応じてCSSを切り替える仕組みで、レイアウトが切り替わる境目の幅を「ブレークポイント」と呼びます。2026年時点では「768px / 1024px / 1280px を軸に、モバイルファースト(width >=)で書く」のが扱いやすい構成です。

この記事では、Tailwind CSS v4 と Bootstrap 5.3 の公式の既定値を比較した推奨表、コピペで使える range構文 @media (width >= 768px) のテンプレート、よく使うメディア特性の一覧 をまとめました。さらに Playwright + Chromium 141 で 幅 375 / 768 / 1024 / 1280px のときにどのルールが効いたかを getComputedStyle で実測 し、viewportメタタグ忘れ・境界の重なり・記述順といった よくある失敗も実際に再現 しています。コンテナクエリとの使い分けも同じ画面で比べました。


ブレークポイントとメディアクエリの早見表

区分 迷ったらこの値 Tailwind v4 Bootstrap 5.3 書き方(モバイルファースト)
スマホ(基本) 〜767px 接頭辞なし(〜639px)+ sm xs(〜575px) メディアクエリの外に書く
大きめスマホ 640px(任意) sm 640px sm 576px @media (width >= 640px)
タブレット 768px md 768px md 768px @media (width >= 768px)
小さめPC 1024px lg 1024px lg 992px @media (width >= 1024px)
PC 1280px xl 1280px xl 1200px @media (width >= 1280px)
大画面 1536px(任意) 2xl 1536px xxl 1400px @media (width >= 1536px)
範囲指定 タブレットだけ md:max-lg: media-breakpoint-only(md) @media (768px <= width < 1024px)
必須のHTML — — — <meta name="viewport" content="width=device-width, initial-scale=1">

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「メディアクエリ ブレークポイント|2026年版の推奨値と書き方テンプレート」


2026年の推奨ブレークポイント(Tailwind v4 / Bootstrap 5.3 比較)

主要フレームワークの既定値を並べると、768px はどちらも同じで、1024px 前後と 1280px 前後に集まっています。 公式ドキュメントで確認した値です。

名前 Tailwind CSS v4 Bootstrap 5.3(min) Bootstrap の max(-down)
sm 40rem(640px) 576px 575.98px
md 48rem(768px) 768px 767.98px
lg 64rem(1024px) 992px 991.98px
xl 80rem(1280px) 1200px 1199.98px
2xl / xxl 96rem(1536px) 1400px 1399.98px
生成されるCSS @media (width >= 48rem) @media (min-width: 768px) @media (max-width: 767.98px)
  • Tailwind v4 は rem 単位と range 構文 で出力します(max-md は @media (width < 48rem))。値は @theme { --breakpoint-3xl: 120rem; } のように変更できます。
  • Bootstrap は min-width を基本 とし、上限側だけ .02px 引いた値を使います(理由は後述)。

値の決め方

端末の機種名ではなく「レイアウトが窮屈になった幅」で決める のが長く使えるやり方です。

手順 やること
1 375px 前後でスマホ用の1列レイアウトを作る
2 ブラウザの幅を広げ、行が長すぎる・余白が空きすぎる幅を探す
3 その幅に近い値(768 / 1024 / 1280 など)をブレークポイントにする
4 部品単位の切り替えは、メディアクエリではなくコンテナクエリにする

メディアクエリの書き方テンプレート

viewportメタタグ(必須)

<meta name="viewport" content="width=device-width, initial-scale=1">

これがないとスマホのブラウザは約980px幅で描画してから縮小するため、スマホ用のメディアクエリが効きません(後述の実測)。

モバイルファースト(range構文・推奨)

/* 基本=スマホ(メディアクエリの外) */
.grid { display: grid; grid-template-columns: 1fr; gap: 16px; }
.nav { display: none; }
.menu-btn { display: block; }

/* タブレット以上 */
@media (width >= 768px) {
  .grid { grid-template-columns: repeat(2, 1fr); }
}
/* 小さめPC以上 */
@media (width >= 1024px) {
  .grid { grid-template-columns: repeat(3, 1fr); }
  .nav { display: flex; }
  .menu-btn { display: none; }
}
/* PC以上 */
@media (width >= 1280px) {
  .grid { grid-template-columns: repeat(4, 1fr); }
}
/* タブレットの範囲だけ */
.tablet-only { display: none; }
@media (768px <= width < 1024px) {
  .tablet-only { display: block; }
}

モバイルファーストは「小さい画面の指定を基本にし、広い画面で上書きする」書き方 です。スマホ用のCSSが最も少なくなり、上書きの向きが一方向なので読みやすくなります。

従来の書き方との対応表

range構文(Media Queries Level 4)は Chrome 104・Firefox 63・Safari 16.4 以降で使え、2023年から主要ブラウザで共通 です。

意味 range構文 従来の書き方
768px以上 (width >= 768px) (min-width: 768px)
768px未満 (width < 768px) (max-width: 767.98px)
768px以下 (width <= 768px) (max-width: 768px)
768以上1024未満 (768px <= width < 1024px) (min-width: 768px) and (max-width: 1023.98px)
高さ600px未満 (height < 600px) (max-height: 599.98px)
条件のどれか (width < 768px), print 同じ(カンマ=または)
条件の否定 not (width >= 768px) not all and (min-width: 768px)

PCファースト(既存サイトの改修時)

.grid { grid-template-columns: repeat(4, 1fr); }
@media (width < 1280px) { .grid { grid-template-columns: repeat(3, 1fr); } }
@media (width < 1024px) { .grid { grid-template-columns: repeat(2, 1fr); } }
@media (width < 768px)  { .grid { grid-template-columns: 1fr; } }

PCファーストでは、大きい値から小さい値の順に書きます。 既存のPC向けCSSに後からスマホ対応を足す場合に向いています。

CSSファイルごと・JavaScriptで切り替える

<link rel="stylesheet" href="print.css" media="print">
<link rel="stylesheet" href="wide.css" media="(width >= 1024px)">
const mq = matchMedia('(width >= 1024px)');
const apply = () => document.body.dataset.layout = mq.matches ? 'pc' : 'sp';
mq.addEventListener('change', apply);
apply();

実測では、幅を 1024px → 1023px に変えると change イベントで data-layout が pc → sp に切り替わりました(PCファーストの例も 1280/1024/768/767px で 4→3→2→1列を確認)。


375 / 768 / 1024 / 1280px で実測した結果

環境:Playwright 1.56 + Chromium 141.0.7390.37(ヘッドレス)。 上のモバイルファーストのテンプレートを読み込み、getComputedStyle で値を読みました(列数は grid-template-columns の値の数)。

画面幅 .grid の列数 .nav .menu-btn .tablet-only 効いたメディアクエリ
375px 1 none block none なし(基本のCSSのみ)
767px 1 none block none なし
768px 2 none block block >= 768px、768px <= width < 1024px
1023px 2 none block block 同上
1024px 3 flex none none >= 768px、>= 1024px
1279px 3 flex none none 同上
1280px 4 flex none none >= 768px、>= 1024px、>= 1280px

width >= 768px は 768px ちょうどで効き、767px では効かない ことが確認できます。範囲指定 768px <= width < 1024px も 1023px まで効き、1024px で外れました。


よく使うメディア特性の一覧(実測つき)

メディア特性とは、画面幅以外にも「ダークモードか」「マウスがあるか」などを判定できる条件 です。Playwright で環境を切り替えて matchMedia() の結果を記録しました(○=一致)。

メディア特性 用途 PC既定 スマホ相当※ ダーク+動き減 印刷
(prefers-color-scheme: dark) ダークモード - - ○ -
(prefers-reduced-motion: reduce) 動きを減らす設定 - - ○ -
(hover: hover) ホバーできる主入力 ○ - ○ ○
(pointer: coarse) 指で操作 - ○ - -
(pointer: fine) マウスなど精密な操作 ○ - ○ ○
(orientation: portrait) 縦長 - ○ - -
(min-resolution: 2dppx) 高解像度 - ○ - ○
print 印刷時 - - - ○
(prefers-contrast: more) 高コントラスト設定 - - - -
(forced-colors: active) 強制カラー - - - -
(display-mode: standalone) PWAとして起動 - - - -

※ 375×667、isMobile・hasTouch・deviceScaleFactor: 2。prefers-contrast: more と forced-colors: active は、それぞれをエミュレートしたときに ○ になりました。

メディア特性のテンプレート

/* ダークモード */
:root { --bg: #fff; --text: #111; }
@media (prefers-color-scheme: dark) {
  :root { --bg: #111; --text: #eee; }
}

/* 動きを減らす設定 */
@media (prefers-reduced-motion: reduce) {
  * { animation: none !important; transition: none !important; }
}

/* ホバーできる端末だけホバー効果(タップ後に色が残るのを防ぐ) */
@media (hover: hover) and (pointer: fine) {
  .btn:hover { background: #1a73e8; }
}

/* 指で操作する端末はタップ領域を広く */
@media (pointer: coarse) {
  .btn { min-height: 44px; }
}

/* 印刷 */
@media print {
  .nav, .menu-btn { display: none; }
  a[href]::after { content: " (" attr(href) ")"; }
}

「スマホかどうか」を幅だけで判定せず、ホバーは hover、タップ領域は pointer で判定 すると、タブレット+マウスなど組み合わせが増えても意図どおりに動きます。


コンテナクエリ(@container)との使い分け

メディアクエリは「画面全体の幅」、コンテナクエリは「親要素の幅」で切り替えます。 同じカード部品を、幅300pxのサイドバーと広いメイン領域に置いたときの違いを実測しました。

.layout { display: grid; grid-template-columns: 300px 1fr; }
.wrap { container-type: inline-size; container-name: card; }

/* コンテナクエリ版:置かれた場所の幅で切り替え */
.card { display: grid; grid-template-columns: 1fr; }
@container card (width >= 480px) {
  .card { grid-template-columns: 160px 1fr; }
}

/* メディアクエリ版:画面幅で切り替え */
.mcard { display: grid; grid-template-columns: 1fr; }
@media (width >= 768px) {
  .mcard { grid-template-columns: 160px 1fr; }
}

/* コンテナ幅に比例する文字サイズ */
.u { font-size: clamp(14px, 4cqi, 24px); }

画面幅 1280px での実測(grid-template-columns):

置き場所(幅) コンテナクエリ版 .card メディアクエリ版 .mcard 4cqi の文字
サイドバー(300px) 300px(1列) 160px 140px(2列) 14px
メイン(964px) 160px 804px(2列) 160px 804px(2列) 24px

メディアクエリ版は画面が広いというだけで、狭いサイドバーでも2列になり、本文が140pxまで細くなりました。 コンテナクエリ版は置き場所に合わせて1列のままです。

判断ポイント メディアクエリ コンテナクエリ
ページ全体の骨組み(列数、ナビ切替) ◎ △(基準の親が必要)
カード・フォームなど再利用する部品 △ ◎
OS設定・入力方法・印刷 ◎(メディア特性) 対象外
対応状況 すべて サイズクエリは2023年から主要ブラウザで共通

骨組みはメディアクエリ、部品はコンテナクエリ と分けると、ブレークポイントの数を増やさずに済みます。container-type: inline-size を付けた要素自身には、そのコンテナクエリは効かない(子孫に効く)点に注意します。


よくある失敗と直し方(実際に再現)

1. viewportメタタグを忘れる

スマホ相当(375×667、isMobile: true)で、メタタグの有無だけを変えて比べました。

documentElement.clientWidth (width >= 768px) .grid 列数 .tablet-only
メタタグあり 375 false 1 none
メタタグなし 980 true 2 block

メタタグがないと、スマホでもCSS上の幅が980pxとして扱われ、タブレット用のルールが効きました。 <head> に1行入れれば直ります。

2. max-width と min-width の境界が重なる

@media (max-width: 768px) { .d { color: red; } }
@media (min-width: 768px) { .d { color: blue; } }
画面幅 (max-width: 768px) (min-width: 768px) 結果の色
767px 一致 — red
768px 一致 一致 blue(後に書いた方)

768px ちょうどで両方が一致し、後に書いたルールが勝ちました。 上限側は max-width: 767px(または 767.98px)にするか、range構文で (width < 768px) と (width >= 768px) に分けると重なりません。

3. 767px と 768px の間(767.98px 問題)

Bootstrap の公式ドキュメントでは、上限に .02px 引いた値を使う理由を、小数の幅のビューポート(高DPI端末などで起こりうる)で min- と max- の間にすき間ができるのを避けるため、という趣旨で説明しています。max-width: 767px と min-width: 768px の組み合わせでは、767.5px のような幅でどちらにも当てはまらない可能性があります。

今回、幅 767.5px / 767.98px の iframe で再現を試みましたが、Chromium 141 では中のビューポート幅が 768px に丸められ、すき間は再現しませんでした(innerWidth はいずれも 768)。

書き方 767px 768px すき間
max-width: 767px / min-width: 768px max min 小数の幅で起こりうる
max-width: 767.98px / min-width: 768px max min ほぼなし
width < 768px / width >= 768px max min 定義上なし

range構文なら「未満」と「以上」で書けるので、すき間も重なりも原理的に起きません。

4. 記述順・詳細度でメディアクエリが負ける

@media (width >= 768px) { .title { font-size: 32px; } }
.title { font-size: 20px; }                /* 後に書いた */

@media (width >= 768px) { .title2 { font-size: 32px; } }
.box .title2 { font-size: 20px; }          /* 詳細度が高い */

.title3 { font-size: 20px; }
@media (width >= 768px) { .title3 { font-size: 32px; } }  /* 正しい順 */
画面幅 .title .title2 .title3
375px 20px 20px 20px
768px 20px 20px 32px

メディアクエリは詳細度を上げません。 同じ詳細度なら後に書いた方が勝つため、基本のCSSの後にメディアクエリを書き、セレクタの詳細度をそろえます。

チェックリスト

確認項目 OK の状態
viewportメタタグ width=device-width, initial-scale=1 がある
書く順番 基本のCSS → 小さい値 → 大きい値(モバイルファースト)
境界 < と >= で分けている(重なり・すき間なし)
単位 px か rem のどちらかに統一
ホバー (hover: hover) の中に書いている
部品の切り替え コンテナクエリを検討した

よくある質問

Q. ブレークポイントはいくつ用意すればよいですか? A. 多くのサイトは 768px と 1024px の2つ、広い画面の調整に 1280px を足した3つで足ります。部品ごとの細かい調整はコンテナクエリに任せると、ページ全体のブレークポイントを増やさずに済みます。

Q. px と em / rem はどちらで書くべきですか? A. Tailwind v4 は rem(48rem=768px)で出力しています。メディアクエリ内の rem / em はルート要素の設定ではなくブラウザの初期文字サイズ(通常16px)が基準になるため、ユーザーが文字サイズを大きくしたときにも比例して切り替わります。どちらでも動くので、プロジェクト内で統一することが大切です。

Q. range構文は使っても大丈夫ですか? A. Chrome 104、Firefox 63、Safari 16.4 以降で対応しており、2023年から主要ブラウザで共通して使えます。Tailwind v4 も既定の出力に使っています。

Q. スマホ判定に画面幅を使うのと、pointer: coarse を使うのはどちらがよいですか? A. レイアウトは画面幅、操作方法に関わる見た目(ホバー効果、タップ領域)は hover / pointer と、目的で分けるのがおすすめです。


まとめ

  • 迷ったら 768 / 1024 / 1280px の3段階。768px は Tailwind v4 と Bootstrap 5.3 の共通値
  • モバイルファーストで @media (width >= 768px) と書く。範囲は (768px <= width < 1024px)
  • viewportメタタグがないと、スマホでも幅980pxとして扱われる(実測)
  • max-width: 768px と min-width: 768px は 768px で重なる。range構文の < と >= で分ける
  • メディアクエリは詳細度を上げない。基本のCSSの後に書く
  • 骨組みはメディアクエリ、部品はコンテナクエリ。ホバーや入力方法はメディア特性で判定

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「メディアクエリ ブレークポイント|2026年版の推奨値と書き方テンプレート」

株式会社RJCでは、どの画面でも使いやすいUIを作るための工夫を、プロジェクトの中で仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?