メインコンテンツへスキップ
Code & Craft
Web制作 約7分で読めます

CSS Container Queries 完全ガイド|コンポーネント駆動デザインの新常識【2026年版】

CSS Container Queriesの使い方を実例で解説。ビューポートではなく親コンテナのサイズに応じたレスポンシブ実装、@container文法、実務での活用パターンを網羅。

メディアクエリ(@media)はビューポート(画面)のサイズに基づくレスポンシブ実装ですが、コンポーネント指向の現代ウェブ開発では「親コンテナのサイズに応じた調整」が必要です。これを実現するのが CSS Container Queries です。2026年現在、全主要ブラウザでサポートされ、実務投入可能な機能となっています。

Container Queries とは

Container Queries は、要素の親コンテナのサイズに応じてスタイルを変更できる機能です。同じコンポーネントが、サイドバーでは縦積み、メインエリアでは横並びに、という実装が容易になります。

/* 親要素を「クエリコンテナ」として宣言 */
.card-wrapper {
  container-type: inline-size;
  container-name: card;
}

/* コンテナが 400px 以上の時だけ横並び */
@container card (min-width: 400px) {
  .card {
    display: grid;
    grid-template-columns: 1fr 2fr;
  }
}

メディアクエリとの違い

項目Media QueriesContainer Queries
基準ビューポート全体親コンテナ
用途ページ全体のレイアウトコンポーネント単位
再利用性低い(配置場所に依存)高い(どこに置いても動く)

メディアクエリでは「画面幅 768px 以上で横並び」と書くしかありませんでしたが、同じコンポーネントをサイドバー・メインエリア・フッターに配置すると、それぞれで異なる調整が必要になります。Container Queries はこの問題を解決します。

ブラウザ対応(2026年4月)

ブラウザサポート開始
Chrome 1052022年8月
Safari 162022年9月
Edge 1052022年9月
Firefox 1102023年2月

全主要ブラウザで 2年以上前から安定サポートされています。

container-type の3つのモード

size(両軸)

.container {
  container-type: size;
}

幅・高さの両方をクエリに使えます。ただし、親要素の高さに依存するレイアウトは避けるべき(レイアウトシフトの原因)のため、使用頻度は低めです。

inline-size(幅のみ、推奨)

.container {
  container-type: inline-size;
}

最もよく使われるモードです。幅のみをクエリに使い、高さは子要素で自動的に決まります。実務ではほぼこれを使用します。

normal

.container {
  container-type: normal;
}

クエリ対象外にします。親要素のデフォルト挙動を保ったまま、@container style() などスタイルクエリだけを使いたい場合に使います。

実践パターン

1. 汎用的なカードコンポーネント

.card-wrapper {
  container-type: inline-size;
}

.card {
  padding: 1rem;
  border-radius: 0.5rem;
  background: white;
}

/* 狭い時は縦積み */
.card-image {
  width: 100%;
  aspect-ratio: 16 / 9;
}

/* 400px 以上で横並び */
@container (min-width: 400px) {
  .card {
    display: grid;
    grid-template-columns: 150px 1fr;
    gap: 1rem;
  }
  .card-image {
    aspect-ratio: 1;
  }
}

/* 600px 以上で余裕のあるレイアウト */
@container (min-width: 600px) {
  .card {
    grid-template-columns: 200px 1fr;
    padding: 1.5rem;
  }
}

このコンポーネントは、配置場所を問わず適切なレイアウトになります。

2. ナビゲーションの適応

.nav-container {
  container-type: inline-size;
}

.nav {
  display: flex;
  gap: 0.5rem;
}

.nav-label {
  display: none; /* 狭い時はアイコンのみ */
}

@container (min-width: 500px) {
  .nav-label {
    display: inline; /* 広い時はラベル表示 */
  }
}

3. サイドバーとメインエリアで同じコンポーネントを使う

<aside class="sidebar">
  <div class="card-wrapper">
    <article class="card">...</article>
  </div>
</aside>

<main class="main">
  <div class="card-wrapper">
    <article class="card">...</article>
  </div>
</main>
.sidebar .card-wrapper {
  container-type: inline-size;
  width: 280px;
}

.main .card-wrapper {
  container-type: inline-size;
  width: 100%;
  max-width: 800px;
}

同じ .card が、配置場所に応じて自動的にレイアウトを切り替えます。

コンテナクエリ単位

Container Queries では、コンテナのサイズに対する相対単位が使えます。

単位意味
cqwコンテナの幅の 1%
cqhコンテナの高さの 1%
cqiコンテナのインライン方向の 1%(通常は幅)
cqbコンテナのブロック方向の 1%(通常は高さ)
cqmincqi と cqb の小さい方
cqmaxcqi と cqb の大きい方
.card-title {
  /* コンテナ幅の 5% を基準にフォントサイズを決定 */
  font-size: clamp(1rem, 5cqi, 2rem);
}

.card-padding {
  /* コンテナ幅の 4% をパディングに */
  padding: 4cqi;
}

これにより、コンテナサイズに応じてなめらかにスケールするUIが作れます。

スタイルクエリ(Style Queries)

CSS カスタムプロパティの値に応じてスタイルを変える機能です(Chrome 111+でサポート)。

.theme {
  container-name: theme;
}

.theme.dark {
  --theme: dark;
}

@container theme style(--theme: dark) {
  .card {
    background: #1e293b;
    color: #f1f5f9;
  }
}

テーマ切り替えなどの実装で重宝します。

パフォーマンスへの配慮

Container Queries はブラウザに追加の計算を要求します。以下に注意しましょう。

1. クエリコンテナを広範囲にしない

/* 悪い例: body 全体をクエリコンテナに */
body {
  container-type: inline-size;
}

/* 良い例: コンポーネント単位 */
.card-wrapper {
  container-type: inline-size;
}

2. container-type: size は慎重に

高さが動的に変わるレイアウトでは、循環参照を引き起こす可能性があります。幅だけで十分な場合は inline-size を使いましょう。

3. ブレークポイントの数を適切に

/* 過度にブレークポイントを増やすと保守が困難 */
@container (min-width: 200px) { ... }
@container (min-width: 300px) { ... }
@container (min-width: 400px) { ... }
@container (min-width: 500px) { ... }

実務では 2-3 個のブレークポイントで十分なことが多いです。

メディアクエリとの併用

実務では両方を組み合わせて使います。

/* ページ全体のレイアウトはメディアクエリ */
@media (min-width: 1024px) {
  .layout {
    display: grid;
    grid-template-columns: 280px 1fr;
  }
}

/* コンポーネントの内部は Container Queries */
.card-wrapper {
  container-type: inline-size;
}

@container (min-width: 400px) {
  .card { /* ... */ }
}

まとめ

CSS Container Queries は、コンポーネント駆動の現代的な Web 開発における必須機能です。

主な利点:

  • コンポーネントの再利用性向上: 配置場所を問わず動作
  • メディアクエリの補完: ビューポート以外の軸でのレスポンシブ
  • 保守性の向上: 実装がコンポーネントに閉じる

小さなコンポーネントから導入し始めるのがおすすめです。特にカード、ナビゲーション、フォームなど、複数の場所で使い回すコンポーネントで効果を実感できます。

参考リンク

#CSS #レスポンシブデザイン #コンポーネント #フロントエンド
シェア: