【コンテナクエリ】

コンテナクエリ とは?

💡 「画面幅」ではなく「自分の居場所」で姿を変えるCSS
📌 このページのポイント
コンテナクエリ ― 親の幅で子のスタイルが変わる メインカラム(幅 700px) container-type: inline-size 画像 詳しく見る 横並びレイアウト サイドバー(幅 280px) container-type: inline-size 画像 詳しく見る 縦積みレイアウト 同じコンポーネントが配置場所の幅に応じて変化
コンテナクエリのイメージ
ひよこ ひよこ

メディアクエリとコンテナクエリって何が違うの?

ペンギン先生 ペンギン先生

メディアクエリは「ブラウザの画面幅が768px以下なら」というようにビューポート全体のサイズで判断するんだ。コンテナクエリは「このコンポーネントの親要素の幅が400px以下なら」と、もっとピンポイントで判断する。同じカードコンポーネントでも、メインカラムとサイドバーで別々にスタイルを変えられるよ

ひよこ ひよこ

どうやって使うの?

ペンギン先生 ペンギン先生

まず親要素にcontainer-type: inline-sizeを指定してコンテナとして宣言する。そして@container (max-width: 400px)のように書くと、そのコンテナの幅が400px以下のときだけスタイルが適用されるんだ。container-nameを付ければ、どのコンテナを基準にするか名前で指定もできるよ

ひよこ ひよこ

これまでは同じことができなかったの?

ペンギン先生 ペンギン先生

メディアクエリだけだと、サイドバーが300px幅のとき画面全体は1200pxだからメディアクエリは発動しないんだ。だからサイドバー用に別CSSクラスを書いたり、JavaScriptでリサイズを監視したりしていた。コンテナクエリのおかげで純粋なCSSだけでコンポーネント単位のレスポンシブが実現できるようになったよ

ひよこ ひよこ

cqwっていう単位も使えるの?

ペンギン先生 ペンギン先生

コンテナクエリ単位と呼ばれるもので、cqwはコンテナ幅の1%、cqhはコンテナ高さの1%を表すよ。font-size: 4cqwと書けば、コンテナが狭くなるとフォントも自動で小さくなる。vwのコンテナ版だと思えば分かりやすいね

ひよこ ひよこ

ブラウザ対応はもう大丈夫なの?

ペンギン先生 ペンギン先生

2023年にChrome、Firefox、Safariすべてが対応して、モダンブラウザではもう安心して使えるよ。デザインシステムやコンポーネントライブラリでは急速に採用が進んでいるんだ。container-type: inline-sizeを指定した要素はレイアウト計算が少し変わるから、既存コードに後付けするときはcontainの挙動を理解しておくと安心だね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「コンテナクエリ」って出てきたら「親要素のサイズに合わせてスタイルを変えるCSS」と思えばだいたいOK!
📖 おまけ:英語の意味
「Container Queries」 = コンテナ(容器)への問い合わせ
💬 メディアクエリの「メディア」がビューポートを指すのに対し、コンテナクエリの「コンテナ」は親要素を指すよ。CSSの世界で10年以上待ち望まれた機能なんだ
← 用語集にもどる