서브그리드

Subgrid

중첩된 그리드 아이템이 자기 트랙을 새로 만들지 않고, 부모 그리드의 열/행 트랙을 그대로 물려받게 하는 기능.

다른 이름: grid-template-columns: subgrid
···
html
<div class="wrap">
  <div class="badge" id="badge"><svg viewBox="0 0 10 10"><path id="bpath" d="M1.5 5.2l2.6 2.6L8.5 2.4" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/></svg><span id="btext">확인 중</span></div>
  <div class="grid" id="grid">
    <div class="card"><div class="t">짧은 제목</div><div class="b">본문</div><button class="cta">더보기</button></div>
    <div class="card"><div class="t">두 줄까지 가는 긴 제목</div><div class="b">본문</div><button class="cta">더보기</button></div>
    <div class="card"><div class="t">제목</div><div class="b">본문</div><button class="cta">더보기</button></div>
  </div>
</div>
css
.wrap{position:relative;width:min(480px,94%)}
.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.card{display:grid;grid-row:span 3;grid-template-rows:subgrid;gap:6px;padding:10px;border:1px solid var(--line);border-radius:10px;background:var(--surface)}
.grid.fallback .card{grid-template-rows:44px 1fr 30px}
.t{font-size:12px;font-weight:700;color:var(--fg);line-height:1.3}
.b{font-size:11px;color:var(--muted)}
.cta{align-self:end;font-size:11px;font-weight:600;color:#fff;background:var(--accent);border:0;border-radius:6px;padding:5px 0}
.badge{position:absolute;top:-30px;right:0;display:flex;align-items:center;gap:5px;padding:4px 9px;border-radius:999px;font-size:10px;font-weight:700;background:var(--bg);border:1px solid var(--line);color:var(--accent-3)}
.badge.no{color:var(--accent-2)}
.badge svg{width:9px;height:9px}
js
const ok = CSS.supports('grid-template-columns', 'subgrid');
const b=document.getElementById('badge'),p=document.getElementById('bpath'),t=document.getElementById('btext');
b.classList.toggle('no', !ok);
p.setAttribute('d', ok ? 'M1.5 5.2l2.6 2.6L8.5 2.4' : 'M2 2l6 6M8 2l-6 6');
t.textContent = ok ? 'subgrid 지원됨' : '미지원 · 고정 높이 폴백';
if (!ok) document.getElementById('grid').classList.add('fallback');

카드 여러 장을 나란히 놓고 제목·본문·버튼 줄을 카드마다 딱 맞춰 정렬하고 싶을 때, 일반 grid는 각 카드가 "자기 안"에서만 트랙을 계산하기 때문에 카드마다 제목 높이가 다르면 버튼 줄이 삐뚤빼뚤해집니다. 예전에는 JS로 모든 카드의 제목 높이를 재서 가장 큰 값으로 맞추는 방식이 흔했습니다.

`grid-template-columns: subgrid`(또는 rows)를 쓰면 자식 그리드가 새 트랙을 만드는 대신 부모가 정의한 트랙 라인을 그대로 이어받습니다. 그러면 여러 카드에 걸쳐 있는 부모 grid 하나가 "이 줄은 몇 px"를 결정하고, 모든 자식이 거기에 자동으로 맞춰집니다.

기본 지원은 caniuse/MDN baseline을 확인하세요. 미지원 브라우저에서는 JS로 요소 높이를 측정해 `min-height`를 맞추거나, table 레이아웃으로 우회하는 것이 대안입니다.

언제 쓰나

카드 그리드에서 여러 카드의 내부 줄(제목·본문·CTA)을 픽셀 단위로 정렬하고 싶을 때.