メディアクエリは「画面全体の幅」に応じてスタイルを切り替えます。しかし、同じコンポーネントがサイドバーにもメインエリアにも配置される場合、画面幅だけでは最適なレイアウトを判断できません。
そこで登場したのが CSSコンテナクエリ(@container)。親要素のサイズに応じてレイアウトを切り替える、次世代のレスポンシブデザイン手法です。
メディアクエリ vs コンテナクエリ
@media
画面(ビューポート)の幅で判断
@container
親要素の幅で判断
基本の使い方
ステップは2つだけ。①親要素に container-type を指定、②子要素のスタイルを @container で切り替えます。
CSS
/* ステップ1:親要素をコンテナとして宣言 */
.card-wrapper {
container-type: inline-size;
}
/* ステップ2:コンテナの幅に応じてスタイルを変更 */
.card {
display: flex;
gap: 12px;
align-items: center;
}
@container (min-width: 300px) {
.card {
flex-direction: column;
text-align: center;
}
}
実践デモ:同じカードを異なる幅で配置
同じカードコンポーネントを、狭い列と広い列の両方に配置しました。コンテナクエリにより、親の幅に応じて自動的にレイアウトが切り替わります。
🎨
デザイン
狭い親→横並び
💻
開発
狭い親→横並び
📊
分析・改善
広い親→縦並び(@container 300px超)
💡 ポイント:コンテナクエリはすべての主要ブラウザ(Chrome 105+、Safari 16+、Firefox 110+)でサポートされています。2026年時点で安心して使えます。
名前付きコンテナ
ネストされたコンテナがある場合、container-name で名前をつけて区別できます。
CSS
.sidebar {
container-type: inline-size;
container-name: sidebar;
}
.main-content {
container-type: inline-size;
container-name: main;
}
@container sidebar (max-width: 250px) {
.widget { font-size: 0.8rem; }
}
@container main (min-width: 600px) {
.article-card { display: grid; grid-template-columns: 1fr 2fr; }
}
まとめ
- コンテナクエリ → 親要素の幅でレイアウトを切り替え
- container-type: inline-size → コンテナとして宣言
- @container → メディアクエリと同じ記法で条件指定
- container-name → ネスト時の区別
コンテナクエリは「コンポーネント駆動のレスポンシブデザイン」を可能にします。同じコンポーネントを画面のどこに配置しても、最適なレイアウトで表示される——それが次世代のCSSです。
💡 ツタワルの制作では:再利用可能なコンポーネント設計を重視しており、コンテナクエリの積極的な導入を進めています。「どこに置いても美しく表示される」コンポーネントこそ、保守性の高いCSS設計の理想形です。