デモで学ぶ CSS Grid 全プロパティ
グリッドレイアウトの基本から、行・列の指定、セル結合、レスポンシブ対応まで、各プロパティの動作をボタン操作で確認しながらすぐに使えるHTML・CSSのコードをコピーできます。
HTML・CSS・JSコードプレビューツール にて実装確認ができます。
① display: grid — 列数を指定してグリッド化する
grid-template-columns: repeat(3, 1fr)
<div class="container">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
</div>
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
background: #0f172a;
padding: 14px;
border-radius: 10px;
}
.box {
height: 64px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 1rem;
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.box:nth-child(4n+1) { background: linear-gradient(135deg, #06b6d4, #0284c7); }
.box:nth-child(4n+2) { background: linear-gradient(135deg, #ec4899, #be185d); }
.box:nth-child(4n+3) { background: linear-gradient(135deg, #22c55e, #15803d); }
.box:nth-child(4n+4) { background: linear-gradient(135deg, #f97316, #c2410c); }
親要素に指定すると、子要素が自動的にグリッドの升目に配置されます。何列にするかは grid-template-columns で指定します。
「1fr の幅の列を3つ繰り返す」という意味です。grid-template-columns: 1fr 1fr 1fr; と書いたのと同じ結果になりますが、repeat() を使うと列数が増えても書き換えが簡単です。
② grid-template-columns — 列幅の比率を変える(fr単位)
grid-template-columns: 1fr 1fr 1fr
<div class="container">
<div class="box">A</div>
<div class="box">B</div>
<div class="box">C</div>
</div>
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px;
background: #0f172a;
padding: 14px;
border-radius: 10px;
}
.box {
height: 64px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 1rem;
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.box:nth-child(1) { background: linear-gradient(135deg, #06b6d4, #0284c7); }
.box:nth-child(2) { background: linear-gradient(135deg, #ec4899, #be185d); }
.box:nth-child(3) { background: linear-gradient(135deg, #22c55e, #15803d); }
fr は「残りの幅をどの比率で分けるか」を表す単位です。2fr 1fr 1fr なら、幅を2:1:1の比率で3列に分割します。
100px 1fr 1fr のように固定幅とfrを組み合わせると、最初の列だけ固定幅にして残りを可変にする、といった実用的なレイアウトが作れます。
③ grid-template-rows — 行の高さを指定する
grid-template-rows: auto auto
<div class="container">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
</div>
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: auto auto;
gap: 10px;
background: #0f172a;
padding: 14px;
border-radius: 10px;
}
.box {
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 1rem;
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
padding: 22px 0;
}
.box:nth-child(4n+1) { background: linear-gradient(135deg, #06b6d4, #0284c7); }
.box:nth-child(4n+2) { background: linear-gradient(135deg, #ec4899, #be185d); }
.box:nth-child(4n+3) { background: linear-gradient(135deg, #22c55e, #15803d); }
.box:nth-child(4n+4) { background: linear-gradient(135deg, #f97316, #c2410c); }
grid-template-columns と同じ書き方で、行の高さを指定できます。auto は内容に合わせた高さ、px は固定、fr は余白の比率分配です。
fr で行の高さを分配するには、親要素(コンテナ)に高さを指定しておく必要があります。高さが auto のままだと余白が生まれないため、fr が効果を発揮できません。
④ gap — セル間の余白を一括指定
gap: 0px
<div class="container">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
</div>
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0px;
background: #0f172a;
padding: 14px;
border-radius: 10px;
}
.box {
height: 64px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 1rem;
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.box:nth-child(4n+1) { background: linear-gradient(135deg, #06b6d4, #0284c7); }
.box:nth-child(4n+2) { background: linear-gradient(135deg, #ec4899, #be185d); }
.box:nth-child(4n+3) { background: linear-gradient(135deg, #22c55e, #15803d); }
.box:nth-child(4n+4) { background: linear-gradient(135deg, #f97316, #c2410c); }
margin で個別に余白を作らなくても、コンテナに gap を指定するだけで、セル同士の間隔を一括管理できます。
gap は row-gap(行間)と column-gap(列間)をまとめて指定するショートハンドです。個別に変えたい場合はそれぞれのプロパティを使います。
⑤ grid-column — セルを横方向に結合する(span)
grid-column: span 1(通常)
<div class="container">
<div class="box box-a">A</div>
<div class="box">B</div>
<div class="box">C</div>
<div class="box">D</div>
</div>
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
background: #0f172a;
padding: 14px;
border-radius: 10px;
}
.box {
height: 64px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 1rem;
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.box-a { background: linear-gradient(135deg, #06b6d4, #0284c7); grid-column: span 1; }
.box:nth-child(2) { background: linear-gradient(135deg, #ec4899, #be185d); }
.box:nth-child(3) { background: linear-gradient(135deg, #22c55e, #15803d); }
.box:nth-child(4) { background: linear-gradient(135deg, #f97316, #c2410c); }
子要素に指定すると、そのセルが横方向に複数列を占有します。ヘッダーやバナーなど、幅広く見せたい要素によく使います。
縦方向に複数行を結合したいときは grid-row: span N を使います。書き方は grid-column と同じです。
⑥ justify-items / align-items — セル内でのアイテムの配置
justify-items: start / align-items: start
<div class="container">
<div class="box">A</div>
<div class="box">B</div>
<div class="box">C</div>
<div class="box">D</div>
</div>
.container {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, 100px);
justify-items: start;
align-items: start;
gap: 10px;
background: #0f172a;
padding: 14px;
border-radius: 10px;
}
.box {
width: 70px;
height: 48px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 1rem;
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.box:nth-child(1) { background: linear-gradient(135deg, #06b6d4, #0284c7); }
.box:nth-child(2) { background: linear-gradient(135deg, #ec4899, #be185d); }
.box:nth-child(3) { background: linear-gradient(135deg, #22c55e, #15803d); }
.box:nth-child(4) { background: linear-gradient(135deg, #f97316, #c2410c); }
各セルの中で、アイテムを横方向のどこに配置するか指定します。初期値は stretch(幅いっぱいに広がる)です。start・center・end を指定すると、アイテム本来の幅で好きな位置に配置できます。
考え方は justify-items と同じで、対象が縦方向になります。特定の1アイテムだけ位置を変えたい場合は、justify-self / align-self を子要素に指定します。
⑦ grid-template-areas — エリア名でレイアウトを組む
レイアウト: PC(2カラム)
<div class="container">
<div class="header">header</div>
<div class="sidebar">sidebar</div>
<div class="main">main</div>
<div class="footer">footer</div>
</div>
.container {
display: grid;
grid-template-columns: 140px 1fr;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
gap: 10px;
background: #0f172a;
padding: 14px;
border-radius: 10px;
}
.header { grid-area: header; background: linear-gradient(135deg, #06b6d4, #0284c7); }
.sidebar { grid-area: sidebar; background: linear-gradient(135deg, #ec4899, #be185d); }
.main { grid-area: main; background: linear-gradient(135deg, #22c55e, #15803d); }
.footer { grid-area: footer; background: linear-gradient(135deg, #f97316, #c2410c); }
.header, .sidebar, .main, .footer {
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
color: #fff;
padding: 16px 0;
}
各セルに grid-area で名前を付け、コンテナ側でその名前を並べて配置図のようにレイアウトを組みます。文字列の見た目が、そのまま画面上の配置と一致するのが特徴です。
ボタンを押すと、HTML の要素順はそのままに、grid-template-areas と grid-template-columns の書き換えだけでスマホ向けの縦並びに切り替わります。メディアクエリの中に書けば、そのままレスポンシブ対応になります。
⑧ repeat(auto-fit, minmax()) — メディアクエリ不要のレスポンシブグリッド
コンテナ幅を変えても、列数が自動で調整されます
<div class="container">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
</div>
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(90px, 1fr));
gap: 10px;
background: #0f172a;
padding: 14px;
border-radius: 10px;
}
.box {
height: 64px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 1rem;
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.box:nth-child(4n+1) { background: linear-gradient(135deg, #06b6d4, #0284c7); }
.box:nth-child(4n+2) { background: linear-gradient(135deg, #ec4899, #be185d); }
.box:nth-child(4n+3) { background: linear-gradient(135deg, #22c55e, #15803d); }
.box:nth-child(4n+4) { background: linear-gradient(135deg, #f97316, #c2410c); }
「最小90px、余りがあれば1frで伸びる」という意味です。repeat(auto-fit, …) と組み合わせることで、コンテナの幅に収まる分だけ列数が自動的に増減します。
画面幅ごとに @media で grid-template-columns を書き換える必要がありません。ブラウザが幅に応じて自動的に列数を計算してくれます。
⑨ 実用パターン — カードレイアウト(画像+タイトル+本文)
グリッドレイアウト入門
display: grid だけで実装できる基本パターン。
レスポンシブ対応
auto-fit と minmax() の組み合わせが便利。
エリア指定レイアウト
grid-template-areas で配置図通りに組む。
<div class="cards">
<div class="card">
<div class="card-thumb"></div>
<p class="card-title">グリッドレイアウト入門</p>
<p class="card-text">display: grid だけで実装できる基本パターン。</p>
</div>
<div class="card">
<div class="card-thumb"></div>
<p class="card-title">レスポンシブ対応</p>
<p class="card-text">auto-fit と minmax() の組み合わせが便利。</p>
</div>
<div class="card">
<div class="card-thumb"></div>
<p class="card-title">エリア指定レイアウト</p>
<p class="card-text">grid-template-areas で配置図通りに組む。</p>
</div>
</div>
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 14px;
}
.card {
background: #1a1a2e;
border-radius: 10px;
overflow: hidden;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.card-thumb {
height: 90px;
background: linear-gradient(135deg, #06b6d4, #0284c7);
}
.card-title {
color: #fff;
font-weight: 700;
font-size: 0.9rem;
margin: 10px 12px 4px;
}
.card-text {
color: rgba(255, 255, 255, 0.6);
font-size: 0.78rem;
line-height: 1.6;
margin: 0 12px 12px;
}
ブログの記事一覧やギャラリー表示など、同じ形のカードを並べる場面で頻出のレイアウトです。repeat(auto-fit, minmax()) と組み合わせれば、画面幅に応じたレスポンシブ対応も自動で行われます。
1次元(横一列 or 縦一列)の並びなら Flexbox、行と列を同時に組む2次元のレイアウトなら Grid が向いています。ページ全体の骨組みは Grid、その中のボタン配置などの細かい並びは Flexbox、という組み合わせもよく使われます。
当サイトで公開しているWebデザインやUIの実装例は、一覧として以下記事に纏めています。

