CSS

CSSレスポンシブカード一覧|Grid・flexで自動折り返し

CSS Gridとflexでレスポンシブなカード一覧を作る方法を20パターンで解説します。auto-fit、minmax、flex-wrap、高さ揃え、画像比率、スマホ対応のコピペコードを紹介します。

この記事の目次
  1. 1. auto-fitで自動折り返しするカード一覧
  2. 2. auto-fillで空の列も維持する
  3. 3. スマホ1列・PC3列にする
  4. 4. スマホ1列・タブレット2列・PC4列
  5. 5. flex-wrapで折り返すカード一覧
  6. 6. カードの高さを揃える
  7. 7. ボタン位置を下に揃える
  8. 8. 画像比率を揃えるカード一覧
  9. 9. gapを画面幅に合わせて変える
  10. 10. 最大幅つきカード一覧
  11. 11. 小さなカードをたくさん並べる
  12. 12. 大きめカードをゆったり並べる
  13. 13. 最初のカードだけ大きくする
  14. 14. スマホでは横スクロールにするカード一覧
  15. 15. リスト表示からカード表示へ切り替える
  16. 16. 商品カード一覧のグリッド
  17. 17. カードが横にはみ出すときの対策
  18. 18. CSS変数で最小幅と余白を管理する
  19. 19. カード単体の装飾を最小にした一覧
  20. 20. レスポンシブカード一覧の最小テンプレート
  21. カード一覧が崩れる原因
  22. まとめ

カード一覧は、スマホでは1列、PCでは2列や3列にしたい場面が多いUIです。

この記事では、CSS Gridとflexで作るレスポンシブなカード一覧を20パターンに分けて紹介します。auto-fitminmax()flex-wrap、高さ揃え、画像比率、スマホ対応まで、コピーしやすい形でまとめます。

1. auto-fitで自動折り返しするカード一覧

もっとも使いやすい基本形です。入る数だけ自動で列を作ります。

<div class="card-grid-auto">
  <article>カード1</article>
  <article>カード2</article>
  <article>カード3</article>
</div>
.card-grid-auto {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 24px;
}

.card-grid-auto article {
  padding: 20px;
  background: #fff;
  border: 1px solid #e5e7eb;
  border-radius: 8px;
}

カード一覧の基本は、この repeat(auto-fit, minmax()) から始めると便利です。

2. auto-fillで空の列も維持する

auto-fill は空の列も確保しやすい指定です。

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

多くの場合は auto-fit が扱いやすいですが、空の列を保ちたいときは auto-fill も候補です。

3. スマホ1列・PC3列にする

列数をはっきり決めたい場合は、メディアクエリで切り替えます。

.card-grid-3 {
  display: grid;
  grid-template-columns: 1fr;
  gap: 20px;
}

@media (min-width: 768px) {
  .card-grid-3 {
    grid-template-columns: repeat(3, 1fr);
  }
}

列数を固定したい記事一覧や商品一覧に向いています。

4. スマホ1列・タブレット2列・PC4列

表示幅ごとに列数を段階的に増やす例です。

.card-grid-steps {
  display: grid;
  grid-template-columns: 1fr;
  gap: 20px;
}

@media (min-width: 640px) {
  .card-grid-steps {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 1024px) {
  .card-grid-steps {
    grid-template-columns: repeat(4, 1fr);
  }
}

商品数が多い一覧では、段階的な列数指定が使いやすいです。

5. flex-wrapで折り返すカード一覧

flexで作る場合は、flex-wrap を使います。

.card-flex-wrap {
  display: flex;
  flex-wrap: wrap;
  gap: 24px;
}

.card-flex-wrap article {
  flex: 1 1 260px;
}

カードの高さや行の揃いを管理したい場合は、Gridの方がわかりやすいことが多いです。

6. カードの高さを揃える

Gridでは、同じ行のカードの高さが自然に揃いやすいです。

.card-grid-equal {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 24px;
  align-items: stretch;
}

.card-grid-equal article {
  display: grid;
  padding: 20px;
  border: 1px solid #e5e7eb;
  border-radius: 8px;
}

カード単体を display: grid; にしておくと、中身の配置もしやすくなります。

7. ボタン位置を下に揃える

本文量が違うカードでも、ボタンを下に揃える例です。

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

.card-grid-button article {
  display: flex;
  flex-direction: column;
  padding: 20px;
  border: 1px solid #e5e7eb;
  border-radius: 8px;
}

.card-grid-button .button {
  margin-top: auto;
}

ボタンの見た目は、CSSボタンデザイン集 と分けて扱います。

8. 画像比率を揃えるカード一覧

画像付きカードでは、画像の比率を揃えると一覧が整います。

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

.card-grid-image img {
  display: block;
  width: 100%;
  aspect-ratio: 16 / 9;
  object-fit: cover;
  border-radius: 8px 8px 0 0;
}

画像サイズがバラバラでも、aspect-ratioobject-fit で見た目を揃えられます。

9. gapを画面幅に合わせて変える

余白を固定せず、画面幅に合わせて少し変えたい場合の例です。

.card-grid-gap {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: clamp(16px, 3vw, 32px);
}

clamp() を使うと、最小・可変・最大の余白をまとめて指定できます。

10. 最大幅つきカード一覧

一覧全体を中央に置き、広がりすぎないようにする例です。

.card-grid-container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 24px;
  max-width: 1120px;
  margin: 0 auto;
  padding: 0 20px;
}

ページ全体の余白とカード一覧の最大幅をそろえると、レイアウトが安定します。

11. 小さなカードをたくさん並べる

タグカードやカテゴリカードのような小さめのカード一覧です。

.card-grid-small {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: 14px;
}

.card-grid-small article {
  padding: 14px;
  background: #f8fafc;
  border-radius: 8px;
}

最小幅を小さくすると、1行に入るカード数が増えます。

12. 大きめカードをゆったり並べる

記事カードや実績カードを大きめに見せたい場合の例です。

.card-grid-large {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
  gap: 32px;
}

最小幅を大きくすると、1枚ずつのカードがゆったり見えます。

13. 最初のカードだけ大きくする

最新記事や注目記事を大きく見せたい場合の例です。

.card-grid-featured {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 24px;
}

.card-grid-featured article:first-child {
  grid-column: 1 / -1;
}

@media (max-width: 700px) {
  .card-grid-featured {
    grid-template-columns: 1fr;
  }
}

重要なカードだけを大きくすると、一覧にメリハリが出ます。

14. スマホでは横スクロールにするカード一覧

スマホでカードを横に流したい場合の例です。

.card-scroll-mobile {
  display: grid;
  grid-auto-columns: minmax(240px, 80%);
  grid-auto-flow: column;
  gap: 16px;
  overflow-x: auto;
  padding-bottom: 8px;
}

@media (min-width: 768px) {
  .card-scroll-mobile {
    grid-auto-flow: row;
    grid-template-columns: repeat(3, 1fr);
    overflow: visible;
  }
}

横スクロールは便利ですが、重要な情報が隠れすぎないようにします。

15. リスト表示からカード表示へ切り替える

スマホでは縦リスト、PCではカードグリッドにする例です。

.card-list-to-grid {
  display: grid;
  gap: 16px;
}

@media (min-width: 768px) {
  .card-list-to-grid {
    grid-template-columns: repeat(3, 1fr);
    gap: 24px;
  }
}

スマホで1列にしておくと、長いタイトルでも読みやすくなります。

16. 商品カード一覧のグリッド

商品一覧向けに、カード幅を少し小さめにした例です。

.product-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 20px;
}

.product-grid article {
  min-width: 0;
}

商品数が多い場合は、最小幅を小さめにすると一覧性が上がります。

17. カードが横にはみ出すときの対策

長い文字や画像でカード一覧が横にはみ出る場合の対策です。

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

.card-grid-overflow article {
  min-width: 0;
}

.card-grid-overflow img {
  max-width: 100%;
  height: auto;
}

.card-grid-overflow h3 {
  overflow-wrap: anywhere;
}

min-width: 0; と文字の折り返し指定を入れると崩れにくくなります。

18. CSS変数で最小幅と余白を管理する

複数のカード一覧で使い回す場合は、変数にしておくと便利です。

.card-grid-variable {
  --card-min: 240px;
  --card-gap: 24px;

  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(var(--card-min), 1fr));
  gap: var(--card-gap);
}

ページごとに --card-min を変えるだけで、列数を調整できます。

19. カード単体の装飾を最小にした一覧

一覧レイアウトの確認用として、カード装飾を薄くした例です。

.card-grid-simple {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 20px;
}

.card-grid-simple article {
  padding: 18px;
  background: #f8fafc;
  border-radius: 8px;
}

カード単体のデザインは、CSSカードデザイン集 に分けると重複を避けられます。

20. レスポンシブカード一覧の最小テンプレート

最後に、まずコピーするならこの形です。

<div class="card-grid-template">
  <article>カード1</article>
  <article>カード2</article>
  <article>カード3</article>
</div>
.card-grid-template {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 24px;
}

.card-grid-template article {
  min-width: 0;
  padding: 20px;
  background: #fff;
  border: 1px solid #e5e7eb;
  border-radius: 8px;
}

自動折り返し、余白、はみ出し対策を含んだ実用的なテンプレートです。

カード一覧が崩れる原因

  • スマホでも固定の列数にしている
  • 画像サイズや比率がバラバラになっている
  • 長いタイトルが折り返されず幅を押し広げている
  • gap を考えずに幅を指定している
  • カード単体の高さを無理に固定している

まとめ

レスポンシブなカード一覧は、Gridの repeat(auto-fit, minmax()) を使うと少ないCSSで対応できます。

カード単体のデザインは CSSカードデザイン集、Gridの基本は CSS Gridの使い方 で補足すると、記事同士の役割が明確になります。