12분할 그리드

12-column grid

화면 폭을 12칸으로 나눠, 요소마다 몇 칸을 차지할지(span)로 크기를 정하는 웹의 표준 그리드 체계.

다른 이름: 12-col gridBootstrap grid
···
html
<div class="stage">
  <div class="cols show" id="cols"></div>
  <div class="content" id="content"></div>
</div>
css
.stage{position:relative;width:min(92%,560px);height:min(90%,240px)}
.cols{position:absolute;inset:0;z-index:2;display:grid;grid-template-columns:repeat(12,1fr);gap:2%;opacity:.3;
  transition:opacity .4s;pointer-events:none}
.cols.show{opacity:1}
.cols i{background:color-mix(in oklab,var(--accent) 20%,transparent);border-left:1px dashed color-mix(in oklab,var(--accent) 55%,transparent);
  border-right:1px dashed color-mix(in oklab,var(--accent) 55%,transparent)}
.content{position:absolute;inset:0;z-index:1;display:grid;grid-template-columns:repeat(12,1fr);gap:2%}
.content b{border-radius:8px;background:var(--surface);border:1px solid var(--line);display:grid;place-items:center;
  color:var(--muted);font-size:clamp(9px,1.6vmin,12px);transition:background .3s,color .3s}
.content b.active{background:var(--accent-2);color:#fff;border-color:transparent}
js
const cols = document.getElementById('cols');
for (let i = 0; i < 12; i++) cols.appendChild(document.createElement('i'));
const content = document.getElementById('content');
const spans = [
  [12],
  [6, 6],
  [4, 4, 4],
  [3, 3, 3, 3],
];
function render(spanSet, activeIdx) {
  content.innerHTML = '';
  spanSet.forEach((s, idx) => {
    const b = document.createElement('b');
    b.style.gridColumn = 'span ' + s;
    b.textContent = 'span ' + s;
    if (idx === activeIdx) b.classList.add('active');
    content.appendChild(b);
  });
}
let si = 0;
render(spans[0], 0);
setInterval(() => {
  cols.classList.toggle('show');
  si = (si + 1) % spans.length;
  render(spans[si], Math.floor(Math.random() * spans[si].length));
}, 1500);

12를 쓰는 이유는 약수가 많아서입니다(1, 2, 3, 4, 6, 12). 화면을 절반(6+6), 3등분(4+4+4), 4등분(3×4)으로 나눠도 항상 정수 칸이 나옵니다. 인쇄 디자인의 그리드 체계에서 이어져, Bootstrap 같은 프레임워크가 웹에 표준으로 정착시켰습니다.

CSS Grid에서는 `grid-template-columns: repeat(12, 1fr)`로 만들고, 요소는 `grid-column: span 4`처럼 몇 칸을 차지할지만 적으면 됩니다. 과거 float 기반 그리드처럼 칸 번호를 일일이 계산할 필요가 없습니다.

칸(column) 자체와 칸 사이 여백(거터)은 다른 개념입니다 — 거터 항목을 함께 보세요. 반응형에서는 칸 수는 그대로 두고 각 요소의 span 값만 브레이크포인트별로 바꾸는 게 일반적입니다(모바일에선 span 12, 데스크톱에선 span 4).

언제 쓰나

여러 페이지에서 콘텐츠 폭을 일관되게 맞춰야 하는 마케팅 사이트, 블로그, 대시보드에 기본값으로 좋습니다.