web制作のポイント

CSS Gridパターン・レイアウト集|よく使う10パターンをコード付きで解説

更新日:2026-05-15 著者:unigram 読了目安:13分

この記事の要点

CSS Gridのよく使うパターンをプレビュー+HTML/CSSタブ付きコードでまとめたリファレンス記事。等幅カラム・auto-fill・セル結合・名前付きエリア・dense・レスポンシブ対応まで全10パターンを解説します。

「GridとFlexboxってどう使い分ければいいの?」という疑問をよく耳にします。

簡単に言うと、Flexboxは「1方向(行か列)」のレイアウト、Gridは「縦横2方向」のレイアウトに向いています。この記事では、実際のWeb制作でよく使うCSS Gridのパターンをプレビュー+コード付きでまとめました。

この記事でわかること

  • CSS Gridの基本(等幅カラム・自動折り返し)
  • セルの結合・名前付きエリアの使い方
  • 複雑なサイトレイアウトの組み方
  • レスポンシブ対応(@media切り替え・auto-fill)

CSS Gridとは?

CSS Grid(グリッド)は、縦横2方向のグリッド(格子状の枠)を定義してレイアウトを組む手法です。親要素に display: grid を指定すると、子要素をグリッドのセルに自動で配置できます。

用語 説明
Gridコンテナ display: grid を指定した親要素
Gridアイテム Gridコンテナの直接の子要素
fr(フラクション) 余ったスペースを比率で分割する単位。1fr 2fr なら 1:2 で分割
グリッドライン 列・行を区切る境界線。1から番号が振られる
gap セルとセルの間の隙間

 


基本パターン編

01

等幅カラム(repeat + fr)

最も基本的なグリッド。repeat(3, 1fr) で「3列・均等幅」を定義する。fr は余ったスペースを比率で分割する単位。

display: gridgrid-template-columns: repeat(3, 1fr)gap: 12px
Preview
アイテム A
アイテム B
アイテム C
アイテム D
アイテム E
アイテム F
HTMLCSS
index.htmlcopy
<div class="grid">
  <div>アイテム A</div>
  <div>アイテム B</div>
  <div>アイテム C</div>
  <div>アイテム D</div>
  <div>アイテム E</div>
  <div>アイテム F</div>
</div>
style.csscopy
.grid {
  display: grid;                          /* グリッドレイアウトを有効化する */
  grid-template-columns: repeat(3, 1fr);  /* 3列・各列が均等幅(frは余白を比率で分割する単位) */
  gap: 12px;                             /* セルどうしの縦横の隙間を12pxに設定 */
}
02

自動折り返しカード(auto-fill + minmax)

親幅に応じて列数が自動で増減するレスポンシブカードグリッド。auto-fill でできるだけ多くの列を並べ、minmax(200px, 1fr) で最小幅200px・余白は均等分配する。

repeat(auto-fill, minmax(200px, 1fr))
Preview
カード A
カード B
カード C
カード D
カード E
カード F
カード G
↑ ウィンドウ幅を変えると列数が自動で変わる
HTMLCSS
index.htmlcopy
<div class="card-grid">
  <div class="card">カード A</div>
  <div class="card">カード B</div>
  <!-- ...続く -->
</div>
style.csscopy
.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  /* auto-fill          → 親幅に収まる限り、できるだけ多くの列を並べる */
  /* minmax(200px, 1fr) → 最小幅200px、最大は余白を均等に伸ばす */
  /* → 幅が広ければ多列、狭ければ少列に自動で変わる */
  gap: 16px;
}
03

セルの結合(grid-column / grid-row)

特定のセルを複数列・複数行にまたがらせるパターン。grid-column: span 2 で「2列分の幅を占有」を指定する。ダッシュボードや特集記事に使う。

grid-column: span 2grid-row: span 2
Preview
横2列 × 縦2行
grid-column: span 2 / grid-row: span 2
C
D
横2列grid-column: span 2
F
HTMLCSS
index.htmlcopy
<div class="grid">
  <div class="big">横2列 × 縦2行</div>
  <div>C</div>
  <div>D</div>
  <div class="wide">横2列</div>
  <div>F</div>
</div>
style.csscopy
.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 120px;  /* 自動生成される行の高さを120pxに設定 */
  gap: 10px;
}
.big {
  grid-column: span 2;  /* 横方向に2列分の幅を占有する */
  grid-row: span 2;     /* 縦方向に2行分の高さを占有する */
}
.wide {
  grid-column: span 2;  /* 横方向だけ2列分の幅を占有する */
}

レイアウト応用編

04

名前付きエリア(grid-template-areas)

グリッドの各エリアに名前をつけてレイアウトを定義する。CSSだけでページ構造が一目でわかり、メンテナンスしやすい。サイト全体のレイアウトに最適。

grid-template-areasgrid-area: header / sidebar / main / footer
Preview
ヘッダー(header)
メイン(main)
カード A
カード B
フッター(footer)© 2025
HTMLCSS
index.htmlcopy
<body class="layout">
  <header>ヘッダー</header>
  <nav class="sidebar">
    <p>概要</p> <p>プロジェクト</p> <p>設定</p>
  </nav>
  <main>メインコンテンツ</main>
  <footer>© 2025 My Site</footer>
</body>
style.csscopy
.layout {
  display: grid;
  grid-template-columns: 200px 1fr;    /* サイドバー200px固定、メインが残りを占有 */
  grid-template-rows: 60px 1fr 50px;   /* ヘッダー60px、メイン可変、フッター50px */
  min-height: 100vh;                   /* 最低でも画面の高さ全体を確保する */
  grid-template-areas:
    "header  header"   /* 1行目:ヘッダーが2列すべてを占有 */
    "sidebar main"     /* 2行目:左にサイドバー、右にメイン */
    "footer  footer";  /* 3行目:フッターが2列すべてを占有 */
}
header   { grid-area: header;  }  /* "header" エリアに配置する */
.sidebar { grid-area: sidebar; }  /* "sidebar" エリアに配置する */
main     { grid-area: main;    }  /* "main" エリアに配置する */
footer   { grid-area: footer;  }  /* "footer" エリアに配置する */
05

異なる列幅の混在(fr + px + auto)

固定幅・自動幅・可変幅を混在させるパターン。200px 1fr auto のように単位を混ぜることができる。サイドバー固定・メイン可変・ボタン幅自動などに使う。

grid-template-columns: 140px 1fr auto
Preview
140px
左ナビ(固定)
1fr
メイン(残りを占有)
auto
ボタン(中身の幅)
140px固定
可変幅
自動サイズ
HTMLCSS
index.htmlcopy
<body class="layout">
  <nav>左ナビ(200px)</nav>
  <main>メインコンテンツ(残りを占有)</main>
  <button>+ 新規作成</button>
</body>
style.csscopy
.layout {
  display: grid;
  grid-template-columns: 200px 1fr auto;
  /* 200px → 左カラムを200pxに固定する */
  /* 1fr   → 中央カラムが残りのスペースをすべて占有して伸縮する */
  /* auto  → 右カラムは内側のコンテンツの幅に合わせて自動調整 */
  gap: 16px;
}
06

行の高さ指定(grid-template-rows)

列だけでなく行の高さも明示的に指定できる。grid-template-rows で各行の高さを定義する。ヘッダー・メイン・フッターの高さを決めたいときに使う。

grid-template-rows: 60px 1fr 40px
Preview
ヘッダー行(50px)
コンテンツ A(100px)
コンテンツ B(100px)
コンテンツ C(100px)
フッター行(40px)
HTMLCSS
index.htmlcopy
<body class="grid">
  <header>ヘッダー(60px)</header>
  <div class="content">コンテンツ A</div>
  <div class="content">コンテンツ B</div>
  <div class="content">コンテンツ C</div>
  <footer>フッター(50px)</footer>
</body>
style.csscopy
.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: 60px 1fr 50px;  /* 1行目60px・2行目可変・3行目50px */
  min-height: 100vh;               /* 1fr を機能させるため高さを確保 */
  gap: 8px;
}
header { grid-column: span 3; }  /* ヘッダーは3列すべてにまたがる */
footer { grid-column: span 3; }  /* フッターは3列すべてにまたがる */

配置コントロール編

07

セル内の配置(justify-items / align-items)

グリッドセルの内側でのアイテムの配置を制御するパターン。justify-items で水平方向、align-items で垂直方向の揃えを全セルに一括指定できる。個別に変えたい場合は justify-self / align-self を使う。

justify-items: start / center / end / stretchalign-items: start / center / end / stretch
Preview
start
左上
center
中央
end
右下
stretch
引き伸ばし
HTMLCSS
index.htmlcopy
<div class="grid">
  <div class="cell cell-start">
    <div class="item">start(左上)</div>
  </div>
  <div class="cell cell-center">
    <div class="item">center(中央)</div>
  </div>
  <div class="cell cell-end">
    <div class="item">end(右下)</div>
  </div>
  <div class="cell cell-stretch">
    <div class="item">stretch(引き伸ばし)</div>
  </div>
</div>
style.csscopy
.grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 12px;
  justify-items: center;  /* 水平方向:start / center / end / stretch */
  align-items: center;    /* 垂直方向:start / center / end / stretch */
}
/* 個別セルだけ変えたい場合は justify-self / align-self を使う */
.special {
  justify-self: end;   /* このセルだけ右揃えにする */
  align-self: start;  /* このセルだけ上揃えにする */
}
08

ライン番号での配置(grid-column: 1 / 3)

グリッドのライン番号を直接指定してセルを配置するパターン。grid-column: 1 / 3 は「1番ラインから3番ラインまで=2列分」を意味する。複雑なレイアウトや特集枠に使う。

grid-column: 1 / 3grid-row: 1 / 3
Preview
🌟 特集
grid-column: 1/3 · grid-row: 1/3
記事 A
記事 B
ワイド記事grid-column: 3/5
記事 C
記事 D
記事 E
記事 F
HTMLCSS
index.htmlcopy
<div class="grid">
  <div class="feature">🌟 特集記事</div>
  <div>記事 A</div>
  <div>記事 B</div>
  <div class="wide">ワイド記事</div>
  <div>記事 C</div> <div>記事 D</div> <div>記事 E</div> <div>記事 F</div>
</div>
style.csscopy
.grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);  /* 4列・均等幅 */
  grid-auto-rows: 120px;                  /* 自動生成される行の高さを120pxに設定 */
  gap: 10px;
}
.feature {
  grid-column: 1 / 3;  /* 列:1番ラインから3番ラインまで(= 2列分の幅) */
  grid-row: 1 / 3;     /* 行:1番ラインから3番ラインまで(= 2行分の高さ) */
}
.wide {
  grid-column: 3 / 5;  /* 列:3番ラインから5番ラインまで(= 2列分の幅) */
}
09

隙間を自動で埋める(grid-auto-flow: dense)

大きいセルの隙間を後続のセルで自動的に埋めるパターン。grid-auto-flow: dense を指定すると、余白をなるべく詰めるように配置される。画像ギャラリーに最適。

grid-auto-flow: dense
Preview
2×2span2 × span2
1×1
1×1
2×1span2
1×1
1×2span2
1×1
1×1
1×1
↑ 大きいセルの隙間に小さいセルが自動で入る
HTMLCSS
index.htmlcopy
<div class="gallery">
  <div class="large">🖼 大きい画像</div>
  <div>画像 A</div>
  <div>画像 B</div>
  <div class="tall">縦長</div>
  <div>画像 C</div> <div>画像 D</div> <div>画像 E</div>
</div>
style.csscopy
.gallery {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 150px;                 /* 基準となる行の高さを150pxに設定 */
  grid-auto-flow: dense;                 /* 大きいセルが空けた隙間に後続セルを自動で詰める */
  gap: 10px;
}
.large {
  grid-column: span 2;  /* 横方向に2列分の幅を占有する */
  grid-row: span 2;     /* 縦方向に2行分の高さを占有する */
}
.tall {
  grid-row: span 2;  /* 縦方向だけ2行分の高さを占有する */
}

レスポンシブ対応編

10

レスポンシブ:@media で列数を切り替え

PCでは3列、スマートフォンでは1列に切り替えるパターン。@mediagrid-template-columns を上書きするだけで実現できる。auto-fill + minmax を使えば @media なしで対応可能なケースも多い。

repeat(3, 1fr)(PC)1fr(SP・1列)@media (max-width: 768px)
Preview
🖥 PC — repeat(3, 1fr)
セクション A
セクション B
セクション C
📱 SP — 1fr(1列)
セクション A
セクション B
セクション C
HTMLCSSCSS — auto-fill(@media 不要)
index.htmlcopy
<div class="grid">
  <section>
    <h2>セクション A</h2>
    <p>コンテンツ A の内容をここに書きます。</p>
  </section>
  <section>
    <h2>セクション B</h2>
    <p>コンテンツ B の内容をここに書きます。</p>
  </section>
  <section>
    <h2>セクション C</h2>
    <p>コンテンツ C の内容をここに書きます。</p>
  </section>
</div>
style.csscopy
/* PC:3列 */
.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);  /* 3列・均等幅 */
  gap: 24px;
}

/* スマホ:1列 */
@media (max-width: 768px) {
  .grid {
    grid-template-columns: 1fr;  /* 1列に変更するだけ */
    gap: 16px;
  }
}
style.css — auto-fill(@media 不要)copy
/* @media 不要・自動でレスポンシブ対応 */
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  /* auto-fill          → 親幅に収まる限りできるだけ多く列を並べる */
  /* minmax(280px, 1fr) → 最小280px・最大は均等に広げる */
  /* → 幅が狭まると自動で列数が減るため @media が不要 */
  gap: 24px;
}

まとめ

  • 基本は display: grid + grid-template-columns + gap
  • fr は余ったスペースを比率で分割する単位。1fr で均等幅
  • auto-fill + minmax() でレスポンシブなカードグリッドが @media なしで作れる
  • grid-column: span N でセルを複数列・行にまたがらせる
  • grid-template-areas で名前付きエリアを使うとレイアウトの見通しが良くなる
  • grid-auto-flow: dense でギャラリーの隙間を自動で埋められる

CSS GridはFlexboxと組み合わせることでより柔軟なレイアウトが作れます。大枠のページ構成にはGrid、その中の要素の並べ方にはFlexboxを使うのが定番の組み合わせです。

 

この記事を書いた人

unigram
web、印刷、映像などの制作をしています。@京都、フリーランス18年目。 大学で講師もしています。 自身の備忘録も兼ねて、Web制作・WordPress・SEO・GA4・生成AI活用をテーマに情報発信しています。わかりやすく優しい内容で記事作成を心がけています。