CSS グリッドは非常に強力なレイアウト エンジンですが、親グリッド上に作成された行と列のトラックは、グリッド コンテナの直接の子を配置するためにのみ使用できます。直接の子要素以外の要素で、作成者が定義した名前付きグリッド領域と線が失われる。subgrid
を使用すると、ネストされたグリッドとトラックのサイズ設定、テンプレート、名前を共有できます。この記事では、その仕組みについて説明します。
サブグリッドが表示される前は、このように不規則なレイアウトにならないように、コンテンツが手動で調整されていました。
サブグリッドの後、サイズが異なるコンテンツを配置できます。
サブグリッドの基本
CSS subgrid
の基本を紹介する簡単なユースケースを次に示します。グリッドは 2 つの名前付きの列で定義されます。1 列目の幅は 20ch
で、2 列目はスペース 1fr
の「残り」です。列名は必須ではありませんが、説明や教育の目的に適しています。
.grid {
display: grid;
gap: 1rem;
grid-template-columns: [column-1] 20ch [column-2] 1fr;
}
次に、そのグリッドの子が、この 2 つの列にまたがってグリッド コンテナとして設定され、grid-template-columns
を subgrid
に設定することで親の列を採用します。
.grid > .subgrid {
grid-column: span 2;
display: grid;
grid-template-columns: subgrid; /* 20ch 1fr */
}
これで、親グリッドの列が 1 レベル下のサブグリッドに実質的に渡されました。このサブグリッドでは、これらの列のいずれかに子を割り当てることができます。
課題: 同じデモを grid-template-rows
に対して行います。
ページレベルの「マクロ」グリッドを共有する
デザイナーは通常、共有グリッドを使用して、デザイン全体に線を描き、必要な要素を配置します。ウェブ デベロッパーも、このようなワークフローを実現できるだけでなく、さらに多くのことが可能になります。
最も一般的なデザイナー グリッド ワークフローを実装すると、subgrid
の機能、ワークフロー、可能性に関する優れた分析情報を得ることができます。
次のスクリーンショットは、Chrome DevTools のモバイルページ レイアウト マクロ グリッドのスクリーンショットです。線に名前が付けられており、コンポーネントを配置する領域が明確に示されている。
次の CSS は、デバイス レイアウト用の名前付きの行と列を使用して、このグリッドを作成します。各行と各列にはサイズがあります。
.device {
display: grid;
grid-template-rows:
[system-status] 3.5rem
[primary-nav] 3rem
[primary-header] 4rem
[main] auto
[footer] 4rem
[system-gestures] 2rem
;
grid-template-columns: [fullbleed-start] 1rem [main-start] auto [main-end] 1rem [fullbleed-end];
}
その他のスタイルでは、次のデザインになります。
この親の内部には、さまざまなネストされた要素があります。このデザインでは、ナビゲーション行と見出し行の下に全幅画像が必要です。右端と左端の列行の名前は fullbleed-start
と fullbleed-end
です。グリッド線にこのように名前を付けると、fullbleed
の配置の省略形を使用して、子を同時に各線に配置できます。これから説明するので、これはとても便利です。
適切な名前の行と列で作成されたデバイスの全体的なレイアウトで、subgrid
を使用して、適切な名前の行と列をネストされたグリッド レイアウトに渡します。これが subgrid
マジック モーメントです。デバイス レイアウトは、名前付きの行と列をアプリ コンテナに渡します。アプリ コンテナは、その行と列をすべての子に渡します。
.device > .app,
.app > * {
display: grid;
grid: subgrid / subgrid;
/* same as */
grid-template-rows: subgrid;
grid-template-columns: subgrid;
}
CSS サブグリッドは、グリッド トラックのリストの代わりに使用される値です。要素が親からまたいでいるのは、要素が提供する行と列と同じ行と列になりました。これにより、.app
だけでなく、.app
の子でも .device
グリッドからの行名を使用できるようになります。.app
内の要素は、サブグリッドの前に .device
によって作成されたグリッド トラックを参照できませんでした。
これらをすべて定義すると、subgrid
のおかげで、ネストされた画像をレイアウト内でフルブリードにできるようになりました。負の値やコツはなく、「my layout spans from fullbleed-start
to fullbleed-end
」という簡潔なフレーズを使用します。
.app > main img {
grid-area: fullbleed;
}
これで、デザイナーが使用するようなマクログリッドが CSS で実装されました。このコンセプトは、必要に応じて拡張できます。
サポートを確認する
CSS とサブグリッドによるプログレッシブ エンハンスメントは、なじみのある簡単な方法です。@supports
を使用して、括弧内で、サブグリッドをテンプレート列または行の値として認識しているかどうかをブラウザに尋ねます。次の例では、grid-template-columns
プロパティが subgrid
キーワードをサポートしているかどうかを確認します。true の場合、サブグリッドを使用できることを意味します。
@supports (grid-template-columns: subgrid) {
/* safe to enhance to */
}
DevTools
Chrome、Edge、Firefox、Safari にはいずれも優れた CSS グリッドの DevTools があり、Chrome、Edge、Firefox にはサブグリッドをサポートする特定のツールが用意されています。Chrome は 115 でツールを発表しましたが、Firefox では 1 年以上前から使用されています。
サブグリッド バッジはグリッドバッジと同様に機能しますが、どのグリッドがサブグリッドであるかを視覚的に区別します。
リソース
このリストは、サブグリッドの記事、デモ、ご利用にあたっての全体的なアイデアをまとめたものです。サブグリッド教育の次のステップをお探しの場合は、これらの優れたリソースをご覧ください。
- MDN
- Rachel Andrew が字幕を調整
- Rachel Andrew による 10 の優れた例
- Rachel Andrew と実例サイト
- Ahmad Shadeed の記事
- CSS Day 2022 の Michelle Barker 氏
- カード
- フォームが表示された Chris Coyier 氏
- Facundo Corradini とフォームの配置
- リストアイテムのマーカーを揃える Chris Coyier
- 親グリッドに合わせてコンテナから飛び出している Michelle Barker 氏
- 名前付き線名とサブグリッドの操作を示す Miriam Suzanne
- 名前付きエリアの基本に関する Kevin Powell 氏
- 整列されたリストを持つ Kevin Powell
- Shannon Moeller と並べられたリスト
- コンポーネントに渡されたページレベルのグリッドを持つ Kevin Powell
- devtool のオーバーレイとフォールバックが表示された Elad Shechter
- 脚注のベースライン配置にサブグリッドをタイポグラフィで適切に使用している Aaron Iker
- 記事内にフルブレッド画像があるアダム アーガイル