HOME / BLOG
BLOG

CSS Gridのminmax()完全ガイド

minmax()は、CSS Gridで「最小幅は守りたいけど、余ったら伸びてほしい」というレイアウトを作るための関数です。カード一覧、ギャラリー、サイドバー、記事一覧など、レスポンシブなUIでかなり使えます。

この記事では、minmax()の基本構文から、auto-fitauto-fillとの組み合わせ、よくある失敗までまとめます。

minmax()とは

minmax(最小値, 最大値)は、Gridトラックのサイズに下限と上限を指定する関数です。たとえばminmax(240px, 1fr)なら、「最低240px、余ったら1frで伸びる」という意味になります。

grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));

なぜ 1fr だけでは足りないのか

repeat(3, 1fr)のように書くと、常に3列を保とうとします。PCではきれいでも、スマホでは1列あたりの幅が狭くなりすぎて、カードの中身が崩れることがあります。

<section class="cards" aria-label="記事一覧">
  <article class="card">
    <p class="card__label">CSS</p>
    <h2>Flexboxで要素が縮まない原因5選</h2>
    <p>min-widthや固定幅が原因で起きるレイアウト崩れを解説します。</p>
  </article>

  <article class="card">
    <p class="card__label">CSS GRID</p>
    <h2>CSS Gridのminmax()完全ガイド</h2>
    <p>カード一覧やギャラリーを自然にレスポンシブ化します。</p>
  </article>

  <article class="card">
    <p class="card__label">UI</p>
    <h2>疑似要素::before・::afterが表示されない原因7選</h2>
    <p>content、display、position、z-indexを順番に確認します。</p>
  </article>
</section>
.cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
}

minmax()を使うと、カードが最低幅を下回りそうなタイミングで自然に列数が減ります。

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

.card {
  min-width: 0;
  padding: 20px;
  border: 2px solid #111;
  border-radius: 14px;
  background: #fff;
}

.card__label {
  width: fit-content;
  margin: 0 0 12px;
  padding: 4px 10px;
  border-radius: 999px;
  background: #ffd329;
  color: #111;
  font-size: 12px;
  font-weight: 900;
}

.card h2 {
  margin: 0 0 10px;
  font-size: clamp(20px, 4vw, 28px);
  line-height: 1.25;
}

.card p {
  margin: 0;
}

auto-fit と auto-fill の違い

auto-fitは空の列を潰して、実際のアイテムを広げます。auto-fillは空の列も残すため、グリッドの枠を維持したいときに向いています。通常のカード一覧なら、まずはauto-fitでOKです。

  • auto-fit:少ない件数でもカードを横に広げたい
  • auto-fill:空の列を含めてグリッドのリズムを保ちたい
  • 迷ったらカード一覧はauto-fit、ギャラリーは用途に応じて選ぶ

実践パターン

よく使うパターンをまとめると以下です。記事一覧、制作実績、画像ギャラリー、2カラムレイアウトに使い回せます。

/* 1. カード一覧の定番 */
.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 24px;
}

/* 2. 狭い画面で確実に1列にする */
.articles {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
  gap: 24px;
}

/* 3. サイドバー付きレイアウト */
.page {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(260px, 340px);
  gap: 32px;
}

/* 4. 画像ギャラリー */
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 12px;
}

よくある失敗1:minmax(300px, 1fr) がスマホではみ出す

画面幅が300pxより狭い場合、minmax(300px, 1fr)は最低300pxを守ろうとして横にはみ出します。安全にするならmin(100%, 300px)を組み合わせます。

grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));

よくある失敗2:中身の最小幅で崩れる

Gridアイテム内に長いURL、コード、画像があると、トラック幅より中身が強くなって崩れることがあります。Flexboxと同じく、必要な場所にmin-width: 0overflow-wrapを入れます。

.card {
  min-width: 0;
  overflow-wrap: anywhere;
}

CodePen

CodePenでは、上のindex.htmlをHTMLパネルへ、responsive-grid.cssをCSSパネルへ貼り付けてください。カード数を3件、6件、9件に変えながら、auto-fitauto-fillの違いを確認すると理解しやすくなります。

まとめ

minmax()は、CSS Gridをレスポンシブにするための基本装備です。カード一覧ではrepeat(auto-fit, minmax(min(100%, 240px), 1fr))を覚えておくと、多くのレイアウトに応用できます。

参考資料