카드 그리드

Card grid

카드 개수를 미리 정하지 않고 `repeat(auto-fit, minmax(…))` 한 줄로 화면 폭에 맞게 열 개수를 스스로 정하는 실무 패턴.

다른 이름: Responsive card gridauto-fit card layout
···
html
<div class="stage" id="stage">
  <div class="cards">
    <div class="card"><i class="ic"></i><b class="t"></b><i class="ln"></i></div>
    <div class="card"><i class="ic"></i><b class="t"></b><i class="ln"></i></div>
    <div class="card"><i class="ic"></i><b class="t"></b><i class="ln"></i></div>
    <div class="card"><i class="ic"></i><b class="t"></b><i class="ln"></i></div>
  </div>
</div>
css
.stage{width:40%;min-width:210px;max-width:92%;border:2px dashed var(--muted);border-radius:10px;padding:10px;
  transition:width 2.8s cubic-bezier(.4,0,.2,1);box-sizing:border-box}
.stage.wide{width:92%}
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(84px,1fr));gap:8px}
.card{background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:8%;display:flex;
  flex-direction:column;gap:8px;align-items:flex-start}
.ic{width:26%;aspect-ratio:1;border-radius:6px;background:var(--accent)}
.t{display:block;width:70%;height:7px;border-radius:3px;background:var(--fg);opacity:.7}
.ln{display:block;width:85%;height:6px;border-radius:3px;background:var(--line)}
js
const stage = document.getElementById('stage');
setInterval(() => stage.classList.toggle('wide'), 2400);

`grid-template-columns: repeat(auto-fit, minmax(140px, 1fr))`은 auto-fit·auto-fit-vs-fill 항목에서 설명한 메커니즘의 가장 흔한 실전 적용입니다. `minmax(140px, 1fr)`은 "각 카드는 최소 140px, 남는 공간은 균등하게 나눠 가져라"는 뜻이고, `auto-fit`은 화면이 넓어지면 카드가 더 많이 들어갈 자리를 스스로 계산해 열 수를 늘립니다 — 미디어 쿼리에 "이 폭에서는 3열, 저 폭에서는 4열" 같은 걸 손으로 정의할 필요가 없습니다.

`minmax`의 최솟값이 카드 그리드 디자인의 실제 손잡이입니다. 최솟값을 키우면(예: 220px) 같은 화면 폭에서 열이 적게 잡히고 카드가 커지며, 줄이면(예: 100px) 더 많은 열이 촘촘하게 들어갑니다. 최댓값을 `1fr` 대신 고정 px로 주면 카드가 무한정 넓어지지 않도록 상한을 걸 수도 있습니다.

이 패턴의 한계는 "카드 높이"까지는 맞춰주지 않는다는 것입니다 — 같은 행의 카드들은 기본적으로 `align-items: stretch`(그리드 기본값) 덕분에 높이가 맞춰지지만, 내용 길이가 카드마다 다르면 여전히 부자연스러워 보일 수 있습니다. 그럴 땐 카드 내부에 `line-clamp`로 텍스트 줄 수를 맞추거나, 정말 높이가 들쭉날쭉해야 한다면 메이슨리로 바꾸는 게 낫습니다.

언제 쓰나

블로그 글 목록, 상품 목록, 팀원 소개처럼 개수가 가변적이고 카드 크기가 대체로 균일한 콘텐츠의 사실상 기본값입니다.