grid-template-areasとは
grid-template-areasは、グリッドレイアウトの構造を視覚的に定義できる強力な機能です。コードを見るだけで、どのようなレイアウトになるのかが一目で分かるため、実務でも非常に人気があります。
基本的な仕組み
グリッドの各エリアに名前を付けて、それをASCIIアートのように配置することで、レイアウト構造を直感的に表現します。
基本的な使い方
grid-template-areasを使ったレイアウトは、以下の3ステップで実装します。
- コンテナーに grid-template-areas を定義 レイアウト構造を文字列で記述
- 列数と行数を指定 grid-template-columns と grid-template-rows で各トラックのサイズを定義
- 各アイテムに grid-area で名前を割り当て 定義したエリア名を指定して配置
/* 1. コンテナーにレイアウト構造を定義 */
.container {
display: grid;
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
grid-template-columns: 200px 1fr 1fr;
grid-template-rows: 80px 1fr 60px;
gap: 1rem;
height: 100vh;
}
/* 2. 各アイテムにエリア名を割り当て */
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; } HTMLとの対応
<div class="container">
<header class="header">Header</header>
<aside class="sidebar">Sidebar</aside>
<main class="main">Main Content</main>
<footer class="footer">Footer</footer>
</div> HTMLでは通常通り要素を並べるだけで、CSSのgrid-areaによって自動的に適切な位置に配置されます。
実際に試してみよう
以下のコードエディタで、grid-template-areasの構造を変更して、レイアウトがどのように変わるか試してみてください。
空のセルを表現する
ドット(.)を使うと、その位置を空にできます。これは意図的にスペースを空けたいレイアウトで活用します。
.container {
display: grid;
grid-template-areas:
"header header header"
"sidebar main ."
"footer footer footer";
grid-template-columns: 200px 1fr 200px;
grid-template-rows: 80px 1fr 60px;
} この例では、右側の列の中央部分が空白になります。
実際に試してみよう
右上を空白にしたレイアウトを試してみてください。
- 各行は引用符で囲む
"header header"のように、スペース区切りで記述 - エリア名は繰り返して結合 同じ名前を複数のセルに使うことで、エリアを結合できる
- 矩形エリアのみ エリアは必ず長方形(矩形)でなければならない。L字型などは不可
- ドットで空白を表現
.を使うと、その位置を空のセルにできる - エリア名の命名規則 英数字、ハイフン、アンダースコアが使用可能
レスポンシブ対応
grid-template-areasは、メディアクエリと組み合わせることで、画面サイズに応じてレイアウトを簡単に変更できます。
/* スマートフォン(縦一列) */
.container {
display: grid;
grid-template-areas:
"header"
"main"
"sidebar"
"footer";
grid-template-columns: 1fr;
}
/* タブレット以上(2カラム) */
@media (min-width: 768px) {
.container {
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
grid-template-columns: 200px 1fr;
}
}
/* デスクトップ(3カラム) */
@media (min-width: 1024px) {
.container {
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
grid-template-columns: 200px 1fr 200px;
}
} このように、画面サイズごとにgrid-template-areasを変更するだけで、HTMLを一切変更せずにレイアウトを切り替えられます。
- 直感的 コードがレイアウトの設計図そのもの
- 保守性 後から見ても構造が一目瞭然
- 柔軟性 メディアクエリで簡単にレイアウト変更
- 可読性 チームメンバー全員が理解しやすい
- 効率性 複雑なレイアウトも簡潔に記述
名前付きグリッドライン
グリッドラインには、番号だけでなく名前を付けることもできます。これにより、コードの可読性が向上し、複雑なレイアウトでも分かりやすく管理できます。
基本的な構文
グリッドラインに名前を付けるには、grid-template-columnsやgrid-template-rowsで角括弧[]を使って名前を定義します。
.container {
display: grid;
grid-template-columns:
[sidebar-start] 200px
[sidebar-end main-start] 1fr
[main-end];
grid-template-rows:
[header-start] 80px
[header-end content-start] 1fr
[content-end footer-start] 60px
[footer-end];
} この定義により、以下のようにラインを参照できます。
main-start
footer-start
main-end
footer-end
main-start
footer-start
アイテムの配置に使用
名前付きラインを使って、アイテムを配置できます。
.header {
grid-column: sidebar-start / main-end;
grid-row: header-start / header-end;
}
.sidebar {
grid-column: sidebar-start / sidebar-end;
grid-row: content-start / content-end;
}
.main {
grid-column: main-start / main-end;
grid-row: content-start / content-end;
}
.footer {
grid-column: sidebar-start / main-end;
grid-row: footer-start / footer-end;
} 番号を使った配置と比べて、コードの意図が明確になります。
実際に試してみよう
名前付きラインを使ったレイアウトを試してみてください。
複数の名前を付ける
1つのラインに複数の名前を付けることもできます。
.container {
display: grid;
grid-template-columns:
[full-start sidebar-start] 200px
[sidebar-end content-start main-start] 1fr
[main-end content-end full-end];
} この場合、full-start、sidebar-start、content-start、main-startなど、用途に応じて適切な名前を使い分けられます。
grid-template-areasとの自動命名
実は、grid-template-areasを使うと、自動的に名前付きラインが生成されます。
.container {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
}
/* 以下のラインが自動生成される */
/* header-start, header-end */
/* sidebar-start, sidebar-end */
/* main-start, main-end */
/* footer-start, footer-end */ これにより、grid-template-areasと名前付きラインを組み合わせた柔軟なレイアウトが可能になります。
.special-element {
/* areasで定義したエリアのラインを使用 */
grid-column: sidebar-start / main-end;
grid-row: header-start / footer-end;
} - わかりやすい名前を使う
start/end、left/rightなど、意味が明確な名前 - 一貫性を保つ プロジェクト全体で命名規則を統一
- 複数の名前を活用 異なる視点で同じラインを参照したい場合に便利
- -startと-endを使う エリアの開始と終了を明示的に示す慣習
- 可読性の向上 番号より意味が明確
- 保守性の向上 レイアウト変更時に意図が伝わりやすい
- エラーの削減 間違ったラインを参照するリスクが減る
- チーム開発 他の開発者が理解しやすい
- 柔軟性 複数の名前で異なる用途に対応
グリッドアイテムの配置制御
ここまでgrid-template-areasや名前付きラインを学んできましたが、グリッドラインの番号を使った直接的な配置方法も非常に重要です。特に、動的なレイアウトや細かい調整が必要な場合に活躍します。
grid-column と grid-row
grid-columnとgrid-rowは、アイテムをグリッドライン番号で配置するプロパティです。前回学んだ基礎知識を応用して、より高度な配置を実現します。
基本的な構文
.item {
/* 列方向の配置: 開始ライン / 終了ライン */
grid-column: 1 / 3;
/* 行方向の配置: 開始ライン / 終了ライン */
grid-row: 2 / 4;
} 個別プロパティでの指定
より細かく制御したい場合は、開始と終了を個別に指定できます。
.item {
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 2;
grid-row-end: 4;
} 実際に試してみよう
grid-columnとgrid-rowの値を変更して、アイテムの配置と大きさがどのように変わるか試してみてください。
グリッドラインは、右端・下端から逆順に-1、-2…と指定することもできます。
.item {
/* 列の最後から2番目まで */
grid-column: 1 / -1;
/* 行の最後まで */
grid-row: 2 / -1;
} これは、列数や行数が変わっても「最後まで」という指定が有効なため、柔軟なレイアウトに役立ちます。
スパンによる結合
spanキーワードを使うと、開始位置からいくつのセルをまたぐかを指定できます。終了ライン番号を計算する必要がないため、コードが簡潔になります。
.item {
/* 列ライン1から、3つのセルをまたぐ */
grid-column: 1 / span 3;
/* 行ライン2から、2つのセルをまたぐ */
grid-row: 2 / span 2;
}
/* 開始位置を省略すると、自動配置からスパン */
.item {
grid-column: span 2; /* 2列分のスペースを占める */
grid-row: span 3; /* 3行分のスペースを占める */
} 実際に試してみよう
spanを使った配置を試してみてください。
- 可変グリッド 列数が変わる可能性があるレイアウト
- コンポーネント設計 「2列分」など相対的なサイズ指定
- 保守性 ライン番号の計算が不要
- レスポンシブ メディアクエリでspanの値を変更しやすい
重ね合わせとz-index
CSS Gridでは、複数のアイテムを同じグリッドセルに重ねて配置できます。これにより、画像とテキストを重ねたカードデザインなどが実現できます。
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 100px);
}
.background {
grid-column: 1 / 3;
grid-row: 1 / 3;
z-index: 1; /* レイヤー1: 背面 */
}
.overlay {
grid-column: 1 / 3;
grid-row: 1 / 3;
z-index: 2; /* レイヤー2: 前面 */
} z-indexを使って、重なり順を制御します。値が大きいほど前面に表示されます。
実際に試してみよう
アイテムを重ね合わせて、画像とテキストを組み合わせたカードを作ってみてください。
- デフォルト値は0 明示的に指定しない場合、HTMLの記述順で重なる
- 大きい値が前面 z-indexが大きいほど前面に表示される
- 負の値も使用可能 他の要素より後ろに配置したい場合
- 親子関係は考慮しない グリッドアイテム同士の重なりのみを制御
- grid-column/grid-row グリッドライン番号で正確に配置
- span セルをまたぐ数で柔軟に指定
- 重ね合わせとz-index 同じセルに複数アイテムを配置可能
自動配置の高度なテクニック
ここまで、明示的にアイテムを配置する方法を学んできました。しかし、CSS Gridには自動配置という強力な機能があり、アイテムが空いているスペースに自動的に配置されます。この自動配置の動作をコントロールする高度なテクニックを見ていきましょう。
grid-auto-flow: dense
grid-auto-flowプロパティは、アイテムの自動配置の流れを制御します。特にdense値は、グリッドの空きスペースを埋めるように動作し、効率的なレイアウトを実現します。
デフォルトの動作(row)
まず、デフォルトのgrid-auto-flow: rowの動作を確認しましょう。
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-flow: row; /* デフォルト値 */
}
/* 一部のアイテムだけサイズを指定 */
.item-1 { grid-column: span 2; }
.item-3 { grid-column: span 2; }
.item-6 { grid-column: span 2; }
.item-8 { grid-column: span 2; } <div class="container">
<div class="item-1">item-1 (span 2)</div>
<div class="item-2">item-2</div>
<div class="item-3">item-3 (span 2)</div>
<div class="item-4">item-4</div>
<div class="item-5">item-5</div>
<div class="item-6">item-6 (span 2)</div>
<div class="item-7">item-7</div>
<div class="item-8">item-8 (span 2)</div>
</div> デフォルトでは、アイテムは左から右、上から下へ順番に配置されます。大きなアイテム(span 2)が続き、次のアイテムがその行に入りきらない場合、次の行に移動するため、空きスペースが発生し、行数が増えます。
denseを使った最適化
grid-auto-flow: denseを使うと、後続のアイテムが空きスペースを埋めるように配置されます。
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-flow: row dense; /* denseを追加 */
} 実際に試してみよう
grid-auto-flowをrowとrow denseで切り替えて、レイアウトの違いを確認してみてください。
- HTML順序が変わる スクリーンリーダーでの読み上げ順序と視覚的な順序が異なる
- キーボードナビゲーション タブ順序が視覚順序と一致しなくなる
- 適切な使用場面 画像ギャラリーやデコレーション要素など、順序が重要でない場合に限定
- 重要コンテンツには使用しない 記事やフォームなど、順序が意味を持つコンテンツでは避ける
auto-fillとauto-fitの使い分け
repeat()関数では、列数を固定値で指定する代わりに、auto-fillやauto-fitを使って、利用可能なスペースに応じて自動的に列数を調整できます。
auto-fillの動作
auto-fillは、利用可能なスペースに可能な限り多くの列を作成します。アイテムが少ない場合でも、空の列トラックが生成されます。
.container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 1rem;
} この設定では、各列は最低200pxで、余ったスペースを均等に分配(1fr)します。コンテナーの幅が広い場合、アイテムが少なくても空の列が生成されます。
auto-fitの動作
auto-fitは、実際に必要な列数だけを作成し、余ったスペースはアイテムに分配されます。
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
} アイテムが少ない場合、空の列は作成されず、既存のアイテムが利用可能なスペースを均等に使用します。
実際に試してみよう
アイテム数を変更して、auto-fillとauto-fitの動作の違いを確認してみてください。
使い分けのポイント
- auto-fill アイテム数が増えた時にレイアウトが崩れないよう、常に最大列数を確保したい場合。画像ギャラリーなど、アイテムのサイズを固定したい時に適切
- auto-fit アイテム数が少ない時も、利用可能なスペースを最大限活用したい場合。カードレイアウトなど、アイテムを広げて表示したい時に適切
- minmax()との組み合わせ 両方とも
minmax(最小値, 1fr)と組み合わせるのが一般的。最小値は固定値、最大値は1frで伸縮可能に - レスポンシブ対応 メディアクエリなしでレスポンシブなレイアウトを実現できる
- grid-auto-flow: dense 空きスペースを効率的に埋める(装飾的な要素に適用)
- auto-fill 空の列トラックも生成、アイテムサイズを固定したい場合
- auto-fit 余ったスペースをアイテムに分配、柔軟なレイアウト
実践的なレイアウトパターン
ここまで学んできたCSS Gridの技術を使って、実際のWebサイトでよく見られるレイアウトパターンを実装してみましょう。
Webサイトの基本レイアウト
多くのWebサイトで採用されている、ヘッダー、サイドバー、メインコンテンツ、フッターの基本構成を実装します。
デスクトップレイアウト
.site-container {
display: grid;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
grid-template-columns: 250px 1fr 200px;
grid-template-rows: 80px 1fr 60px;
min-height: 100vh;
gap: 1rem;
}
.site-header { grid-area: header; }
.site-sidebar { grid-area: sidebar; }
.site-main { grid-area: main; }
.site-aside { grid-area: aside; }
.site-footer { grid-area: footer; } 実際に試してみよう
表示領域に応じて、各セクションが適切に配置されることを確認してみてください。
min-height: 100vhを設定すると、コンテンツが少ない場合でも、ページが画面全体の高さを占めるようになります。フッターが常に画面下部に配置されるプロフェッショナルなレイアウトを実現できます。
ダッシュボードレイアウト
管理画面やダッシュボードでよく使われる、複数のウィジェットを配置するレイアウトです。
.dashboard {
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-template-rows: auto;
gap: 1rem;
padding: 1rem;
}
/* 各ウィジェットのサイズを指定 */
.widget-summary {
grid-column: span 12;
grid-row: span 1;
}
.widget-chart {
grid-column: span 8;
grid-row: span 2;
}
.widget-stats {
grid-column: span 4;
grid-row: span 2;
}
.widget-activity {
grid-column: span 6;
grid-row: span 2;
}
.widget-tasks {
grid-column: span 6;
grid-row: span 2;
}
/* レスポンシブ対応 */
@media (max-width: 768px) {
.widget-chart,
.widget-stats,
.widget-activity,
.widget-tasks {
grid-column: span 12;
}
} 12カラムグリッドシステムを使用することで、柔軟なレイアウト調整が可能になります。各ウィジェットはspanを使って、占有する列数を指定します。
実際に試してみよう
各ウィジェットのgrid-column: spanの値を変更して、レイアウトをカスタマイズしてみてください。
カードグリッドの実装
商品一覧やブログ記事一覧など、カード型コンテンツのグリッドレイアウトです。auto-fitとminmax()を組み合わせて、完全にレスポンシブなグリッドを実現します。
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1.5rem;
padding: 1rem;
}
.card {
background: white;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
overflow: hidden;
transition: transform 0.2s;
}
.card:hover {
transform: translateY(-4px);
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
.card-image {
aspect-ratio: 16 / 9;
background: #e5e7eb;
}
.card-content {
padding: 1rem;
} 実際に試してみよう
カードの数を増やしたり、minmax()の最小値を変更して、レイアウトの変化を確認してみてください。
理解度チェッククイズ
CSS Grid応用テクニック ミニクイズ
.container {
display: grid;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
} .container {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
.item {
grid-column: span 2;
} /* パターンA */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
/* パターンB */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); まとめ
- grid-template-areas ASCII風の視覚的な記法でレイアウト構造を定義。コードの可読性と保守性が向上
- 名前付きグリッドライン 角括弧[]でラインに名前を付けることで、番号よりも意味が明確なコード記述が可能
- spanキーワード 開始位置からいくつのセルをまたぐかを指定。終了ライン番号の計算が不要で柔軟
- grid-auto-flow: dense 空きスペースを効率的に埋める。画像ギャラリーなどの装飾的な要素に最適
- auto-fill vs auto-fit auto-fillは空の列も生成してアイテムサイズを固定、auto-fitは空の列を削除してアイテムを拡大
- z-indexで重ね合わせ 同じセルに複数アイテムを配置し、z-indexで重なり順を制御。カードデザインに活用
- 12カラムシステム 柔軟なダッシュボードレイアウトの実現。spanで各ウィジェットのサイズを調整
- レスポンシブ対応 メディアクエリでgrid-template-areasを切り替えるだけで、HTMLを変えずにレイアウト変更が可能
次回は、CSS Gridとflexboxを組み合わせた複雑なレイアウトや、実務で役立つデザインパターンを学んでいきます。今日学んだ応用テクニックを基礎として、さらに高度な実装を身につけていきましょう!