コンテナクエリで変わる、コンポーネント単位の「responsive」という考え方

コンテナクエリ

「コンテナクエリ」はもうブラウザサポートも十分なのに、実際にはメディアクエリの延長線上でしか使われていない、という話をよく見かけるようになりました。

かかかず
かかかず

改めて調べてみると、たしかに自分自身も「画面幅の代わりにコンテナ幅を見る便利機能」くらいの理解で止まっていたな、と反省させられました。

「メディアクエリ」はビューポート、つまり画面全体の幅を基準にレイアウトを切り替える仕組みです。それに対して「コンテナクエリ」は、あるコンポーネントの親要素の幅を基準に、そのコンポーネント自身のスタイルを切り替える仕組みです。

似ているようで、実は「何に対して responsive であるべきか」という設計思想がまったく違う、というのが元記事の主張でした。

「画面幅」だけを見ていた頃の苦労

自分がまだメディアクエリだけでレイアウトを組んでいた頃、いちばん困っていたのは「同じカードコンポーネントなのに、置かれる場所によって崩れる」という問題でした。

トップページでは3カラムに並ぶカード、サイドバーでは1カラムで細長く置かれるカード。どちらも同じHTML構造・同じCSSクラスを使いたいのに、画面幅基準のメディアクエリでは「今このカードがどれくらいの幅で表示されているか」までは分かってくれません。

結局どうしていたかというと、サイドバー用に別クラスを作って上書きしたり、`.card–narrow` のような修飾クラスを増やしたりして、その場しのぎで対応していました。

CSSファイルはどんどん肥大化しますし、半年後に見返すと「このクラス、どこで使われているんだっけ」と自分でも分からなくなる。あるあるだと思います。

かかかず
かかかず

正直、あの頃の自分に『コンポーネント側で幅を判断できるようになるよ』と教えてあげたいです。修飾クラスの数だけ、地味に運用コストが積み上がっていたので……。

「置き場所」に依存しないコンポーネントという発想

コンテナクエリの本質は、コンポーネントが「自分がどんな幅の箱に入れられているか」を自分自身で判断できるようになる、という点にあると理解しています。

つまりページ全体のレイアウトを気にする必要がなく、コンポーネント単体で完結した「responsive」を実現できるわけです。これは地味なようで、実際のデザインシステム運用ではかなり大きな違いになります。

以前、クライアントワークでコンポーネントライブラリをFigmaとコードの両方で管理する案件がありました。デザイナー側は「このカードはどこに置いても崩れない」という前提でパーツを作りたいのに、実装側はメディアクエリの都合上、置き場所ごとに微妙に違うスタイルを当てざるを得ない。

デザインとコードの間に見えない溝があって、レビューのたびに「あれ、ここだけ余白が違いますね」というやり取りが発生していました。

コンポーネント単位で考える時代に、自分のCSS設計は追いついているか

「コンテナクエリ」というCSSの機能について、改めて調べてみました。ブラウザの対応はかなり前から進んでいるのに、実際の現場ではまだ「メディアクエリの延長」くらいの理解で止まっている人が多いようです。かくいう自分も、案件で使い始めるまでは正直そのくらいの認識でした。

「メディアクエリ」は画面幅に応じてレイアウトを切り替える仕組みですが、「コンテナクエリ」はその名の通り、要素が置かれている「コンテナ」の幅に応じてスタイルを変えられる仕組みです。同じカードコンポーネントでも、サイドバーに置かれた時とメインカラムに置かれた時で見た目を最適化できる、という話を聞いて、これはずっと欲しかった機能だったな、と思い出しました。

「画面幅」でしか考えられなかった時代の苦労

自分がまだWeb制作を始めたばかりの頃、レスポンシブ対応といえば「画面幅がここを下回ったらこう変える」というルールを積み重ねていくものでした。それ自体は間違っていないのですが、問題は「同じパーツを別の場所で使い回したい」となった時です。ヘッダーで作ったカードコンポーネントを、サイドバーやモーダルの中でも使いたいというケースは本当によくあります。

画面幅だけを見て組んだスタイルは、コンテナの幅が変わった瞬間に破綻します。サイドバーに入れたらテキストが詰まりすぎたり、画像が潰れたり。結局「サイドバー用のクラス」「モーダル用のクラス」を別々に用意することになり、気づけば同じようなコンポーネントのバリエーションが何個も並んでいる、という状態になっていました。

かかかず
かかかず

『.card』『.card–sidebar』『.card–modal』みたいな亜種が増えていくの、あれ本当にやめたかったんですよね…。管理する側からするとどれが正で何が違うのか、途中から自分でもわからなくなってました。

デザインシステムを組むほど顕在化する矛盾

特にこの問題が表面化するのは、「デザインシステム」やコンポーネントライブラリを整備しようとする時です。Figmaでコンポーネントを作る段階では「どこに置いても使えるパーツ」として設計するのに、実装のCSSでは「置かれる場所」を前提にしたスタイルしか組めない。デザインの理想と実装の制約がズレたまま進んでしまう、というのを何度も経験しました。

クライアントワークだと、この矛盾はレビューの場面でよく噴き出します。「このコンポーネント、別のページでも使いたい」と言われて、いざ組み込んでみたら幅が想定外で崩れる。急いで個別対応のクラスを足して、その場はしのげても、次の改修でまた同じことが起きる。この繰り返しに、正直しんどさを感じていた時期がありました。

カテゴリーのイラスト

同じカテゴリの記事一覧

ボタンの影