次世代 CSS レイアウト:コンテナクエリ、サブグリッド、そしてモダンパターン
過去 10 年間、「レスポンシブデザイン」はメディアクエリ (Media Queries) と同義でした。ブラウザウィンドウ全体(ビューポート)の幅を確認し、それに応じてレイアウトを調整してきました。しかし、ウェブアプリケーションがコンポーネントベース(React、Vue、Web Components など)になるにつれ、この手法は大きなボトルネックとなりました。
モダン CSS は、コンテナクエリ (Container Queries) をはじめ、サブグリッド (Subgrid) や Aspect-Ratio といった強力な機能により、ついにこの問題を解決しました。
1. コンテナクエリ:モジュール化デザインの「聖杯」
例えば、Card コンポーネントがあるとします。幅が広いときはサイドバーを表示し、狭いときは縦積みレイアウトにしたいとします。メディアクエリでは、Card は自分自身の幅を知ることができず、ウィンドウの幅しか分かりません。そのため、デスクトップ画面の狭いサイドバーにそのカードを配置すると、レイアウトが崩れてしまいます。
コンテナクエリは、コンポーネントが自分自身のサイズに応じて反応することを可能にします。
使い方:
まず、コンテナを定義します:
.card-wrapper {
container-type: inline-size;
container-name: card-container;
}
次に、内部のコンポーネントに対してクエリを書きます:
@container card-container (min-width: 400px) {
.card {
display: grid;
grid-template-columns: 1fr 2fr;
}
}
これで、画面サイズに関係なく、カードは .card-wrapper 内の利用可能なスペースに基づいてレイアウトを変更するようになります。
2. CSS サブグリッド (Subgrid):揃わなかったものを揃える
CSS Grid は素晴らしいですが、1 つ大きな制限がありました。ネストされたグリッドを親グリッドと簡単に同期させることができなかったのです。ヘッダーとフッターを持つカードのリストがあり、コンテンツの量に関係なくすべてのヘッダーの高さを揃えたい場合、以前は非常に困難でした。
サブグリッド (Subgrid) は、子が親の行や列を「継承」できるようにすることで、この問題を解決します。
例:
.grid-parent {
display: grid;
grid-template-rows: auto 1fr auto; /* ヘッダー, ボディ, フッター */
}
.card {
grid-row: span 3; /* 親の 3 行分を占有 */
display: grid;
grid-template-rows: subgrid; /* 親の行サイズを使用! */
}
grid-template-rows: subgrid を使用すると、同じ行にあるすべての .card 要素のヘッダーとフッターが、内部コンテンツの長さが異なっていても完璧に揃います。
3. aspect-ratio による比率の制御
このプロパティが登場する前は、ビデオの 16:9 やプロフィールの 1:1 の比率を維持するために、padding-top を使った「ハック」が必要でした。今では、たった 1 行で済みます。
.video-thumbnail {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: cover;
}
これは、ブラウザが画像やビデオの読み込みが完了する前に正しいスペースを確保できるため、レイアウトシフト (CLS) の防止に不可欠です。
4. モダンな Flexbox と Grid のパターン
モダン CSS は、既存のレイアウトエンジンにも小さくも強力な改善をもたらしています:
Flexbox の gap
最後の要素以外のすべてに margin-right を設定する必要はもうありません。gap を使うだけです。
.flex-container {
display: flex;
gap: 1rem;
}
論理プロパティ (Logical Properties)
left、right、top、bottom の代わりに、inline と block という概念で考えます。これにより、右から左へ書く言語 (RTL) のサポートが自動化されます。
.element {
margin-inline-start: 20px; /* LTR では margin-left、RTL では margin-right */
padding-block: 10px; /* padding-top と padding-bottom に相当 */
}
5. パフォーマンスとブラウザサポート
2024 年現在、コンテナクエリ、サブグリッド、Aspect-Ratio はすべての主要ブラウザでサポートされています。開発者にとって、これは重い JavaScript の Resize Observer や複雑なグリッドハックをようやく卒業できることを意味します。
その結果は? CSS ファイルの軽量化、パフォーマンスの向上、そして格段にメンテナンスしやすいコードベースです。
FAQ:よくある質問
Q: メディアクエリの使用はやめるべきですか?
A: いいえ。メディアクエリは依然として、ページ全体の高レベルなレイアウト(例:「メインナビゲーションはトップバーにすべきか、サイドバーにすべきか?」)には最適なツールです。コンテナクエリはコンポーネントレベルのレイアウト(例:「この特定のコンテナの中でこのカードはどう見えるべきか?」)のためのものです。
Q: サブグリッドはすべてのブラウザで動作しますか?
A: はい!主要な機能の中で最後に普及サポートを得た機能ですが、現在は Chrome、Safari、Firefox の最新バージョンで利用可能です。
Q: タイポグラフィにコンテナクエリを使えますか?
A: はい!cqi (コンテナクエリ・インラインサイズ) などのコンテナクエリ単位を使用して、テキストサイズをコンテナの幅に相対的にすることができます。これは多くの場合、ビューポート単位 (vw) よりもはるかに便利です。
少ないコードでより多くを構築する
モダン CSS レイアウトツールは、連携して動作するように設計されています。Grid、Subgrid、コンテナクエリを組み合わせることで、数年前には不可能だった、あるいは非常に壊れやすかったレイアウトを構築できます。
新しいレイアウトをテストする準備はできましたか?当サイトの CSS レイアウト可視化ツール で、これらのコンセプトの実際の動作を確認してみてください。