



WithCodeMedia-1-pc
WithCodeMedia-2-pc
WithCodeMedia-3-pc
WithCodeMedia-4-pc




WithCodeMedia-1-sp
WithCodeMedia-2-sp
WithCodeMedia-3-sp
WithCodeMedia-4-sp









生徒先生、メディアクエリだとサイドバーに配置したカードのレイアウトが崩れてしまいます…もっと柔軟にスタイルを切り替える方法はありませんか?



よーく聞くんだぞ。今日はコンテナクエリについて詳しく解説するぞい!親要素のサイズに応じてスタイルを切り替える最新のCSS機能じゃ!



そういう機能もあるんですね!ぜひ教えてください!
レスポンシブデザインの実装において、メディアクエリはビューポート全体のサイズを基準にスタイルを切り替えます。しかし、サイドバーとメインエリアで同じコンポーネントを配置したい場合、メディアクエリだけでは柔軟な対応が困難です。
そこで登場したのが、コンテナクエリ(Container Queries)です。コンテナクエリを使えば、親要素のサイズに応じて子要素のスタイルを動的に変更でき、より柔軟でモジュール指向のレスポンシブデザインが実現できます。
本記事では、コンテナクエリの基本から実案件での導入方法、応用パターンまで、実装例を交えながら詳しく解説します。
「学習→就職」につなげた受講生のリアルな体験談も公開中!
働き方を変えたい方にも響くストーリーです。
吉池さん
Web制作を体系的に学びたいと考え、WithCodeに入会されました。卒業後は、WithCode経由で実案件を経験したほか、ご自身でも案件を獲得。今後はWeb系の業務に携わりたいという思いから転職活動を行い、受託開発の会社への転職を成功させました。
詳しくはこちらの記事をご覧ください。


吉池さんの主な制作実績はこちら


コンテナクエリ(Container Queries)は、親要素(コンテナ)のサイズに基づいて、子要素のスタイルを変更できるCSS機能です。2023年から主要ブラウザで正式サポートされた比較的新しい機能で、レスポンシブデザインの新しい標準となりつつあります。
従来のメディアクエリでは、ビューポート(画面全体)のサイズに基づいてスタイルを切り替えていました。しかし、実際のWebサイトでは、同じ画面幅でも配置場所によって要素の幅が異なることがあります。
例えば:
同じカードコンポーネントを両方に配置した場合、メディアクエリだけでは配置場所ごとに最適なレイアウトを実現できません。
コンテナクエリを使えば、カードコンポーネント自身がその親要素のサイズを判断し、最適なレイアウトに自動的に切り替わります。これにより、配置場所に依存しない真のコンポーネント指向設計が可能になります。





メディアクエリとコンテナクエリは、具体的に何が違うんですか?



基準が「画面全体」か「親要素」かの違いじゃ。実例で見ていこう!
基準:ビューポート(画面全体)のサイズ
/* メディアクエリの例 */
.card {
display: flex;
flex-direction: column;
}
/* 画面幅が768px以上の場合 */
@media (min-width: 768px) {
.card {
flex-direction: row;
}
}この場合、画面幅が768px以上なら、すべての.card要素が横並びになります。サイドバー内のカードも強制的に横並びになってしまい、レイアウトが崩れる可能性があります。
基準:親要素(コンテナ)のサイズ
/* コンテナクエリの例 */
.card-container {
container-type: inline-size; /* この要素をコンテナとして定義 */
}
.card {
display: flex;
flex-direction: column;
}
/* 親要素の幅が480px以上の場合 */
@container (min-width: 480px) {
.card {
flex-direction: row;
}
}この場合、親要素の幅が480px以上のカードのみが横並びになります。サイドバー内のカード(親幅300px)は縦並びのまま、メインエリアのカード(親幅900px)だけが横並びになります。
| 項目 | メディアクエリ | コンテナクエリ |
|---|---|---|
| 基準 | ビューポート(画面全体) | 親要素(コンテナ) |
| スタイル適用範囲 | 画面全体に一律適用 | コンテナごとに個別適用 |
| 柔軟性 | 低い | 高い |
| コンポーネント指向 | 困難 | 実現可能 |
| 使い分け | グローバルなレイアウト変更 | コンポーネント単位の調整 |





コンテナクエリのメリットを知りたいです!



うむ。ここでは、コンテナクエリの5つのメリットを紹介しよう!
コンテナクエリを活用すると、コンポーネントは配置場所に依存せず、自律的に最適なレイアウトを選択できるようになります。
従来のメディアクエリでは「画面サイズ」によって見た目を変更していましたが、コンテナクエリでは「親要素のサイズ」に応じてスタイルを変化させます。
その結果、同じカードコンポーネントを
など、どこに配置しても適切に表示されます。
これが真のコンポーネント志向設計です。
コンポーネントが環境に適応するUI部品として機能するため、大規模開発やマイクロフロントエンド構成との相性も非常に良くなります。
配置場所ごとに専用のCSSクラスを用意する必要がなくなり、コードの保守性が大幅に向上します。
/* メディアクエリの場合(配置場所ごとにクラスが必要) */
.card-main { /* メインエリア用 */ }
.card-sidebar { /* サイドバー用 */ }
.card-footer { /* フッター用 */ }
/* コンテナクエリの場合(1つのクラスで対応) */
.card { /* すべての場所で使用可能 */ }Atomic Design、BEM、Utility First(Tailwind)などの設計思想では、「UIを部品単位で管理する」ことが重要です。
コンテナクエリはこの思想と非常に相性が良く、
が可能になります。
特に大規模プロジェクトでは、
といった観点で、スケーラブルなデザインシステムの構築に貢献します。
単なるレスポンシブ技術ではなく、設計思想を進化させる技術と言えます。
従来のレスポンシブ設計では、レイアウト変更が発生すると:
などの修正コストが発生していました。
しかしコンテナクエリでは、
コンポーネント自身のサイズ条件だけを変更するのみの構造になります。
例えば、
といった場合でも、
親コンテナの幅に応じて自動調整されるため、影響範囲が限定的です。
これは長期運用プロジェクトにおいて、
開発コスト・改修コストの削減に直結します。
コンテナクエリの最大の魅力は、コードの意図が明確になることです。
従来:
「画面幅が768px以上ならこうする」
という条件は、
なぜそのサイズなのかが曖昧でした。
しかしコンテナクエリでは:
「このコンポーネントが400px以上になったらこうする」
という記述になります。
つまり、
というメリットがあります。
結果として、
設計意図がコードにそのまま表現される、直感的で美しいCSS設計が実現します。





コンテナクエリの具体的な実装方法を教えてください!



いい心構えじゃ!ここでは、2つのステップに分けて解説するぞ!
まず、基準となる親要素にcontainer-typeプロパティを指定します。
.container {
container-type: inline-size; /* 横幅を基準にする */
}推奨:ほとんどの場合、inline-sizeを使用します。
次に、@containerルールでコンテナのサイズに応じたスタイルを定義します。
/* 親要素の幅が480px以上の場合 */
@container (min-width: 480px) {
.card {
flex-direction: row;
}
}
/* 親要素の幅が768px以上の場合 */
@container (min-width: 768px) {
.card {
padding: 32px;
font-size: 1.2rem;
}
}See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
container-type: inline-sizeでコンテナとして定義ポイント: 同じHTMLとCSSで、メインエリア(広い)とサイドバー(狭い)に配置したカードが、それぞれ最適なレイアウトで表示されます。





実際の案件では、どんな場面でコンテナクエリを使うんですか?



よくある実案件のパターンを紹介するぞい!
ブログ記事一覧、関連記事、サイドバーなど、さまざまな場所で使いまわすカードに最適です。
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
ECサイトの商品一覧で、表示カラム数に応じてカードの表示内容を変更します。
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
親要素の幅に応じて、メニューの表示形式を切り替えます。
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
親要素の幅に応じて、フォームフィールドの配置を変更します。
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.





コンテナ名の活用方法も知りたいです!



うむ。複数のコンテナがネストしている場合、container-nameで特定のコンテナを指定できるぞ!
.sidebar-container {
container-type: inline-size;
container-name: sidebar; /* コンテナに名前をつける */
}
.card-container {
container-type: inline-size;
container-name: card;
}/* sidebar コンテナのサイズに応じたスタイル */
@container sidebar (min-width: 300px) {
.widget {
padding: 20px;
}
}
/* card コンテナのサイズに応じたスタイル */
@container card (min-width: 480px) {
.card {
flex-direction: row;
}
}container-typeとcontainer-nameは、containerプロパティでまとめて指定できます。
/* 個別指定 */
.container {
container-type: inline-size;
container-name: mycontainer;
}
/* ショートハンド */
.container {
container: mycontainer / inline-size;
}




コンテナクエリの応用テクニックは具体的にどんなものがあるのですか?



良い質問じゃ!ここでは、主な応用テクニックを3つ紹介するぞ!
コンテナのサイズに基づいた相対単位を使用できます。
.card-container {
container-type: inline-size;
}
.card-title {
/* コンテナ幅に応じてフォントサイズが変わる */
font-size: clamp(1rem, 5cqw, 2rem);
}
.card-image {
/* コンテナ幅の80% */
width: 80cqw;
height: 50cqw;
}論理演算子(and、or、not)を使って、複雑な条件を指定できます。
/* AND条件:幅が400px以上かつ600px以下 */
@container (min-width: 400px) and (max-width: 600px) {
.card {
background: lightblue;
}
}
/* OR条件:幅が300px以下または900px以上 */
@container (max-width: 300px), (min-width: 900px) {
.card {
border: 2px solid red;
}
}
/* NOT条件:幅が500px以上でない場合 */
@container not (min-width: 500px) {
.card {
padding: 8px;
}
}コンテナのアスペクト比に応じてスタイルを変更できます。
.media-container {
container-type: size; /* widthとheightの両方を基準にする */
}
/* 横長のコンテナ */
@container (aspect-ratio > 16/9) {
.media-content {
display: flex;
flex-direction: row;
}
}
/* 縦長のコンテナ */
@container (aspect-ratio < 1/1) {
.media-content {
display: flex;
flex-direction: column;
}
}

| ブラウザ | 対応バージョン | 対応状況 |
|---|---|---|
| Chrome | 105以降 | 完全対応 |
| Edge | 105以降 | 完全対応 |
| Firefox | 110以降 | 完全対応 |
| Safari | 16.0以降 | 完全対応 |
| iOS Safari | 16.0以降 | 完全対応 |
| Samsung Internet | 20以降 | 完全対応 |
2023年以降、すべての主要ブラウザで正式サポートされています。実案件でも安心して導入できる状況です。
古いブラウザ向けに、フォールバックを用意することをおすすめします。
/* 基本スタイル(すべてのブラウザで適用) */
.card {
display: flex;
flex-direction: column;
}
/* コンテナクエリをサポートしているブラウザのみ */
@supports (container-type: inline-size) {
.card-container {
container-type: inline-size;
}
@container (min-width: 480px) {
.card {
flex-direction: row;
}
}
}
/* コンテナクエリ非対応の場合はメディアクエリで代替 */
@supports not (container-type: inline-size) {
@media (min-width: 768px) {
.card {
flex-direction: row;
}
}
}基本的なレイアウトをメディアクエリで実装し、コンテナクエリで段階的に機能を追加する方法も有効です。
/* ステップ1:メディアクエリで基本レイアウト */
@media (min-width: 768px) {
.card {
flex-direction: row;
}
}
/* ステップ2:コンテナクエリでより柔軟に */
@container (min-width: 480px) {
.card {
flex-direction: row;
}
}




パフォーマンスを最適化するにはどうしたら良いですか?



うむ。主に3つの方法が挙げれらる。順を追って説明するぞい!
コンテナを深くネストしすぎると、パフォーマンスが低下する可能性があります。必要最小限のネストに留めましょう。
/* 悪い例:過度なネスト */
.container1 { container-type: inline-size; }
.container2 { container-type: inline-size; }
.container3 { container-type: inline-size; }
.container4 { container-type: inline-size; }
/* 良い例:必要な箇所のみ */
.main-container { container-type: inline-size; }
.card-container { container-type: inline-size; }ほとんどの場合、inline-sizeで十分です。
ブレークポイントを細かく設定しすぎると、再計算のコストが増えます。3〜4段階程度に留めるのが理想的です。





コンテナクエリを使用するにあたってトラブルシューティングのことも知りたいです!



うむ。ここでは、主なトラブルシューティングを3つ紹介するぞい!
原因と解決法:
container-typeを指定原因と解決法:
inline-sizeに変更原因と解決法:
@supportsとメディアクエリで代替実装


コンテナクエリって、本当に便利ですね!これからのレスポンシブデザインの標準になりそうです!



その通りじゃ!コンテナクエリを使えば、真のコンポーネント指向設計が実現できるんじゃ。まずは小さなコンポーネントから始めて、徐々に実案件に導入していくんじゃぞ!



はい!次のプロジェクトでブログカードコンポーネントに導入してみます!ありがとうございました!
本記事では、コンテナクエリ(Container Queries)の実案件での導入方法について、実装例を交えながら詳しく解説しました。
重要なポイントは以下の通りです。
・コンテナクエリの特徴:親要素のサイズを基準にスタイルを変更できる最新のCSS機能
・メディアクエリとの違い:ビューポート基準ではなく、コンテナ基準でスタイルを切り替え
・実装方法:container-typeで親要素を定義し、@containerで条件分岐
・実案件のパターン:カード、グリッド、ナビゲーション、フォームなど幅広く活用可能
・ブラウザ対応:2023年以降の主要ブラウザで完全サポート
・最適化:過度なネストを避け、inline-sizeを優先的に使用
WithCodeで学んだHTML・CSSの基礎知識に、コンテナクエリの技術を組み合わせれば、どんな複雑なレスポンシブデザインでも柔軟に実装できます。
コンテナクエリは、真のコンポーネント指向設計を実現する強力な技術です。ぜひ実際のプロジェクトで活用し、保守性の高いWebサイトを作成してください。


副業・フリーランスが主流になっている今こそ、自らのスキルで稼げる人材を目指してみませんか?
未経験でも心配することはありません。初級コースを受講される方の大多数はプログラミング未経験です。まずは無料カウンセリングで、悩みや不安をお聞かせください!
公式サイト より
今すぐ
無料カウンセリング
を予約!