メディアクエリ(画面サイズ対応)

@mediamin-widthmax-widthprefers-color-schemeprefers-reduced-motion

メディアクエリを使うと、画面サイズ・デバイスの特性・ユーザーの好みに応じてスタイルを切り替えられます。レスポンシブデザインの基盤技術です。

デモ:ウィンドウ幅に応じてスタイルが変わる

現在の画面サイズ

ブラウザウィンドウの幅を変えると背景色が変わります: 紫=デスクトップ / 黄=タブレット / ピンク=モバイル

デモ:レスポンシブグリッド

Card 1
Card 2
Card 3
Card 4
Card 5
Card 6

<480px: 1列 / 480px〜: 2列 / 768px〜: 3列

デモ:prefers-color-scheme(ダークモード)

このボックスはシステムのダークモード設定に応じてスタイルが変わります。 OSの設定でダークモードに切り替えてみてください。

デモ:prefers-reduced-motion(アニメーション軽減)

OSの「視差効果を減らす」設定をONにするとアニメーションが停止します。アクセシビリティのために重要です。

コード例

/* 基本構文 */
@media (min-width: 768px) {
  .container { max-width: 768px; }
}

/* メディアタイプ + 条件 */
@media screen and (min-width: 1024px) { ... }
@media print { ... }

/* 論理演算子 */
@media (min-width: 600px) and (max-width: 1200px) { ... } /* and */
@media (max-width: 480px), (orientation: landscape)  { ... } /* or (カンマ) */
@media not screen { ... }                                    /* not */

/* よく使われるブレークポイント(Tailwind CSS準拠) */
/* sm: 640px / md: 768px / lg: 1024px / xl: 1280px / 2xl: 1536px */
@media (min-width: 640px)  { /* sm */ }
@media (min-width: 768px)  { /* md */ }
@media (min-width: 1024px) { /* lg */ }
@media (min-width: 1280px) { /* xl */ }

/* ユーザー設定系(アクセシビリティ) */
@media (prefers-color-scheme: dark) {
  body { background: #111; color: #f9f9f9; }
}
@media (prefers-reduced-motion: reduce) {
  * { animation-duration: 0.01ms !important; }
}
@media (prefers-contrast: high) {
  .button { border: 3px solid currentColor; }
}

/* orientation */
@media (orientation: portrait)  { /* 縦長 */ }
@media (orientation: landscape) { /* 横長 */ }

/* ポインタの精度 */
@media (hover: hover) { /* マウスでホバー可能な環境 */ }
@media (pointer: coarse) { /* タッチデバイス(指) */ }

比較:モバイルファースト vs デスクトップファースト

観点モバイルファースト(min-width)デスクトップファースト(max-width)
基本スタイルモバイル向けをデフォルトに記述デスクトップ向けをデフォルトに記述
追加スタイル大きい画面に向けて追加・上書き小さい画面に向けて追加・上書き
パフォーマンス✅ モバイルは余分なスタイルを処理しない❌ モバイルが多くのスタイルを上書きする
現在の主流✅ 推奨(Tailwind CSS, Bootstrap等)⚠️ レガシーなアプローチ
コードの見通しシンプルから複雑へ(拡張しやすい)複雑から単純へ(削ぎ落としにくい)

NEW範囲構文 と ユーザー設定クエリ(2022〜2023)

① メディアクエリ範囲構文(Level 4)

min-width / max-width の代わりに、より直感的な比較演算子が使えます。

/* 従来の書き方 */
@media (min-width: 768px) { ... }
@media (max-width: 1023px) { ... }
@media (min-width: 768px) and (max-width: 1023px) { ... }

/* 新しい範囲構文 (Chrome 113+, Firefox 63+, Safari 16.4+) */
@media (width >= 768px)  { ... }  /* min-width と同じ */
@media (width <= 1023px) { ... }  /* max-width と同じ */
@media (768px <= width <= 1023px) { ... }  /* 範囲指定が1行で! */

/* height にも使える */
@media (height >= 600px) { ... }

② prefers-contrast(アクセシビリティ)

/* ハイコントラストモード対応 (Chrome 96+, Firefox 101+, Safari 14.1+) */
@media (prefers-contrast: high) {
  .button {
    border: 3px solid currentColor;
    font-weight: bold;
  }
  .subtle-text { color: #000; }
}
@media (prefers-contrast: low) {
  /* コントラスト低め好みのユーザー */
  .divider { border-color: rgba(0,0,0,0.1); }
}

/* forced-colors: Windows ハイコントラストモード */
@media (forced-colors: active) {
  .custom-checkbox { forced-color-adjust: none; }
}

アクセシビリティ対応は必須の時代。prefers-reduced-motion, prefers-color-scheme, prefers-contrast の3つは特に重要です。

🤖 AIプロンプトテンプレート

CSSのメディアクエリを使ったレスポンシブデザインの実装例をReact + Tailwind CSSで作成してください。

要件:
- min-width / max-width を使ったモバイルファーストのブレークポイント切り替えデモ
- prefers-color-scheme でダークモード・ライトモードを自動切り替えするUI
- prefers-reduced-motion でアニメーションを軽減するアクセシビリティ対応デモ
- ウィンドウ幅に応じてグリッド列数が変わるレスポンシブカードレイアウト
- 範囲構文(768px <= width <= 1024px)の新しい書き方の実例
- Tailwind CSSのsm / md / lg / xl ブレークポイントを活用したコンポーネント

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。