メインコンテンツに移動

コンテナクエリとは?コンポーネント単位のレスポンシブデザインを実現する方法

レスポンシブデザインは、現代のWeb制作やWebアプリ開発において欠かせない考え方です。スマートフォン、タブレット、ノートPC、大型モニターなど、ユーザーが利用する画面サイズは多様化しており、1つの固定レイアウトだけでは快適な表示を提供できません。そのため、これまでのWeb開発では、主にメディアクエリを使って画面幅に応じたスタイル切り替えを行ってきました。

しかし、メディアクエリだけでは対応しにくい場面も増えています。特に、同じカードやウィジェットが、メインカラム、サイドバー、ダッシュボード、モーダル、一覧画面など、異なる幅の領域で再利用される場合です。画面全体の幅は同じでも、コンポーネントが置かれる場所によって実際に使える幅は大きく変わります。このとき、ビューポートだけを基準にしたレスポンシブ設計では、部品ごとの最適な表示を作りにくくなります。

コンテナクエリは、この課題を解決するために登場したCSSの機能です。ページ全体の幅ではなく、コンポーネントを包むコンテナのサイズを基準にしてスタイルを切り替えられるため、UI部品が自分の置かれた場所に応じて見た目を変えられます。これにより、ページ中心ではなく、コンポーネント中心のレスポンシブデザインが実現しやすくなります。

モダンWeb開発では、ReactやVueなどのフレームワーク、デザインシステム、UIライブラリ、Atomic Designのような設計思想が広く使われています。コンテナクエリは、こうしたコンポーネントベースの開発と非常に相性が良い機能です。本記事では、コンテナクエリの基本、メディアクエリとの違い、基本構文、活用例、メリット、注意点、導入ポイントまで体系的に解説します。

1. コンテナクエリとは?

コンテナクエリとは、要素が配置されているコンテナのサイズや条件に応じて、子要素のスタイルを切り替えるCSS機能です。従来のメディアクエリが画面全体の幅を基準にしていたのに対し、コンテナクエリは部品が置かれている領域そのものを基準にできます。そのため、同じコンポーネントでも、広い場所では横並び、狭い場所では縦並びのように柔軟な表示が可能になります。

主な特徴

項目内容
分野CSS
用途レスポンシブ対応
判定基準コンテナサイズ
特徴コンポーネント単位で制御できる
活用UI設計・デザインシステム・管理画面

1.1 コンテナのサイズを基準にスタイルを切り替える

コンテナクエリの基本は、ビューポートではなく、親要素や包み込む要素のサイズを基準にしてスタイルを切り替えることです。たとえば、カードコンポーネントが600px以上の幅を持つ場所に置かれた場合は画像とテキストを横並びにし、300px程度の狭い場所に置かれた場合は縦並びにする、といった調整ができます。

この考え方は、コンポーネントの自律性を高めます。従来は、ページごとに「この画面幅ならカードをこう表示する」と決める必要がありました。しかしコンテナクエリを使えば、カード自身が「自分に与えられた幅に応じて表示を変える」ことができます。これにより、同じ部品をさまざまな場所で再利用しやすくなります。

1.2 コンポーネント単位でレスポンシブ対応できる

コンテナクエリは、コンポーネント単位のレスポンシブ対応に強い機能です。画面全体ではなく、ボタン、カード、ナビゲーション、ウィジェット、サイドバー内の部品など、個別のUI部品ごとに表示を最適化できます。これは、再利用可能なUI部品を多く扱う現代のフロントエンド開発にとって大きなメリットです。

たとえば、同じプロフィールカードを、PC画面のメインエリア、スマートフォン画面、ダッシュボードの小さなウィジェット領域で使う場合を考えます。メディアクエリだけでは、画面幅が同じでも配置場所による幅の違いを扱いにくいですが、コンテナクエリならカードが置かれた領域の幅に応じて見た目を変えられます。

1.3 モジュール化されたUI設計を実現する

コンテナクエリは、モジュール化されたUI設計を実現するための重要な機能です。UI部品が自分自身の表示領域に応じて変化できるため、ページ側で細かく制御しなくても、コンポーネント単体で適切な表示を保ちやすくなります。これは、デザインシステムやUIライブラリを構築する際に非常に役立ちます。

モジュール化されたUIでは、部品の独立性が重要です。あるコンポーネントが特定のページ幅や親レイアウトに強く依存していると、別の画面で再利用しにくくなります。コンテナクエリを使うことで、コンポーネントが自分の置かれた文脈に合わせて調整できるようになり、より柔軟で保守しやすいUI設計が可能になります。

2. コンテナクエリが登場した理由

コンテナクエリが登場した背景には、Web開発がページ単位からコンポーネント単位へ変化したことがあります。以前のWebサイトでは、ページ全体のレイアウトを画面幅ごとに調整するだけでも十分な場合が多くありました。しかし、現在のWebアプリでは、同じUI部品を多くの場所で再利用するため、画面幅だけではなく、部品が置かれる領域の幅を基準にした設計が必要になりました。

2.1 メディアクエリの限界を解決するため

メディアクエリは、ビューポートの幅や高さを基準にスタイルを切り替える便利な機能です。しかし、画面全体の幅だけでは、コンポーネントが実際に利用できる幅を正確に判断できません。たとえば、PC画面であっても、サイドバー内のカードは狭い領域に表示される場合があります。このとき、画面幅が広いからといってカードを横並びにすると、表示が崩れる可能性があります。

コンテナクエリは、この問題を補完します。画面幅ではなく、コンポーネントの親コンテナの幅を基準にできるため、より実際の表示領域に合ったスタイル調整が可能です。メディアクエリがページ全体のレスポンシブ設計に向いているのに対し、コンテナクエリはUI部品単位のレスポンシブ設計に向いています。

2.2 再利用可能なUIを作るため

現代のWeb開発では、再利用可能なUI部品を作ることが重要です。ボタン、カード、フォーム、タブ、モーダル、ダッシュボードウィジェットなどを共通コンポーネントとして作り、複数の画面で使い回します。しかし、同じ部品でも表示される場所によって利用できる幅が異なるため、固定的なスタイルでは対応しにくい場合があります。

コンテナクエリを使うと、コンポーネント自身が配置先のサイズに応じて見た目を変えられるため、再利用性が高まります。ページごとに個別のCSSを書き足す必要が減り、部品そのものにレスポンシブな振る舞いを持たせられます。これは、長期的な保守性やデザインの一貫性にもつながります。

2.3 デザインシステムとの相性を高めるため

デザインシステムでは、共通のUI部品を定義し、プロダクト全体で一貫した体験を提供します。コンポーネントがさまざまな画面やレイアウトで使われるため、部品単位で柔軟に表示を変えられることが重要です。コンテナクエリは、デザインシステムのコンポーネントに自律的なレスポンシブ性を持たせる機能として非常に相性が良いです。

たとえば、同じカードコンポーネントを、商品一覧、関連記事一覧、管理画面、プロフィール表示などで使う場合、それぞれの領域に応じてレイアウトを調整できる必要があります。コンテナクエリを組み込んでおけば、コンポーネントが配置先の幅に応じて自然に変化し、デザインシステム全体の柔軟性を高められます。

3. メディアクエリとの違い

コンテナクエリとメディアクエリは、どちらもレスポンシブデザインを支えるCSS機能ですが、判定基準が異なります。メディアクエリは画面全体、つまりビューポートを基準にします。一方、コンテナクエリは特定のコンテナのサイズを基準にします。この違いによって、使いどころも大きく変わります。

主な比較

項目メディアクエリコンテナクエリ
判定基準ビューポート 
主な対象ページ全体のレイアウト 
得意な用途画面幅ごとの大枠調整 
再利用性コンポーネント単位では限定的 
コンテナクエリの判定基準コンテナサイズ 
コンテナクエリの主な対象UIコンポーネント 
コンテナクエリの得意な用途部品ごとの表示最適化 
コンテナクエリの再利用性高い 

3.1 ビューポート基準の設計

メディアクエリは、ビューポートの幅や高さに応じてスタイルを切り替える機能です。たとえば、画面幅が768px以下ならスマートフォン向けレイアウトにし、1024px以上ならPC向けレイアウトにするといった設計ができます。ページ全体のカラム数、ナビゲーションの表示方法、余白の大きさなどを切り替える場合に向いています。

ただし、ビューポート基準では、コンポーネントが置かれている領域の幅までは分かりません。PC画面であっても、サイドバー内の部品は狭い場合があります。逆に、スマートフォンでも、横向き表示やタブレットに近い幅では部品が広く表示される場合があります。メディアクエリは大枠のレイアウトには強いですが、部品単位の最適化には限界があります。

3.2 コンテナ基準の設計

コンテナクエリは、コンポーネントを包むコンテナのサイズを基準にしてスタイルを切り替えます。たとえば、カードの親コンテナが広い場合は画像とテキストを横並びにし、狭い場合は縦並びにできます。この判断は画面全体の幅ではなく、カードが実際に配置されている領域の幅によって決まります。

この仕組みによって、コンポーネントはより自律的に振る舞えるようになります。ページ側が細かく「この場所ではこう表示する」と指定しなくても、部品自身が与えられたスペースに応じて適切な表示を選べます。これは、コンポーネントベースのUI設計において非常に重要な考え方です。

3.3 UI再利用性の違い

メディアクエリだけでレスポンシブ対応を行う場合、同じコンポーネントでも、ページや配置場所ごとに追加の調整が必要になることがあります。これにより、CSSがページ依存になり、再利用性が低下しやすくなります。特定の画面では正しく表示されても、別の画面に持っていくと崩れるという問題が発生します。

コンテナクエリを使うと、コンポーネントが配置先のサイズに応じて表示を変えられるため、再利用性が高まります。UI部品にレスポンシブな振る舞いを内包できるため、デザインシステムやUIライブラリで使いやすくなります。メディアクエリはページ全体、コンテナクエリは部品単位という役割分担で考えると分かりやすいです。

4. 基本構文

コンテナクエリを使うには、まずクエリ対象となるコンテナを定義し、そのコンテナのサイズに応じて @container でスタイルを切り替えます。基本的な流れは、コンテナを指定する、条件を書く、条件に一致したときのスタイルを書く、という形です。

4.1 コンテナを定義する

コンテナクエリを使うには、対象となる親要素に container-type を指定します。最もよく使われるのは inline-size です。これは、横書きの一般的なWebページでは幅方向を基準にする指定です。コンポーネントの横幅に応じてレイアウトを変えたい場合、多くのケースで inline-size が使われます。

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

この指定を行うことで、.card-wrapper がクエリ対象のコンテナになります。子要素は、このコンテナのサイズに応じてスタイルを切り替えられます。重要なのは、スタイルを変えたい要素そのものではなく、その要素を包むコンテナに container-type を指定することです。

4.2 クエリ条件を設定する

コンテナを定義したら、@container を使って条件を設定します。たとえば、コンテナの幅が500px以上になったときにカードのレイアウトを横並びにする、といった指定ができます。条件はメディアクエリに似ていますが、判定対象がビューポートではなくコンテナである点が異なります。

@container (min-width: 500px) {  .card {    display: grid;    grid-template-columns: 160px 1fr;  } }

この例では、クエリ対象のコンテナが500px以上になった場合、.card の内部レイアウトを2カラムに変更します。画面全体の幅ではなく、カードが置かれている領域の幅に応じて切り替わるため、同じカードを異なる場所で使っても自然に表示を調整できます。

4.3 スタイルを切り替える

コンテナクエリでは、条件に応じてレイアウト、フォントサイズ、余白、表示要素、配置方向などを切り替えられます。たとえば、狭い場所では情報を縦に並べ、広い場所では画像とテキストを横並びにすることで、読みやすさと視認性を両立できます。

.card {  display: grid;  gap: 16px; } @container (min-width: 600px) {  .card {    grid-template-columns: 200px 1fr;    align-items: center;  } }

このように、コンテナクエリはコンポーネントの内部レイアウトを柔軟に切り替えるために使えます。ただし、条件が増えすぎるとCSSが複雑になるため、ブレークポイントは必要最小限にすることが重要です。コンポーネントごとに「どの幅で本当に表示を変える必要があるのか」を考えて設計するべきです。

5. container-typeとは?

container-type は、要素をコンテナクエリの対象として扱うためのCSSプロパティです。コンテナクエリを使うには、まずどの要素をコンテナとして監視するのかをブラウザに伝える必要があります。その役割を持つのが container-type です。

主な特徴

項目内容
用途コンテナ指定
役割クエリ対象化
活用レスポンシブ設計
代表値inline-size, size
よく使う場面コンポーネントの親要素

5.1 インラインサイズを指定する

container-type: inline-size; は、コンテナのインライン方向のサイズを基準にする指定です。横書きの一般的なWebページでは、インライン方向は横幅を意味します。そのため、ほとんどのレスポンシブUIでは、コンテナの横幅を基準にしたい場面が多く、inline-size がよく使われます。

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

この指定により、.product-card-container の幅を基準にして、その中にある商品カードのレイアウトを変えられます。画面幅ではなく、商品カードが置かれている領域の幅を見て判断できるため、一覧画面、サイドバー、関連商品枠などで同じカードを再利用しやすくなります。

5.2 サイズ監視を有効化する

container-type を指定すると、ブラウザはその要素をクエリ対象のコンテナとして扱います。つまり、その要素のサイズに基づいて、子要素のスタイルを切り替える準備ができます。コンテナクエリが動かない場合、多くはこのコンテナ指定を忘れていることが原因です。

コンテナクエリは、単に @container を書くだけでは動作しません。どの要素を基準にするのかを明示する必要があります。実装時には、コンポーネントのどの外側要素をコンテナにするのかを設計し、その要素に container-type を指定する流れを意識することが重要です。

5.3 クエリ判定を可能にする

container-type は、@container の条件判定を可能にするための前提です。たとえば、コンテナの幅が400px以上なら詳細情報を表示し、400px未満なら簡略表示にするといった制御ができます。これにより、コンポーネントは配置場所に応じて最適な情報量を表示できます。

ただし、すべての親要素に無差別に container-type を指定する必要はありません。必要なコンポーネントの外側にだけ設定する方が管理しやすくなります。どの要素をコンテナにするかは、コンポーネント設計の一部として考えるべきです。

6. @containerとは?

@container は、コンテナの条件に応じてCSSを適用するためのアットルールです。メディアクエリの @media に似ていますが、判定対象はビューポートではなく、指定されたコンテナです。コンテナクエリの中心となる構文です。

主な特徴

項目内容
用途条件分岐
特徴コンテナ基準
活用UI変更
比較対象@media
主な役割コンポーネント内のレスポンシブ制御

6.1 条件に応じてスタイルを変更する

@container を使うと、コンテナのサイズが条件に一致したときだけ特定のスタイルを適用できます。たとえば、コンテナが広いときにグリッドレイアウトへ切り替えたり、文字サイズや余白を大きくしたりできます。これにより、部品が置かれた領域に応じて自然に見た目を調整できます。

@container (min-width: 480px) {  .profile-card {    grid-template-columns: 96px 1fr;  } }

このような条件分岐は、コンポーネントの表示を柔軟にするために使います。特に、狭い領域では情報を縦に積み、広い領域では横に並べるような切り替えに向いています。メディアクエリでは画面幅に依存していた処理を、より部品単位で扱えるようになります。

6.2 コンポーネントごとに制御する

@container は、コンポーネントごとの表示制御に向いています。カード、ウィジェット、リスト項目、フォームブロックなど、同じ部品がさまざまな場所で使われる場合、それぞれのコンテナサイズに応じてスタイルを変えられます。これにより、ページ側のレイアウトに強く依存しないUIを作れます。

コンポーネントごとに制御できることは、デザインシステムやUIライブラリにとって大きなメリットです。ライブラリ側でコンテナクエリを組み込んでおけば、利用する画面側が細かいレスポンシブ対応を書かなくても、部品が自動的に適切な表示へ変化します。

6.3 柔軟なレイアウトを実現する

@container を使うことで、より柔軟なレイアウトを実現できます。画面全体のブレークポイントだけではなく、部品ごとのブレークポイントを設定できるため、複雑な画面でも表示崩れを防ぎやすくなります。特に、管理画面やダッシュボードのように複数の領域が並ぶUIで効果的です。

ただし、コンポーネントごとにブレークポイントを作りすぎると、CSS全体の設計が複雑になります。どの幅で表示を変えるべきかは、見た目の都合だけでなく、情報の読みやすさや操作性を基準に決めることが重要です。柔軟さとシンプルさのバランスを取る必要があります。

7. カードUIとの相性

コンテナクエリは、カードUIと非常に相性が良い機能です。カードは商品、記事、プロフィール、通知、統計情報など、さまざまな情報をまとめて表示する汎用的なコンポーネントです。同じカードでも配置場所によって横幅が大きく変わるため、コンテナクエリを使うメリットが分かりやすいUIです。

7.1 横幅に応じて構成を変更する

カードUIでは、狭い幅では画像、タイトル、本文、ボタンを縦に並べ、広い幅では画像を左、本文を右に配置するような切り替えがよくあります。メディアクエリだけでは、カードが実際に置かれている領域の幅を見られませんが、コンテナクエリならカードの親コンテナの幅に応じて構成を変えられます。

.card-container {  container-type: inline-size; } .card {  display: grid;  gap: 16px; } @container (min-width: 520px) {  .card {    grid-template-columns: 180px 1fr;  } }

このようにすると、同じカードでも、狭い場所では縦型、広い場所では横型として表示できます。カードを一覧、サイドバー、詳細ページ、関連コンテンツ枠などで再利用する場合に便利です。

7.2 情報量を最適化する

カードUIでは、コンテナの幅に応じて表示する情報量を調整できます。狭いカードでは説明文を短くしたり、補助情報を非表示にしたり、広いカードでは詳細な説明や追加ボタンを表示したりできます。これにより、限られたスペースでも情報が詰まりすぎないようにできます。

情報量の最適化は、ユーザー体験に直結します。狭い領域に多くの情報を詰め込むと読みにくくなり、広い領域で情報が少なすぎると余白が不自然になります。コンテナクエリを使うことで、カードが置かれたサイズに応じて、読みやすい情報量へ調整しやすくなります。

7.3 再利用しやすい設計にする

カードUIは再利用されることが多いため、配置場所に依存しない設計が重要です。コンテナクエリを使えば、カード自身がコンテナ幅に応じてレイアウトを変えられるため、ページごとに個別のCSSを書き足す必要が減ります。これにより、カードコンポーネントの再利用性が高まります。

再利用しやすいカードを作るには、コンポーネント内部の構造も整理する必要があります。画像、本文、アクション、メタ情報などを明確に分け、コンテナクエリでどの部分を切り替えるのかを決めます。単に幅で見た目を変えるだけでなく、情報設計として自然な構成にすることが重要です。

8. ダッシュボードとの相性

ダッシュボードは、コンテナクエリが特に効果を発揮しやすい画面です。ダッシュボードでは、グラフ、数値カード、通知、テーブル、フィルター、サイドパネルなど、さまざまなウィジェットが限られたスペースに配置されます。各ウィジェットが自分の領域に応じて見た目を調整できると、画面全体の使いやすさが向上します。

8.1 ウィジェット単位で調整できる

ダッシュボードでは、同じウィジェットが広いグリッド領域に置かれる場合もあれば、狭いサイドカラムに置かれる場合もあります。コンテナクエリを使えば、ウィジェットごとに横幅を判定し、表示内容やレイアウトを調整できます。たとえば、広い場合はグラフと詳細数値を並べ、狭い場合は主要数値だけを表示できます。

このようなウィジェット単位の調整は、ダッシュボードの情報密度を適切に保つために重要です。画面全体の幅だけで判断すると、個々のウィジェットの実際の幅に合わない表示になることがあります。コンテナクエリを使うことで、各ウィジェットが自分の表示領域に合わせて最適化できます。

8.2 複雑な画面に対応できる

ダッシュボードは、一般的なLPや記事ページよりも画面構成が複雑です。複数カラム、可変グリッド、折りたたみサイドバー、フィルターパネル、レスポンシブなテーブルなどが組み合わさるため、メディアクエリだけでは管理が難しくなることがあります。コンテナクエリは、この複雑さを部品単位に分解して扱えるようにします。

たとえば、サイドバーが開いているときと閉じているときで、同じグラフウィジェットの幅が変わる場合があります。メディアクエリでは画面幅が変わらないため、この変化を扱いにくいですが、コンテナクエリならウィジェットの実際の幅に応じて表示を調整できます。

8.3 表示崩れを防止できる

ダッシュボードでは、表示崩れが業務効率に影響します。数値が読みにくい、グラフが潰れる、ボタンが重なる、テーブルがはみ出すといった問題は、ユーザーの判断や操作を妨げます。コンテナクエリを使うことで、各部品が狭くなったときに表示方法を切り替え、崩れを防ぎやすくなります。

ただし、表示崩れを防ぐには、コンテナクエリだけでなく、情報の優先順位付けも必要です。狭い領域にすべての情報を表示しようとすると、結局読みにくくなります。重要な情報を残し、補助情報を折りたたむ、別表示にする、詳細ページへ誘導するなどの設計が重要です。

9. デザインシステムとの関係

コンテナクエリは、デザインシステムと非常に相性が良い機能です。デザインシステムでは、共通コンポーネントを複数の画面やプロダクトで再利用します。そのため、コンポーネントが配置される場所に応じて柔軟に変化できることが重要になります。

9.1 コンポーネント設計を強化する

コンテナクエリをデザインシステムに組み込むと、コンポーネント設計を強化できます。ボタン、カード、フォーム、ナビゲーション、ウィジェットなどが、それぞれ自分の表示領域に応じて最適な見た目を選べるようになります。これにより、コンポーネントの独立性が高まります。

デザインシステムの理想は、利用者が部品を配置するだけで、ある程度自然に整ったUIになることです。コンテナクエリを使えば、コンポーネント側にレスポンシブな振る舞いを内包できるため、画面ごとの個別調整を減らせます。結果として、実装者の負担も軽減できます。

9.2 一貫性を維持する

デザインシステムでは、UIの一貫性が重要です。コンテナクエリを使うことで、各コンポーネントの表示切り替えルールを共通化しやすくなります。たとえば、カードは一定幅以上で横型、一定幅未満で縦型にする、といったルールをコンポーネント内に持たせられます。

一貫性があると、ユーザーは画面が変わっても操作や情報構造を理解しやすくなります。逆に、同じ種類のカードがページごとに異なる条件で変化すると、体験が不安定になります。コンテナクエリを使う場合でも、デザインシステム内でブレークポイントや表示ルールを整理することが重要です。

9.3 スケーラブルなUIを構築する

コンテナクエリは、スケーラブルなUI構築にも役立ちます。新しい画面やレイアウトが追加されても、コンポーネント側がサイズに応じて適応できれば、追加のCSS調整を最小限にできます。これは、プロダクトが成長するほど大きなメリットになります。

ただし、スケーラブルなUIを作るには、コンテナクエリだけでなく、デザイントークン、コンポーネント命名、状態管理、アクセシビリティ、ドキュメント整備も必要です。コンテナクエリは強力な機能ですが、デザインシステム全体の設計方針と組み合わせて使うことで最大の効果を発揮します。

10. Atomic Designとの関係

Atomic Designは、UIをAtom、Molecule、Organismなどの階層で整理する設計思想です。コンテナクエリは、このような階層的なUI設計と相性があります。特に、MoleculeやOrganismのように複数要素を含む部品では、コンテナサイズに応じた表示切り替えが役立ちます。

10.1 Atom単位で活用する

Atomは、ボタン、入力欄、ラベル、アイコンなどの最小単位のUI部品です。Atom単位では、コンテナクエリを大きく使う場面は少ないかもしれませんが、特定の幅に応じてラベル表示やアイコン配置を変えるようなケースでは役立ちます。小さな部品でも、表示領域に応じた調整が必要な場合があります。

ただし、Atomはできるだけシンプルに保つことが重要です。コンテナクエリを多用しすぎると、最小単位の部品が複雑になり、再利用しにくくなる場合があります。Atomでは、状態やサイズバリエーションを最小限に整理し、必要な場合だけコンテナクエリを使うのが良い設計です。

10.2 Molecule設計を整理する

Moleculeは、複数のAtomを組み合わせたUI部品です。検索フォーム、カード、入力グループ、メディアオブジェクトなどが該当します。Moleculeでは、コンテナの幅に応じて内部要素の並びを変える場面が多いため、コンテナクエリが特に有効です。

たとえば、検索フォームが広い場合は入力欄とボタンを横並びにし、狭い場合は縦並びにできます。このような調整をコンポーネント自身に持たせることで、ページ側のCSSに依存しないMoleculeを作れます。Atomic Designにおいて、Moleculeの独立性を高める機能としてコンテナクエリは役立ちます。

10.3 Organismの再利用性を高める

Organismは、ヘッダー、商品一覧、コメント欄、ダッシュボードパネルなど、複数のMoleculeやAtomで構成される大きめのUI部品です。Organismは配置される場所や画面構成によって幅が大きく変わるため、コンテナクエリによる柔軟な対応が重要になります。

Organismにコンテナクエリを使うと、内部のグリッド数、表示項目、余白、並び順をコンテナ幅に応じて切り替えられます。これにより、同じOrganismを複数の画面で再利用しやすくなります。ただし、Organismは複雑になりやすいため、ブレークポイントや表示条件を整理しておくことが重要です。

11. UIライブラリとの関係

コンテナクエリは、UIライブラリの品質を高める機能としても重要です。UIライブラリでは、ボタン、カード、テーブル、モーダル、タブ、グリッドなど、多くのコンポーネントを再利用可能な形で提供します。コンテナクエリを使うことで、これらの部品が配置先に応じて自然に変化できます。

11.1 再利用性を向上する

UIライブラリのコンポーネントは、利用される場所を事前に完全には予測できません。メイン画面で使われることもあれば、サイドバー、モーダル、狭いカード内で使われることもあります。コンテナクエリを組み込むことで、コンポーネントが自分の幅に応じて表示を調整できるため、再利用性が向上します。

再利用性が高いUIライブラリは、プロジェクト全体の開発効率を上げます。各画面で個別にCSSを書かなくても、ライブラリ側のコンポーネントが適切に振る舞うためです。コンテナクエリは、UIライブラリをより実用的で柔軟なものにするための重要な機能です。

11.2 レスポンシブ対応を簡略化する

従来のUIライブラリでは、レスポンシブ対応を行うために、画面側でクラスを追加したり、プロパティでレイアウトを指定したりする必要がある場合がありました。コンテナクエリを使えば、コンポーネント側でサイズに応じた切り替えを実装できるため、利用者側の指定を減らせます。

これにより、UIライブラリを使う開発者は、細かいレスポンシブ調整に悩まされにくくなります。もちろん、すべてを自動化するのではなく、必要に応じて明示的な設定もできるようにするのが理想です。コンテナクエリは、デフォルトの振る舞いを賢くするための機能として有効です。

11.3 保守性を高める

UIライブラリにコンテナクエリを取り入れると、レスポンシブ対応のロジックをコンポーネント内に集約できます。これにより、画面ごとに散らばったCSSを減らし、ライブラリ側で一貫した管理ができます。修正が必要な場合も、コンポーネント単位で対応しやすくなります。

ただし、ライブラリ側に複雑な条件を入れすぎると、利用者にとって挙動が分かりにくくなる場合があります。どの幅で何が変わるのかをドキュメント化し、プレビューや使用例を用意することが重要です。保守性を高めるには、実装だけでなく、使う人が理解しやすい設計が必要です。

12. Reactとの関係

ReactはコンポーネントベースのUI開発を行うため、コンテナクエリと相性が良いフレームワークです。Reactコンポーネントが自分の表示領域に応じてスタイルを変えられるようになると、プロパティや親コンポーネントへの依存を減らしやすくなります。

12.1 コンポーネント設計と相性が良い

Reactでは、UIを小さなコンポーネントに分けて開発します。コンテナクエリを使うと、各コンポーネントが自分の幅を基準にしてレイアウトを変えられるため、Reactの設計思想とよく合います。親コンポーネントが画面幅を判断して子に状態を渡すような処理を減らせる場合があります。

たとえば、カードコンポーネントに「横型」「縦型」をプロパティで渡すのではなく、カードが置かれたコンテナ幅に応じて自動的に切り替える設計ができます。これにより、React側のロジックを単純にし、スタイルの責務をCSSへ戻すことができます。

12.2 Props依存を減らせる

Reactでレスポンシブ対応を行う場合、親コンポーネントが画面状態を判定し、子コンポーネントへプロパティを渡す実装になることがあります。しかし、表示幅に応じた単純なレイアウト変更であれば、JavaScriptで管理するよりCSSに任せた方が自然です。コンテナクエリは、このようなプロパティ依存を減らすのに役立ちます。

プロパティ依存を減らすと、コンポーネントの利用が簡単になります。利用者は「この場所ではcompactをtrueにするべきか」と悩む必要がなく、コンポーネントを配置するだけで自然に調整されます。ただし、意味的に重要な表示切り替えはプロパティで明示した方が良い場合もあるため、CSSに任せる部分とJavaScriptで制御する部分を分けることが重要です。

12.3 UI管理を効率化できる

Reactとコンテナクエリを組み合わせることで、UI管理を効率化できます。レイアウトに関する処理をCSS側に寄せることで、Reactコンポーネントのロジックをシンプルにできます。状態管理やデータ処理と、見た目のレスポンシブ制御を分離しやすくなります。

ただし、ReactプロジェクトではCSS Modules、CSS-in-JS、Tailwind CSS、通常のCSSなど、スタイル管理方法が複数あります。コンテナクエリをどの方法で使うかは、プロジェクトの方針に合わせる必要があります。重要なのは、コンテナクエリを導入することで、UIの責務が分かりやすくなるかどうかです。

13. Vueとの関係

Vueもコンポーネントベースのフレームワークであり、コンテナクエリとの相性が良いです。Vueの単一ファイルコンポーネントでは、テンプレート、ロジック、スタイルを近い場所で管理できるため、コンポーネント内にコンテナクエリを組み込みやすい構成です。

13.1 UI部品を独立管理できる

Vueでは、UI部品をコンポーネントとして独立管理します。コンテナクエリを使うと、そのコンポーネントが置かれた幅に応じてレイアウトを変えられるため、親コンポーネントへの依存を減らせます。これは、再利用可能なVueコンポーネントを作るうえで大きなメリットです。

たとえば、同じ商品カードコンポーネントを一覧画面、詳細画面の関連商品欄、サイドバーのおすすめ枠で使う場合、配置先ごとに親から表示モードを渡すのではなく、コンテナクエリで自動調整できます。これにより、コンポーネントの利用が簡単になります。

13.2 レスポンシブ設計を簡潔にできる

Vueの単一ファイルコンポーネントでは、スタイルをコンポーネント内に書けます。コンテナクエリを使うと、そのコンポーネントのレスポンシブ設計を同じファイル内で整理できます。テンプレート構造とスタイルの関係が近くなるため、修正時の理解もしやすくなります。

ただし、単一ファイルにすべてを書きすぎると、コンポーネントが大きくなりすぎる場合があります。コンテナクエリを使っても、UI構造が複雑な場合は子コンポーネントへ分割することが重要です。CSSだけで複雑さを吸収しようとせず、Vueコンポーネントの設計も合わせて整理する必要があります。

13.3 コンポーネント再利用を促進する

コンテナクエリは、Vueコンポーネントの再利用を促進します。コンポーネントが自分の表示領域に応じて柔軟に変化できれば、親側の条件分岐や追加CSSを減らせます。結果として、部品をさまざまな画面に配置しやすくなります。

再利用性を高めるには、コンテナクエリのブレークポイントをコンポーネントの表示上の意味に基づいて決めることが重要です。画面幅の都合ではなく、「この幅なら情報を横並びにしても読める」「この幅なら補助情報を表示しても邪魔にならない」といった観点で設計するべきです。

14. コンテナクエリのメリット

コンテナクエリのメリットは、コンポーネント単位でレスポンシブ設計ができること、UI部品の再利用性が高まること、CSSの保守性を向上しやすいことです。特に、複数の画面で同じ部品を使うWebアプリでは、大きな効果を発揮します。

14.1 コンポーネント単位で設計できる

コンテナクエリを使うと、ページ全体ではなく、コンポーネント単位で表示を調整できます。これは、UI部品を独立した単位として考える現代のフロントエンド開発に合っています。コンポーネントが自分のコンテナ幅に応じてレイアウトを変えられるため、親ページへの依存が少なくなります。

このメリットは、管理画面やSaaSのような複雑なUIで特に大きくなります。同じ部品がさまざまな場所に置かれる場合、画面全体の幅だけでは最適な表示を判断できません。コンテナクエリにより、部品単位で自然なレスポンシブ対応が可能になります。

14.2 再利用性が向上する

コンテナクエリは、UI部品の再利用性を高めます。コンポーネント自身が配置先のサイズに応じて表示を変えられるため、別の画面に持っていっても崩れにくくなります。ページごとに専用の調整CSSを書く必要が減り、共通コンポーネントとして運用しやすくなります。

再利用性が高まると、開発効率も上がります。新しい画面を作るときに、既存コンポーネントを安心して使えるからです。また、同じ部品を複数の場所で使っても、一貫した表示ルールを保てるため、デザイン品質も安定しやすくなります。

14.3 保守性を高められる

コンテナクエリを使うと、レスポンシブ対応のロジックをコンポーネント内に集約できます。これにより、ページごとに散らばったCSSを減らし、部品単位で保守しやすくなります。変更が必要な場合も、該当コンポーネントのCSSを確認すればよいため、影響範囲を把握しやすくなります。

ただし、保守性を高めるには、コンテナクエリを整理して使う必要があります。無計画に条件を増やすと、逆にCSSが複雑になります。コンポーネントごとのブレークポイント、命名、ファイル構成、デザインルールを整備しておくことが重要です。

15. コンテナクエリのデメリット

コンテナクエリは便利な機能ですが、導入すれば自動的にCSS設計が良くなるわけではありません。学習コスト、既存設計からの移行、ルール整備などの課題があります。特に、メディアクエリに慣れているチームでは、考え方の切り替えが必要になります。

15.1 学習コストがある

コンテナクエリは、メディアクエリと似た構文を持っていますが、考え方は異なります。どの要素をコンテナにするのか、どの子要素にスタイルを適用するのか、コンテナ幅に応じて何を変えるのかを理解する必要があります。特に、初めて使う場合は、container-type の指定を忘れやすいです。

学習コストを下げるには、カードUIやウィジェットのような分かりやすい部品から試すのがおすすめです。小さな例で動作を理解してから、デザインシステムや大規模画面へ広げると導入しやすくなります。いきなり全体へ適用するより、段階的に学習する方が安全です。

15.2 従来設計からの移行が必要になる

既存プロジェクトでは、メディアクエリを中心にレスポンシブ設計が組まれている場合が多くあります。そのような環境にコンテナクエリを導入する場合、どこをメディアクエリで管理し、どこをコンテナクエリへ移すのかを整理する必要があります。単純に置き換えるだけでは、設計が混乱する可能性があります。

移行では、まず再利用頻度が高く、配置場所によって幅が変わるコンポーネントから対応するのが現実的です。ページ全体のレイアウトはメディアクエリのままにし、カードやウィジェットのような部品単位の調整にコンテナクエリを使うと、役割分担が明確になります。

15.3 設計ルールを整理する必要がある

コンテナクエリをチームで使う場合、設計ルールが必要です。どの要素をコンテナにするか、ブレークポイントをどのように決めるか、メディアクエリとどう使い分けるか、デザインシステムにどう組み込むかを決めておかないと、コードの一貫性が失われます。

ルールがないまま導入すると、あるコンポーネントではコンテナクエリ、別のコンポーネントではメディアクエリ、さらに別の場所ではJavaScriptで幅判定、というように設計がバラバラになる可能性があります。コンテナクエリを導入するなら、コーディング規約やコンポーネント設計方針とセットで考えるべきです。

16. よくある活用例

コンテナクエリは、コンポーネントの表示領域に応じて見た目を変えたい場面で効果を発揮します。特に、カードコンポーネント、商品一覧、管理画面のように、同じUI部品が複数の幅で使われるケースに向いています。

16.1 カードコンポーネント

カードコンポーネントは、コンテナクエリの代表的な活用例です。狭い幅では画像、タイトル、説明文、ボタンを縦に並べ、広い幅では画像を左、テキストを右に配置できます。同じカードをサイドバー、一覧ページ、詳細ページで使っても、コンテナ幅に応じて自然に表示を調整できます。

カードは情報のまとまりを表現するUIなので、読みやすさが重要です。狭い幅で無理に横並びにすると文字が詰まり、広い幅で縦並びのままだと余白が多く見える場合があります。コンテナクエリを使えば、カードの幅に応じて情報配置を最適化できます。

16.2 商品一覧

ECサイトの商品一覧でも、コンテナクエリは有効です。商品カードは、グリッドの列数や表示領域によって幅が変わります。コンテナクエリを使えば、商品カードの幅に応じて、画像サイズ、商品名の行数、価格表示、ボタン配置などを調整できます。

商品一覧では、視認性と操作性のバランスが重要です。狭いカードに情報を詰め込みすぎると比較しにくくなり、広いカードで情報が少なすぎると購買判断に必要な情報が不足します。コンテナクエリによって、カード幅に応じた適切な情報量を設計できます。

16.3 管理画面

管理画面では、テーブル、カード、グラフ、フィルター、ステータス表示など、多くのUI部品が並びます。画面サイズだけでなく、サイドバーの開閉やパネル配置によって各部品の幅が変わるため、メディアクエリだけでは対応しにくい場合があります。コンテナクエリは、管理画面のような複雑なUIに向いています。

たとえば、広いグラフカードでは凡例や詳細数値を表示し、狭いカードでは主要指標だけを表示するような調整ができます。各ウィジェットが自分の幅に応じて表示を変えられるため、管理画面全体の情報密度と読みやすさを両立しやすくなります。

17. よくある失敗

コンテナクエリでよくある失敗は、メディアクエリとの役割分担が曖昧になること、コンテナ設定を忘れること、条件を増やしすぎて設計が複雑になることです。便利な機能ですが、使いどころを整理しないとCSS全体が分かりにくくなります。

17.1 メディアクエリと役割が重複する

コンテナクエリを導入すると、すべてをコンテナクエリで書き換えたくなる場合があります。しかし、ページ全体のレイアウト調整にはメディアクエリが向いています。たとえば、ヘッダー全体の切り替え、ページのカラム構成、グローバルナビゲーションの表示変更などは、ビューポート基準で考えた方が自然な場合が多いです。

コンテナクエリは、メディアクエリの完全な代替ではありません。メディアクエリはページ全体の大枠、コンテナクエリは部品単位の調整という役割分担が基本です。この整理をせずに使うと、どちらの条件でスタイルが変わっているのか分かりにくくなります。

17.2 コンテナ設定を忘れる

コンテナクエリが動かない原因として多いのが、container-type の指定忘れです。@container を書いても、対象となるコンテナが定義されていなければ、期待通りにスタイルが適用されません。特に、初めてコンテナクエリを使う場合は、この点でつまずきやすいです。

実装時には、まず「どの要素を基準にするのか」を決め、その要素に container-type: inline-size; を指定します。そのうえで、子要素に対して @container の条件を設定します。コンテナクエリでは、基準となる親要素の設計が非常に重要です。

17.3 設計が複雑化する

コンテナクエリは柔軟ですが、条件を増やしすぎるとCSSが複雑になります。コンポーネントごとに多数のブレークポイントを設定すると、どの幅で何が変わるのか把握しにくくなります。これは、保守性の低下につながります。

設計を複雑にしないためには、表示切り替えの条件を必要最小限にすることが重要です。細かく幅を分けるのではなく、狭い・標準・広い程度の意味ある段階で設計すると管理しやすくなります。また、ブレークポイントは見た目の都合だけでなく、情報が読みやすくなるかどうかを基準に決めるべきです。

18. モダンCSSとの関係

コンテナクエリは、モダンCSSの重要な機能の一つです。近年のCSSは、CSSネスト、デザイントークンに近いカスタムプロパティ、カスケードレイヤー、サブグリッドなど、より設計しやすい方向へ進化しています。コンテナクエリは、その中でもコンポーネント単位のレスポンシブ設計を支える機能です。

18.1 CSSネストと組み合わせる

CSSネストとコンテナクエリを組み合わせると、コンポーネント単位のCSSをより整理しやすくなります。コンポーネント本体、内部要素、状態、コンテナ条件を近い場所で管理できるため、スタイルの関係性が分かりやすくなります。特に、小〜中規模のUI部品では相性が良い組み合わせです。

ただし、CSSネストとコンテナクエリを同時に使う場合、CSSが深くなりすぎないように注意が必要です。ネストの中にコンテナクエリを重ね、さらに状態セレクターを重ねると、読みにくいコードになりやすいです。構造を整理するために使う機能が、逆に複雑さを増やさないようにする必要があります。

18.2 デザイントークンと組み合わせる

デザイントークンは、色、余白、フォントサイズ、角丸、影などのデザイン値を一元管理する考え方です。CSSではカスタムプロパティを使って、トークンのように値を管理できます。コンテナクエリと組み合わせることで、コンテナ幅に応じて余白やフォントサイズを調整しながら、一貫したデザイン値を使えます。

たとえば、狭いカードでは小さめの余白、広いカードでは大きめの余白を使う場合でも、値を直接書き散らすのではなく、デザイントークンを使うと統一感を保てます。コンテナクエリは表示条件を制御し、デザイントークンはデザインの一貫性を保つ役割を持ちます。

18.3 カスケードレイヤーと組み合わせる

カスケードレイヤーは、CSSの優先順位をレイヤー単位で管理するための機能です。大規模なCSSでは、どのスタイルがどのスタイルを上書きするのかが複雑になりやすいため、レイヤー管理が役立ちます。コンテナクエリを含むコンポーネントCSSも、レイヤー設計の中に組み込むことで管理しやすくなります。

たとえば、リセットCSS、ベーススタイル、コンポーネント、ユーティリティ、上書き用スタイルをレイヤーで分けると、コンテナクエリのスタイルがどの位置にあるのか分かりやすくなります。コンテナクエリ単体ではなく、CSS全体の設計方針の中で扱うことが重要です。

19. コンテナクエリ導入のポイント

コンテナクエリを導入する際は、いきなり全体に適用するのではなく、小さなコンポーネントから始めるのが現実的です。既存のメディアクエリ設計と混在する場合も多いため、役割分担を整理しながら段階的に導入することが重要です。

19.1 小さなコンポーネントから始める

コンテナクエリを最初に導入するなら、カード、プロフィール表示、商品カード、ウィジェットなど、小さくて再利用されやすいコンポーネントから始めるのがおすすめです。これらはコンテナ幅による表示切り替えの効果が分かりやすく、導入リスクも比較的低いです。

小さな部品で成功パターンを作ると、チーム内で使い方を共有しやすくなります。どの要素に container-type を指定するのか、どの幅で切り替えるのか、メディアクエリとどう分けるのかを実例で確認できます。最初から大規模画面全体へ導入するより、安全で学習しやすい方法です。

19.2 デザインシステムへ組み込む

コンテナクエリは、デザインシステムへ組み込むことで効果を発揮します。共通コンポーネントにレスポンシブな振る舞いを持たせておけば、利用する画面側で細かい調整をしなくても、自然に表示が整いやすくなります。これは、プロダクト全体のUI品質を安定させるうえで有効です。

ただし、デザインシステムへ組み込む場合は、ブレークポイントや表示ルールを明文化する必要があります。どの幅でレイアウトが変わるのか、どの情報が表示・非表示になるのかをドキュメント化しておくと、開発者やデザイナーが理解しやすくなります。

19.3 チームルールを整備する

コンテナクエリをチームで使う場合は、ルール整備が重要です。コンテナの命名、container-type の指定場所、ブレークポイントの考え方、メディアクエリとの役割分担、CSSファイル構成などを決めておくと、コードの一貫性が保ちやすくなります。

チームルールがないと、開発者ごとに書き方が異なり、後から保守しにくくなります。コンテナクエリは便利な機能ですが、自由に使いすぎると設計が分散します。導入時には、良い例と避けるべき例をセットで共有することが大切です。

20. コンテナクエリが変えるUI開発

コンテナクエリは、UI開発の考え方をページ中心からコンポーネント中心へ変える機能です。これまでのレスポンシブデザインは、画面幅を基準にページ全体を調整する考え方が中心でした。コンテナクエリによって、UI部品が自分自身の配置領域に応じて変化できるようになります。

20.1 ページ中心設計から脱却する

従来のレスポンシブ設計では、ページ全体のブレークポイントを決め、その画面幅に合わせて各部品の表示を調整していました。この方法は今でも有効ですが、コンポーネントが増えるほどページごとの調整が複雑になります。コンテナクエリは、このページ中心の設計から一歩進んだ考え方を提供します。

ページ全体ではなく、部品ごとに表示を最適化できるため、コンポーネントの独立性が高まります。これにより、新しい画面を作るときにも、既存部品を配置するだけで自然に表示が整いやすくなります。ページ中心のCSSから、部品中心のCSSへ移行するうえで重要な機能です。

20.2 コンポーネント中心設計を推進する

コンテナクエリは、コンポーネント中心設計を強く後押しします。コンポーネントが自分の表示領域に応じて変化できるため、親ページや画面全体の幅に依存しすぎない設計が可能になります。これは、React、Vue、デザインシステム、UIライブラリのような現代的な開発スタイルと非常に相性が良いです。

コンポーネント中心設計では、部品の責務を明確にすることが重要です。コンテナクエリは、その責務の中にレスポンシブな表示調整を含めることを可能にします。結果として、UI部品はより賢く、再利用しやすく、保守しやすいものになります。

20.3 モダンフロントエンドの標準機能として定着している

コンテナクエリは、モダンフロントエンド開発における重要なCSS機能として定着しつつあります。メディアクエリだけでは難しかったコンポーネント単位のレスポンシブ対応を実現できるため、今後のUI設計では理解しておきたい機能です。特に、デザインシステムや複雑なWebアプリでは重要性が高まります。

今後のCSS設計では、メディアクエリ、コンテナクエリ、CSSネスト、デザイントークン、カスケードレイヤーなどを組み合わせることが一般的になっていくでしょう。コンテナクエリはその中でも、コンポーネント単位の適応性を支える中心的な役割を持ちます。単なる新機能ではなく、UI開発の設計思想を変える機能だと言えます。

おわりに

コンテナクエリは、コンテナのサイズを基準にスタイルを切り替えるCSS機能です。従来のメディアクエリがビューポートを基準にしていたのに対し、コンテナクエリはコンポーネントが実際に置かれている領域を基準にできます。これにより、同じUI部品でも、広い場所では横並び、狭い場所では縦並びのように自然な表示切り替えが可能になります。

メディアクエリは今後もページ全体のレスポンシブ設計に必要ですが、コンポーネント単位の調整ではコンテナクエリが大きな力を発揮します。特に、カードUI、商品一覧、ダッシュボード、管理画面、デザインシステム、UIライブラリのように、同じ部品を複数の場所で使う場合に有効です。

一方で、コンテナクエリを使うには、container-type の指定、@container の条件設計、メディアクエリとの役割分担を理解する必要があります。便利だからといって無計画に導入すると、CSSが複雑になる可能性もあります。小さなコンポーネントから始め、チームルールを整えながら段階的に導入することが重要です。

モダンCSSにおいて、コンテナクエリは非常に重要な機能の一つです。ページ中心のレスポンシブ設計から、コンポーネント中心のレスポンシブ設計へ進むための大きな一歩だと言えます。今後のフロントエンド開発では、メディアクエリとコンテナクエリを適切に使い分け、再利用しやすく保守しやすいUIを設計する力がますます重要になるでしょう。

LINE Chat