ウェブエンジニア問題集
第5章

CSS Gridで2次元レイアウトを組む — grid-template・fr単位・areasの実践ガイド

9
この章の目次開く

CSS Gridは、行と列の2次元でレイアウトを制御できる仕組みです。Flexboxが1軸(横または縦)のレイアウトに適しているのに対し、Gridは行と列を同時に操作できるため、ページ全体のレイアウトや複雑なグリッドUIに向いています。

学習者学習者

Flexbox を覚えたばかりなのに Grid も…?2つの違いと使い分けがよく分からない。

Flexboxは「1列の中でどう並べるか」を制御するツール、Gridは「ページ全体を行と列の碁盤の目に区切る」ツールです。役割が違うので、両方使えるとレイアウトの引き出しが一気に広がります。

Gridでページレイアウトを設計しているイメージ

基本の使い方 — display: grid と grid-template-columns

親要素に display: grid を指定し、grid-template-columns で列の数と幅を定義します。

<div class="container">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
</div>
html
.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr; /* 3列、均等幅 */
  gap: 16px;
}
css

アイテムは定義した列数で自動的に折り返し、3列 × 2行のグリッドになります。

display: grid を付けた要素をグリッドコンテナ、その直接の子要素をグリッドアイテムと呼びます。Flexboxと同じ「親に指定 → 子が並ぶ」の構造です。


fr 単位 — 「余った空間の何分の何か」

fr(fraction)はGrid専用の単位で、利用可能な空間を比率で分配します。

/* 3列均等 */
grid-template-columns: 1fr 1fr 1fr;
 
/* 左の固定サイドバー + 残りをメイン */
grid-template-columns: 240px 1fr;
 
/* 左:右 = 1:2 の比率 */
grid-template-columns: 1fr 2fr;
css

px% と混在できるのがポイントです。「固定幅のサイドバー + 残りをメインコンテンツ」のようなパターンが 240px 1fr の一行で書けます。


grid-template-columns / rows のパターン

列と行のサイズ定義にはいくつかの書き方があります。

/* 固定幅 */
grid-template-columns: 200px 400px 200px;
 
/* repeat() で繰り返し */
grid-template-columns: repeat(3, 1fr); /* 3列均等 */
grid-template-columns: repeat(4, 100px); /* 100px × 4列 */
 
/* minmax() で最小・最大を指定 */
grid-template-columns: repeat(3, minmax(200px, 1fr));
 
/* auto-fill で画面幅に応じて自動的に列数を調整 */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
css
パターン意味
repeat(3, 1fr)均等3列
200px 1fr固定幅 + 残り全部
repeat(auto-fill, minmax(200px, 1fr))200px以上で自動的に列数を調整

行の高さも同じように指定できます。

grid-template-rows: 60px 1fr 80px; /* ヘッダー・本文・フッター */
css

grid-template-areas — 名前でレイアウトを視覚的に定義

Grid最大の強みの一つが grid-template-areas です。レイアウトを文字列で視覚的に記述できます。

.page {
  display: grid;
  grid-template-areas:
    'header header'
    'sidebar main'
    'footer footer';
  grid-template-columns: 240px 1fr;
  grid-template-rows: 60px 1fr 60px;
  min-height: 100vh;
}
 
.header {
  grid-area: header;
}
.sidebar {
  grid-area: sidebar;
}
.main {
  grid-area: main;
}
.footer {
  grid-area: footer;
}
css

CSSを見ただけで「ヘッダーは全幅、左にサイドバー、右にメイン、フッターも全幅」というレイアウト構造が想像できます。

先生先生

grid-template-areas はチーム開発で特に威力を発揮するよ。新しいメンバーがCSSを見たとき、レイアウトの意図が一目で分かるからね。


アイテムの配置 — span で複数セルをまたぐ

アイテムが複数のセルにまたがるように指定できます。

/* 列番号で指定 */
.featured {
  grid-column: 1 / 3; /* 1列目のラインから3列目のラインまで(2列分) */
  grid-row: 1 / 2;
}
 
/* span を使う書き方(推奨) */
.wide {
  grid-column: span 2; /* 2列分の幅を占める */
}
 
.tall {
  grid-row: span 3; /* 3行分の高さを占める */
}
css
グリッドのセル配置を確認しているイメージ

span の方がコードの意図が明確で読みやすいです。「ライン番号を数える」のは直感的でないため、grid-template-areasspan で書くのがおすすめです。


gap — アイテム間の間隔

Flexboxと同じく gap でアイテム間の余白をまとめて指定できます。

.grid {
  display: grid;
  gap: 16px; /* 行・列とも 16px */
  gap: 8px 16px; /* 行方向 列方向 */
  row-gap: 8px; /* 行方向のみ */
  column-gap: 16px; /* 列方向のみ */
}
css

margin で調整するのと違い、外側に余計な余白がつかないのが gap の利点です。


実務でよく使うパターン

レスポンシブカードグリッド(メディアクエリ不要)

.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 24px;
}
css

auto-fill + minmax の組み合わせで、画面幅に応じて列数が自動調整されます。メディアクエリを1行も書かずにレスポンシブなグリッドが実現できる、Gridの最も強力なパターンです。

サイドバー付きレイアウト

.layout {
  display: grid;
  grid-template-columns: 260px 1fr;
  gap: 24px;
  max-width: 1200px;
  margin: 0 auto;
}
 
/* モバイルでは1列に */
@media (max-width: 768px) {
  .layout {
    grid-template-columns: 1fr;
  }
}
css

ダッシュボード風のタイル配置

.dashboard {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 16px;
}
 
.widget-large {
  grid-column: span 2;
  grid-row: span 2;
}
css

Flexbox vs Grid の使い分け

学習者学習者

結局FlexboxとGrid、どっちを使えばいいの?両方できるパターンもあるよね?

観点FlexboxGrid
次元1次元(行 or 列)2次元(行と列)
向いている場面ナビ・ボタン並び・カード1行ページレイアウト・複数行グリッド
アイテム配置の主導権アイテム主導(中身に応じて伸縮)コンテナ主導(枠を先に決める)
コンテンツ量が不定のとき得意(中身に合わせて伸縮)やや苦手(枠が先に決まるため)

実務では両方を組み合わせます。外側のページ構造はGrid、内側のUIコンポーネントはFlexboxというパターンが多いです。

/* ページ全体 → Grid */
.page {
  display: grid;
  grid-template-columns: 240px 1fr;
}
 
/* ナビゲーション(Grid内のアイテム)→ Flexbox */
.nav {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
css

よくあるハマりどころ

auto-fill で意図しない隙間が出る

auto-fill は余ったスペースに空のトラックを確保します。アイテムが少ないときに右側が空くのはこのためです。アイテムを引き伸ばしたい場合は auto-fit に変えてみてください。

grid-template-areas の綴りミス

grid-area: heaer;(typo)のように、grid-template-areas で定義した名前と grid-area の値が一致しないと、そのアイテムは配置されません。DevToolsの「Grid」オーバーレイでエリアが表示されるので確認しましょう。

IE11はGridの旧仕様しかサポートしない

IE11では grid-template-areasgap が使えません。2024年以降のプロジェクトであればIE対応は不要ですが、レガシー環境では注意が必要です。


ちゃんと使うためのポイント

  • fr 単位と auto-fill + minmax の組み合わせはレスポンシブグリッドの定石
  • grid-template-areas でレイアウトの意図をコードに残す
  • Flexboxは「1方向の並び」、Gridは「行×列の2次元」と使い分ける
  • DevToolsの「Grid」オーバーレイを活用して、ラインやエリアの配置を目視確認する

次の章では、画面サイズに応じてレイアウトを切り替えるレスポンシブデザインとメディアクエリを学びます。

参考リンク

CSSクイズに挑戦するこの章で学んだCSSの知識を、4択クイズでアウトプットして定着させよう