Tasuke Hubのロゴ

ITを中心に困っている人を助けるメディア

分かりやすく解決策を提供することで、あなたの困ったをサポート。 全ての人々がスムーズに生活できる世界を目指します。

CSS Container Queriesを使った次世代レスポンシブデザイン完全ガイド:2025年最新の実装テクニック

記事のサムネイル

CSS Container Queriesとは何か

CSS Container Queriesは、要素のコンテナサイズに基づいてスタイルを動的に変更できる革新的なCSS機能です。従来のメディアクエリがビューポート全体のサイズを基準としていたのに対し、Container Queriesは親要素(コンテナ)のサイズを基準にスタイルを適用できます。

2025年現在、主要ブラウザでサポートされており、より柔軟で再利用可能なコンポーネント設計が可能になりました。

/* コンテナの宣言 */
.card-container {
  container-type: inline-size;
  container-name: card;
}

/* コンテナクエリの使用 */
@container card (min-width: 400px) {
  .card {
    display: flex;
    flex-direction: row;
  }
}

この機能により、同じコンポーネントでも配置される場所のサイズに応じて最適なレイアウトを提供できるようになります。

従来のメディアクエリとの違いと課題解決

メディアクエリは画面サイズ全体を基準とするため、コンポーネントベース開発では以下のような課題がありました:

メディアクエリの課題

  • 同じコンポーネントが異なる幅のコンテナに配置された場合、適切に対応できない
  • サイドバーの有無でメインコンテンツの表示が変わってしまう
  • コンポーネントの再利用性が低い

Container Queriesによる解決

/* 問題のあるメディアクエリの例 */
@media (max-width: 768px) {
  .product-card {
    flex-direction: column;
  }
}

/* Container Queriesを使った改善例 */
.product-grid {
  container-type: inline-size;
}

@container (max-width: 300px) {
  .product-card {
    flex-direction: column;
  }
}

Container Queriesを使うことで、コンテナのサイズに応じてコンポーネントが自律的にレイアウトを調整し、どこに配置されても最適な表示を実現できます。これにより、真のコンポーネント駆動開発が可能になります。

Container Queriesの基本構文と書き方

Container Queriesを使用するには、まずコンテナを定義し、次にクエリを記述します。

1. コンテナの定義

/* 基本的なコンテナ定義 */
.container {
  container-type: inline-size; /* 幅のみ監視 */
}

/* 名前付きコンテナ */
.named-container {
  container-type: inline-size;
  container-name: sidebar;
}

/* 短縮記法 */
.shorthand-container {
  container: sidebar / inline-size;
}

2. container-typeの種類

  • inline-size: 横幅(通常は幅)のみ監視
  • size: 横幅と高さの両方を監視
  • normal: コンテナクエリを無効化

3. クエリの記述

/* 幅ベースのクエリ */
@container (min-width: 500px) {
  .content {
    display: grid;
    grid-template-columns: 1fr 1fr;
  }
}

/* 名前付きコンテナのクエリ */
@container sidebar (max-width: 250px) {
  .nav-item {
    display: none;
  }
}

/* 複数条件の組み合わせ */
@container (min-width: 400px) and (max-width: 800px) {
  .card {
    padding: 2rem;
  }
}

4. 実践的な例

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

@container (min-width: 600px) {
  .article-card {
    display: flex;
    gap: 1rem;
  }
  
  .article-image {
    width: 200px;
    height: 150px;
  }
}

@container (max-width: 599px) {
  .article-card {
    display: block;
  }
  
  .article-image {
    width: 100%;
    height: 200px;
  }
}

この基本構文をマスターすることで、柔軟なレスポンシブデザインを実装できます。

実践的なContainer Queries活用例

実際のプロジェクトで活用できるContainer Queriesの実装例を紹介します。

例1: カード型コンポーネント

.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 1rem;
  container-type: inline-size;
}

.card {
  border: 1px solid #ddd;
  border-radius: 8px;
  overflow: hidden;
}

/* 狭いスペースでの表示 */
@container (max-width: 300px) {
  .card-content {
    padding: 0.75rem;
  }
  
  .card-title {
    font-size: 1rem;
  }
  
  .card-description {
    display: none; /* 説明文を非表示 */
  }
}

/* 十分なスペースがある場合 */
@container (min-width: 350px) {
  .card-content {
    padding: 1.5rem;
  }
  
  .card {
    display: flex;
    flex-direction: row;
  }
  
  .card-image {
    width: 40%;
  }
  
  .card-content {
    width: 60%;
  }
}

例2: ナビゲーションメニュー

.navbar {
  container-type: inline-size;
  background: #333;
  padding: 1rem;
}

/* デスクトップ表示 */
@container (min-width: 768px) {
  .nav-list {
    display: flex;
    gap: 2rem;
  }
  
  .nav-toggle {
    display: none;
  }
}

/* モバイル表示 */
@container (max-width: 767px) {
  .nav-list {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    width: 100%;
    background: #333;
  }
  
  .nav-list.active {
    display: block;
  }
  
  .nav-toggle {
    display: block;
  }
}

例3: フォームレイアウト

.form-container {
  container-type: inline-size;
  max-width: 600px;
  margin: 0 auto;
}

@container (min-width: 500px) {
  .form-row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1rem;
  }
  
  .form-group.full-width {
    grid-column: 1 / -1;
  }
}

@container (max-width: 499px) {
  .form-row {
    display: block;
  }
  
  .form-group {
    margin-bottom: 1rem;
  }
}

これらの例を参考に、Container Queriesを活用したコンポーネント設計を実践してみてください。

Container Queriesとモダンレイアウトの組み合わせ

Container QueriesはCSS GridやFlexboxと組み合わせることで、より強力なレイアウトシステムを構築できます。

CSS Gridとの組み合わせ

.dashboard {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 1rem;
  container-type: inline-size;
}

.widget {
  container-type: inline-size;
  background: white;
  border-radius: 8px;
  padding: 1rem;
}

/* ウィジェットのサイズに応じたレイアウト調整 */
@container (min-width: 400px) {
  .widget-content {
    display: grid;
    grid-template-columns: auto 1fr;
    gap: 1rem;
    align-items: center;
  }
}

@container (max-width: 399px) {
  .widget-content {
    text-align: center;
  }
  
  .widget-icon {
    margin: 0 auto 0.5rem;
  }
}

Flexboxとの高度な組み合わせ

.layout {
  display: flex;
  gap: 1rem;
  container-type: inline-size;
}

.main-content {
  flex: 1;
  container-type: inline-size;
}

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

/* メインコンテンツの幅に応じた調整 */
@container (min-width: 600px) {
  .article-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 2rem;
  }
}

@container (min-width: 900px) {
  .article-grid {
    grid-template-columns: repeat(3, 1fr);
  }
}

/* サイドバーの幅に応じた調整 */
@container (max-width: 200px) {
  .sidebar-item {
    writing-mode: vertical-rl;
    text-orientation: mixed;
  }
}

入れ子コンテナの活用

.page-container {
  container-type: inline-size;
  max-width: 1200px;
  margin: 0 auto;
}

.content-area {
  container-type: inline-size;
  padding: 1rem;
}

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

/* 各レベルでの最適化 */
@container (min-width: 1000px) {
  .page-container {
    display: grid;
    grid-template-columns: 1fr 300px;
    gap: 2rem;
  }
}

@container (min-width: 700px) {
  .content-area {
    padding: 2rem;
  }
}

@container (min-width: 500px) {
  .article-container {
    columns: 2;
    column-gap: 2rem;
  }
}

このように、Container Queriesとモダンレイアウト技術を組み合わせることで、非常に柔軟で堅牢なレスポンシブデザインを実現できます。

トラブルシューティングとベストプラクティス

Container Queriesを効果的に活用するための注意点とベストプラクティスを紹介します。

よくある問題と解決策

1. ブラウザサポートの確認

/* フィーチャー検出を使用 */
@supports (container-type: inline-size) {
  .container {
    container-type: inline-size;
  }
  
  @container (min-width: 400px) {
    .component {
      /* Container Queries対応ブラウザでのスタイル */
    }
  }
}

/* フォールバック */
@supports not (container-type: inline-size) {
  @media (min-width: 400px) {
    .component {
      /* 従来のメディアクエリでのフォールバック */
    }
  }
}

2. パフォーマンスの最適化

/* 良い例:必要な箇所のみコンテナに */
.main-content {
  container-type: inline-size; /* 必要な要素のみ */
}

/* 避けるべき例:すべての要素をコンテナに */
* {
  container-type: inline-size; /* パフォーマンスに悪影響 */
}

ベストプラクティス

1. 適切なコンテナタイプの選択

/* 横幅のみ監視したい場合 */
.container {
  container-type: inline-size; /* 推奨 */
}

/* 横幅と高さ両方を監視したい場合のみ */
.container {
  container-type: size; /* 必要な場合のみ使用 */
}

2. 意味のある名前付けとコメント

.product-list {
  container-type: inline-size;
  container-name: product-grid; /* 分かりやすい名前 */
}

/* 商品グリッドのレスポンシブ対応 */
@container product-grid (min-width: 600px) {
  .product-card {
    display: flex;
    gap: 1rem;
  }
}

3. 段階的な拡張

/* モバイルファーストアプローチ */
.component {
  /* デフォルト(モバイル)スタイル */
  display: block;
}

@container (min-width: 400px) {
  .component {
    /* タブレット向け */
    display: flex;
  }
}

@container (min-width: 600px) {
  .component {
    /* デスクトップ向け */
    display: grid;
    grid-template-columns: repeat(2, 1fr);
  }
}

デバッグのコツ

/* 開発時のコンテナ可視化 */
.debug {
  container-type: inline-size;
  border: 2px solid red; /* コンテナ境界を可視化 */
  position: relative;
}

.debug::before {
  content: attr(data-container-width); /* JavaScriptで幅を表示 */
  position: absolute;
  top: 0;
  right: 0;
  background: red;
  color: white;
  padding: 0.25rem;
  font-size: 0.75rem;
}

まとめ Container Queriesは2025年現在の最新Web開発において、コンポーネント駆動開発を強力にサポートする技術です。適切に実装することで、保守性と再利用性の高いレスポンシブデザインを実現できます。

これらのベストプラクティスを参考に、ぜひContainer Queriesを活用したモダンなWeb開発に挑戦してみてください。

TH

Tasuke Hub管理人

東証プライム市場上場企業エンジニア

情報系修士卒業後、大手IT企業にてフルスタックエンジニアとして活躍。 Webアプリケーション開発からクラウドインフラ構築まで幅広い技術に精通し、 複数のプロジェクトでリードエンジニアを担当。 技術ブログやオープンソースへの貢献を通じて、日本のIT技術コミュニティに積極的に関わっている。

🎓情報系修士🏢東証プライム上場企業💻フルスタックエンジニア📝技術ブログ執筆者

このトピックはこちらの書籍で勉強するのがおすすめ!

この記事の内容をさらに深く理解したい方におすすめの一冊です。実践的な知識を身につけたい方は、ぜひチェックしてみてください!

おすすめ記事

おすすめコンテンツ