8pt 그리드

8pt grid

모든 여백·크기를 8의 배수(8, 16, 24, 32…)로만 정하는 스페이싱 규칙. 디자이너와 개발자가 숫자를 눈대중이 아니라 규칙으로 맞춥니다.

다른 이름: 8px grid systemSpacing scale
···
html
<div class="stage">
  <div class="dots show" id="dots"></div>
  <div class="card">
    <div class="ic"></div>
    <i class="ln l1"></i><i class="ln l2"></i>
    <div class="btn"></div>
  </div>
</div>
css
.stage{position:relative;width:min(90%,320px);aspect-ratio:16/11;display:grid;place-items:center}
.dots{position:absolute;inset:0;border-radius:12px;opacity:.28;transition:opacity .5s;
  background-image:radial-gradient(circle,var(--line) 1px,transparent 1.4px);
  background-size:8% 8%}
.dots.show{opacity:1}
.card{position:relative;width:76%;background:var(--surface);border:1px solid var(--line);border-radius:16px;
  box-shadow:0 8px 24px rgba(0,0,0,.1);padding:8%;display:grid;gap:8%;justify-items:start}
.ic{width:24%;aspect-ratio:1;border-radius:8px;background:var(--accent)}
.ln{display:block;height:8%;border-radius:3px;background:var(--line)}
.l1{width:80%}.l2{width:56%}
.btn{width:40%;height:14%;border-radius:8px;background:var(--accent-3);margin-top:2%}
js
const dots = document.getElementById('dots');
setInterval(() => dots.classList.toggle('show'), 1400);

왜 하필 8인가: 대부분의 화면 해상도·기본 폰트 크기·아이콘 그리드가 2와 4의 배수라서, 8을 기본 단위로 두면 반으로 나눠도(4) 정수가 나옵니다. 또 diP(density-independent pixel) 배율(1x, 1.5x, 2x, 3x)에서 8의 배수는 대부분 정수 픽셀로 렌더링돼 흐릿해지지 않습니다.

실무에서는 CSS 변수로 스페이싱 스케일을 미리 정의해둡니다: `--space-1: 4px; --space-2: 8px; --space-3: 16px; --space-4: 24px…` 처럼요. 디자이너는 Figma에서 8px 그리드에 스냅해서 작업하고, 개발자는 임의의 `padding: 13px` 대신 이 스케일에서만 골라 씁니다.

절대적인 규칙이 아니라 합의를 위한 도구입니다. 아이콘처럼 시각적으로 4px 조정이 꼭 필요한 예외는 있을 수 있되, 그 예외가 늘어나면 그리드의 의미가 사라집니다.

언제 쓰나

팀에 디자이너와 개발자가 함께 있고, 여러 화면에 걸쳐 여백을 일관되게 유지해야 할 때. 혼자 하는 소규모 프로젝트라면 굳이 강제할 필요는 없습니다.