1. はじめに:なぜCSS Gridでカードレイアウトを組むのか
Webサイトのトップページやブログ一覧、制作実績ギャラリーなどで頻繁に使われるのが「カードレイアウト」です。画像+テキストを整然と配置できるため、視認性が高く、情報を整理して伝えるのに適したデザインです。
カードレイアウトを実装する方法としては、Flexbox、float、tableなどがありますが、複数の行・列を扱う場合や、列数を自動調整したレスポンシブ対応を行いたい場合は、CSS Gridを使う方が圧倒的にシンプルで柔軟です。
特に、以下のような要望がある場合にCSS Gridは強力です。
- PCでは2列または3列、スマホでは1列にしたい
- カード数が増減してもきれいに自動配置したい
- 高さが異なるカードが並んでもレイアウト崩れを防ぎたい
- minmax() や auto-fit を使って画面幅に応じて列数を増減させたい
- コードを簡潔にし、メンテナンスしやすくしたい
本記事では、まずPC2列・スマホ1列の基本レイアウトから始め、次に grid-template-columns の考え方、さらに repeat(auto-fit, minmax()) を使った応用編まで段階的に学べるように構成しています。
2. 基本レイアウト:PCで2列・スマホで1列を作る
まずは最も基本的な「PCではカードを横に2枚並べる・スマホでは1列にする」レイアウトを実装します。これはシンプルなCSS Gridとメディアクエリで実現できます。
HTML
<div class="card-list"> <div class="card">Card 1</div> <div class="card">Card 2</div> <div class="card">Card 3</div> <div class="card">Card 4</div> </div>
CSS
.card-list {
display: grid;
grid-template-columns: 1fr 1fr; /* PCでは2列 */
gap: 20px;
}
.card {
background: #f5f5f5;
padding: 20px;
border-radius: 8px;
}
/* スマホ(768px以下)では1列にする */
@media (max-width: 768px) {
.card-list {
grid-template-columns: 1fr;
}
}
この段階では、列数を手動で指定しているのでシンプルですが、カード数が増えるたびに「何列にするか」をCSS側で調整する必要があります。
そこで次は、Gridの中核となる grid-template-columns と repeat() の仕組みを理解していきます。
3. grid-template-columns と repeat の基本
カードレイアウトをCSS Gridで作る際、最も重要になるのが grid-template-columns の指定方法です。このプロパティは「何列にするか」だけでなく「列幅をどうするか」まで指定できるため、Gridレイアウトの中心的な役割を担います。
3-1. 固定列数で指定するケース
もっとも基本的な指定方法は、次のように幅(または比率)を指定して列を並べる方法です。
.card-list {
display: grid;
grid-template-columns: 1fr 1fr; /* 2列 */
}
1fr は「余白を含めた幅全体のうち1単位分(fraction: 分割)」という意味で、2つ並べると均等に左右へと配置されます。
3列にしたい場合は以下のように書けます。
grid-template-columns: 1fr 1fr 1fr; /* 3列 */
ただし、列数が増えるたびに毎回このように書くのは面倒です。そこで repeat() を使います。
3-2. repeat() の基本構文
grid-template-columns: repeat(3, 1fr); /* 1fr を3回繰り返す → 3列 */
repeat() は、同じ値を複数回繰り返すときに使います。次の2つは同じ意味になります。
grid-template-columns: 1fr 1fr 1fr; grid-template-columns: repeat(3, 1fr);
3-3. 固定幅とfrの違い
カード幅を固定したい場合は、px などの絶対値でも指定できます。
grid-template-columns: 300px 300px;
ただし、この方法では画面幅が300px×2より小さくなるとレイアウトが崩れてしまいます。
そこで fr や minmax() と組み合わせると、固定幅+柔軟な伸び縮みが可能になります。
次の章では、Gridをさらに強力に使うために欠かせない minmax() と auto-fit を解説していきます。
4. auto-fit + minmax を使ったレスポンシブなカードレイアウト
これまでのコードでは、列数を 1fr 1fr や repeat(3, 1fr) のように「固定」で指定していました。
しかし、実際のWeb制作では次のような要望が多くあります。
- 画面幅に応じてカードの列数を自動で増やしたい
- スマホでは1列、タブレットでは2列、PCでは3列以上にしたい
- カードの最小サイズを300pxに保ちながら、空きスペースがあれば横に広げたい
このような「可変レイアウト」をシンプルに実現するのが、次の構文です。
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
4-1. minmax(最小値, 最大値) の意味
minmax() は、列の幅に「これ以上小さくしたくない最小値」と「これ以上大きくしなくてよい最大値」を指定できます。
minmax(300px, 1fr)
- 最小 300px:カードの幅が300pxより小さくならない
- 最大 1fr:余ったスペースがあれば広く使う
4-2. auto-fit とは何か?
repeat() の第1引数が、これまでの 2 や 3 のような具体的な数字ではなく、auto-fit になることで「カードを可能なだけ横に詰める」という動きになります。
repeat(auto-fit, minmax(300px, 1fr))
- 画面にカードが2枚入るなら2列
- 3枚入るなら3列
- 1枚しか入らない幅なら自動で1列
このように、画面幅に合わせてカード数を自動調整してくれます。
4-3. 実際のコード例
.card-list {
display: grid;
gap: 20px;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
}
.card {
background-color: #f5f5f5;
padding: 20px;
border-radius: 8px;
}
このコードだけで、以下のような動作が実現されます。
| 画面幅 | 表示列数 |
|---|---|
| 1200px以上 | 3列(または4列も可) |
| 900px | 2列 |
| 600px以下 | 自動で1列 |
つまり、メディアクエリを書かなくても、カードが自動的に折り返される ようになります。
4-4. auto-fit と auto-fill の違い
似たような構文として auto-fill があります。
| 指定 | 特徴 |
|---|---|
| auto-fit | 空きスペースがあれば列を圧縮して詰める |
| auto-fill | 空きスペースにも「見えない空列」を保とうとする |
通常のカードレイアウトでは auto-fit の方が自然に動作するため、本記事では auto-fit を中心に使用します。
5. 応用パターン:2列・3列・4列・カードサイズの調整
このように、CSS Grid を使うと「列の数を自動で増やす」「最小幅を守りながら崩れないレイアウトにする」ことが自由に行えます。
これまでに、CSS Grid の基本と repeat(auto-fit, minmax()) を使ったカードレイアウトを学びました。
ここでは、実際の制作で使いやすいコードパターンとして次の4つを紹介します。
- PC2列・スマホ1列(基本)
auto-fitを使った2〜4列の自動レイアウト- カードの最小幅を変えたレイアウト(200px / 250px / 350px など)
auto-fitとメディアクエリを併用した安定レイアウト
5-1. 基本形:PC2列・スマホ1列
.card-list {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
@media (max-width: 768px) {
.card-list {
grid-template-columns: 1fr;
}
}
5-2. より柔軟なレイアウト:auto-fit + minmax
.card-list {
display: grid;
gap: 20px;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
}
画面幅によって自動的に1列〜4列に変化します。
300px × 2 以上の余白があれば2列に、900px以上なら3列、1200px以上なら4列にできます。
5-3. 最小サイズを変えたバリエーション
/* 200px以上のカードが収まるだけ並べる */
.card-list.min200 {
display: grid;
gap: 20px;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
/* 250px以上なら3列以上になる */
.card-list.min250 {
display: grid;
gap: 20px;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}
/* 350px以上と大きめのカード配置 */
.card-list.min350 {
display: grid;
gap: 20px;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
}
5-4. 自動レイアウト+メディアクエリで安定感を高める
実務では「スマホだけは1列で固定したい」というケースも多くあります。
その場合、次のように組み合わせます。
.card-list {
display: grid;
gap: 20px;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
}
@media (max-width: 600px) {
.card-list {
grid-template-columns: 1fr;
}
}
5-5. 何列になるか簡単にイメージできる表
| 画面幅 | minmax(300px) の場合 | minmax(250px) の場合 |
|---|---|---|
| 500px | 1列 | 2列 |
| 800px | 2列 | 3列 |
| 1100px | 3列 | 4列 |
| 1400px | 4列 | 5列も可能 |
6. FlexboxではなくCSS Gridを使う理由と、よくある質問
カードレイアウトは「Flexbox」でも作成できますが、本記事ではCSS Gridを推奨しています。ここでは、その理由と実務でよく出る疑問点を整理します。
6-1. FlexboxとGridの違い
| 比較項目 | Flexbox | CSS Grid |
|---|---|---|
| 配置方向 | 1方向(横方向または縦方向) | 2方向(行×列を同時に管理) |
| 位置制御 | 主に横並び/縦並びで調整 | 行と列を同時にレイアウト可能 |
| 列数の自動調整 | 自力で算出が必要 | auto-fit / minmax で簡単に可能 |
| 高さの揃え方 | align-items / stretch で可能だが制限あり | 同じ行・列内で自然に揃う |
| 複雑なレイアウト | カード程度なら可能 | ヘッダー・メイン・サイドバーなど全面的に強い |
カードを複数行に並べ、「横幅に応じて列数を自動調整したい」場合、FlexboxではJavaScriptや計算を併用する必要があります。
一方、CSS Gridでは repeat(auto-fit, minmax()) の一行で完結します。
6-2. よくある疑問
Q1:auto-fit と auto-fill の違いは?
| 用語 | 動きの違い |
|---|---|
| auto-fit | 余ったスペースでは列を縮めて詰める |
| auto-fill | 余ったスペースでも空の列を確保しようとする |
実務では auto-fitの方が自然に詰める ため、カードレイアウトではほぼ auto-fit を使用します。
Q2:minmax(300px, 1fr) の「1fr」はなぜ必要?
答え:カードが300px以上の場合は余白を均等に広げるためです。
minmax(300px, 300px)にすると横幅が固定され、余白が発生minmax(300px, 1fr)にすることで、動的に幅を広げつつ整列可能- どの幅でもカードがきれいに中央に並びます
Q3:メディアクエリは不要になりますか?
完全に不要ではありません。次のような場合にはメディアクエリを併用します。
- スマホだけ1列に固定したい
- スマホ時のみ余白やフォントサイズを変更したい
- レイアウトはGrid、自分のデザインはメディアクエリで調整する方が自然な場合
@media (max-width: 600px) {
.card-list {
grid-template-columns: 1fr;
}
}
Q4:画像の高さがバラバラになって揃わないときは?
対策として以下の方法がよく使われます。
.card img {
width: 100%;
height: 200px;
object-fit: cover;
}
6-3. まとめ
- Flexboxは「1方向」の並び。Gridは「2方向」全体のレイアウトに強い
repeat(auto-fit, minmax())を使えばカードの幅や列数を自動で調整できる- メディアクエリと組み合わせることで、より実務的で崩れないカードデザインになる
カードレイアウトは、Webサイトの見栄えと情報整理の両方に関わる重要なデザイン要素です。CSS Gridを理解しておけば、今後のデザインや開発でも応用できる場面が必ずあります。
ぜひ、実際のポートフォリオやWordPressテーマにも組み込みながら、自分のデザインに落とし込んでみてください。

