メディアクエリ 実装解説|CSS Media Query Guide

デモで学ぶ メディアクエリ実践ガイド

画面幅に応じてスタイルを切り替える @media の代表的な書き方を、ボタン操作で動きを確かめながら学べます。すぐに使えるHTML・CSSのコードもコピーできます。
HTML・CSS・JSコードプレビューツール にて実装確認ができます。

① フォントサイズ・色の変化 — min-width でスタイルを上書き

画面の大きさでフォントサイズとカラーが変わります!

現在: スマホ幅 / 16px / 赤

HTML
<p>画面の大きさでフォントサイズとカラーが変わります!</p>
CSS
p {
  font-size: 16px;
  color: red;
  text-align: center;
}

@media (min-width: 768px) {
  p {
    font-size: 20px;
    color: blue;
  }
}

@media (min-width: 1280px) {
  p {
    font-size: 24px;
    color: #1a1a2e;
  }
}
min-width とモバイルファースト

デフォルトのスタイルをスマホ向けに書き、min-width で画面が広くなるにつれてスタイルを追加します。CSSは後から書いたものが優先されるため、条件を小さい順に書くのがポイントです。この書き方を「モバイルファースト」と呼びます。

② テキストの出し分け — display: none で切り替え

768px未満の画面サイズです!(スマホ想定)

768px以上、1280px未満の画面サイズです!(タブレット想定)

1280px以上の画面サイズです!(PC想定)

現在: スマホ幅

HTML
<p class="txt-sp">768px未満の画面サイズです!(スマホ想定)</p>
<p class="txt-tb">768px以上、1280px未満の画面サイズです!(タブレット想定)</p>
<p class="txt-pc">1280px以上の画面サイズです!(PC想定)</p>
CSS
.txt-sp { display: block; }
.txt-tb { display: none; }
.txt-pc { display: none; }

@media (min-width: 768px) {
  .txt-sp { display: none; }
  .txt-tb { display: block; }
}

@media (min-width: 1280px) {
  .txt-tb { display: none; }
  .txt-pc { display: block; }
}
display: none と display: block

全テキストをHTMLに書いておき、表示したくないものを display: none で隠します。min-width の条件を小さい順に書くことで、画面幅が広くなるにつれて正しく切り替わります。

③ Flexbox レイアウトの変化 — 縦並び → 横並び → 比率変化

1
2
3

現在: スマホ幅 / 縦並び

HTML
<div class="box-wrap">
  <div class="box-1">1</div>
  <div class="box-2">2</div>
  <div class="box-3">3</div>
</div>
CSS
.box-1, .box-2, .box-3 {
  height: 60px;
  border-radius: 6px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: 1rem;
  color: #fff;
  margin-bottom: 8px;
}

.box-1 { background: #38bdf8; }
.box-2 { background: #f87171; }
.box-3 { background: #4ade80; }

@media (min-width: 768px) {
  .box-wrap {
    display: flex;
    gap: 8px;
  }
  .box-1, .box-2, .box-3 {
    flex: 1;
    margin-bottom: 0;
  }
}

@media (min-width: 1280px) {
  .box-1 { flex: 2; }
  .box-2 { flex: 1; }
  .box-3 { flex: 1; }
}
Flexbox と flex プロパティ

タブレット幅以上で display: flex を適用して横並びにします。PC幅では flex の数値で幅の比率を指定できます。flex: 2 と flex: 1 が並ぶと 2:1:1 の比率になります。

④ min-width と max-width の違い

min-width: 800px

100px / 赤(デフォルト)

max-width: 800px

200px / 青(条件一致)

現在: 800px未満の幅

HTML
<!-- min-width / max-width それぞれ単体で使用 -->
<div></div>
CSS
/* min-width の例(800px以上になったらスタイルが変化) */
div {
  width: 50px;
  height: 50px;
  background: #dc2626;
  border-radius: 6px;
}

@media (min-width: 800px) {
  div {
    width: 80px;
    height: 80px;
    background: #2563eb;
  }
}

/* max-width の例(800px以下になったらスタイルが変化) */
div {
  width: 50px;
  height: 50px;
  background: #dc2626;
  border-radius: 6px;
}

@media (max-width: 800px) {
  div {
    width: 80px;
    height: 80px;
    background: #2563eb;
  }
}
min-width — モバイルファースト(推奨)

デフォルトをスマホ向けに書き、画面が広くなるにつれて条件が発火します。現代のWebはスマホ閲覧が主流のため、こちらが推奨されています。

max-width — デスクトップファースト

デフォルトをPC向けに書き、画面が狭くなるにつれて条件が発火します。min-width と動作が逆になるため、混在させると意図しない挙動が起きやすくなります。どちらかに統一するのがオススメです。

⑤ 複数条件の組み合わせ — and でタブレットの時だけ効かせる

現在: スマホ幅 / 通常色

HTML
<div class="range-box"></div>
CSS
.range-box {
  width: 120px;
  height: 90px;
  border-radius: 10px;
  background: #cbd5e1;
}

@media (min-width: 600px) and (max-width: 899px) {
  .range-box {
    background: #7c3aed;
  }
}
and — 2つの条件を両方満たすときだけ発火

min-width と max-width を and でつなぐと、その範囲内のときだけスタイルが適用されます。「PCでもスマホでもなく、タブレットのときだけ」という指定に便利です。範囲の外に出ると自動でデフォルトのスタイルに戻ります。なお、ここでは範囲の始点と終点を分かりやすくするため 600px / 900px を例にしていますが、実際のブレイクポイントは①〜③と同じ 768px / 1280px でも構いません。

①〜③の積み上げ式との違い

①〜③のように min-width だけを小さい順に並べる書き方は、広い条件を後から上書きしていく「積み上げ式」です。一方この and による範囲指定は、範囲の外側では即座に元のスタイルへ戻る「ピンポイント指定」です。画面が広がるほど段階的に変化させたいなら積み上げ式、特定の1レンジだけ挙動を変えたいなら and、と使い分けます。

⑥ orientation — 画面の向き(縦・横)で切り替える

A
B

現在: 縦向き / 縦並び

HTML
<div class="orient-wrap">
  <div class="orient-box">A</div>
  <div class="orient-box">B</div>
</div>
CSS
.orient-wrap {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.orient-box {
  height: 50px;
  border-radius: 6px;
  background: #38bdf8;
  color: #fff;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
}

.orient-box:nth-child(2) {
  background: #f87171;
}

@media (orientation: landscape) {
  .orient-wrap {
    flex-direction: row;
  }
  .orient-box {
    flex: 1;
  }
}
orientation — 画面の縦横比で判定

orientation: portrait は「高さ ≥ 幅」、landscape は「幅 > 高さ」のときに発火します。スマホを横に倒したときだけレイアウトを変えたい、タブレットの向きに応じて要素の並びを変えたい、といった場面で使います。

デバイスの回転だけの機能ではない

orientation は画面の物理的な回転センサーではなく、あくまで「幅と高さのどちらが大きいか」で判定します。そのためPCでウィンドウを細長く縮めたときにも landscape / portrait は切り替わります。スマホの向き固定と混同しないよう注意しましょう。

ブレイクポイントの目安:スマホ(768px未満)・タブレット(768〜1279px)・PC(1280px以上)が代表的な設定値です。デバイスやデザインに合わせて調整してください。

よくある質問

ブレイクポイントは何pxに設定すればいいですか?

絶対の正解はありませんが、768px(タブレット)・1280px(PC)が代表的な目安として広く使われています。上の①〜③のデモもこの2点を基準にしています。最終的には、ターゲットとなる端末の画面幅の分布やコンテンツの見え方に合わせて微調整するのがおすすめです。

min-width と max-width を混在させたら意図通りに動きません。

min-widthは「その値以上で発火」、max-widthは「その値以下で発火」と、条件の向きが逆です。両方を別々の @media で混在させると、CSSの「後に書いたものが優先」というルールにより、意図しない箇所で上書きされることがあります。④のデモで違いを比較できますが、基本はどちらか一方(推奨は min-width によるモバイルファースト)に統一するのが安全です。

タブレットのときだけスタイルを変えたいです。

min-widthmax-widthandでつないだ範囲指定を使います。たとえば@media (min-width: 600px) and (max-width: 899px)と書けば、その範囲内のときだけスタイルが適用されます。⑤の複数条件の組み合わせで実際の動きを確認できます。

メディアクエリを書いたのにスマホで反映されません。よくある原因は?

最も多い原因は、<meta name="viewport" content="width=device-width, initial-scale=1">の記述漏れです。これがないとスマホは実際の画面幅ではなく、仮想的に広い幅(980px前後)でページを表示してしまい、min-widthの条件に一致しなくなります。まずHTMLの<head>内にviewportタグがあるか確認してください。

メディアクエリとFlexbox・Gridはどう組み合わせますか?

メディアクエリは「画面幅・向きによる条件分岐」を担当し、Flexbox・Gridは「その条件下でのレイアウト」を担当します。実務では③のデモのように、@media の中で display: flex に切り替えたり flex の比率を変えたりする組み合わせ方が定番です。横一列のナビゲーションやカードの並びなど1方向のレイアウトならFlexboxの実装解説、行と列の両方を揃えるギャラリーやページ全体の骨格ならGridの実装解説もあわせてご覧ください。


当サイトで公開しているWebデザインやUIの実装例は、一覧として以下記事に纏めています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次