타이밍과 스페이싱

Timing and spacing

한 동작에 몇 장의 그림(타이밍)을, 그 사이를 얼마나 촘촘하게(스페이싱) 쓰느냐가 속도뿐 아니라 무게감·성격까지 결정한다는 원칙.

다른 이름: Timing (12 principles)Spacing chart
···
html
<div class="rows">
  <div class="row">
    <span class="tag">4 in-betweens — fast, light</span>
    <div class="track" id="trackFast"><i class="ball fast"></i></div>
  </div>
  <div class="row">
    <span class="tag">14 in-betweens — slow, heavy</span>
    <div class="track" id="trackSlow"><i class="ball slow"></i></div>
  </div>
</div>
css
.rows{position:absolute;inset:12% 8%;display:flex;flex-direction:column;justify-content:space-around}
.row{display:flex;flex-direction:column;gap:8px}
.tag{font:700 10px/1 ui-monospace,monospace;color:var(--muted)}
.track{position:relative;height:20px}
.track::before{content:'';position:absolute;top:50%;left:0;right:0;height:2px;margin-top:-1px;background:var(--line)}
.tick{position:absolute;top:50%;width:2px;height:10px;margin-top:-5px;background:var(--muted);opacity:.5}
.ball{position:absolute;top:50%;left:0;width:20px;height:20px;margin-top:-10px;border-radius:50%;box-shadow:0 2px 6px rgba(0,0,0,.2);
  animation:moveTrack 2.2s infinite}
.ball.fast{background:var(--accent);animation-timing-function:steps(4)}
.ball.slow{background:var(--accent-2);animation-timing-function:steps(14)}
@keyframes moveTrack{from{left:0}to{left:calc(100% - 20px)}}
js
function ticks(container, n) {
  for (let i = 0; i <= n; i++) {
    const f = i / n;
    const t = document.createElement('i');
    t.className = 'tick';
    t.style.left = 'calc((100% - 20px) * ' + f + ' + 9px)';
    container.appendChild(t);
  }
}
ticks(document.getElementById('trackFast'), 4);
ticks(document.getElementById('trackSlow'), 14);

같은 거리를 움직이더라도 그림을 4장만 써서 넘어가면 가볍고 재빠르게 느껴지고, 14장을 촘촘히 써서 넘어가면 무겁고 느긋하게 느껴집니다. 이게 "타이밍(장수·소요 시간)"과 "스페이싱(장 사이 간격)"입니다 — 둘은 항상 같이 움직입니다.

애니메이터는 이걸 "스페이싱 차트"로 미리 그려봅니다. 같은 화면에 여러 시점의 위치를 점으로 찍어보면, 점 간격만 보고도 그 동작이 통통 튀는 쥐인지 육중한 코끼리인지 짐작할 수 있습니다.

CSS로는 animation-timing-function: steps(n)이 이 개념을 그대로 구현합니다 — n이 작을수록 큼직한 도약(가볍고 빠른 느낌), n이 클수록 촘촘한 걸음(무겁고 부드러운 느낌)이 됩니다.

데모 위쪽은 4단계로 건너뛰는 공 — 점 간격이 넓어 가볍게 톡톡 튀는 인상을 줍니다. 아래쪽은 14단계로 건너뛰는 공 — 점 간격이 촘촘해 묵직하고 부드럽게 미끄러지는 인상을 줍니다. 둘 다 같은 거리를 같은 시간에 이동합니다.

언제 쓰나

캐릭터·마스코트에 성격을 부여하고 싶을 때 스텝 수를 바꿔보세요. 일반 UI 전환에는 보통 부드러운 이징이 더 적절하고, steps()는 의도적으로 '무게'나 '기계적임'을 표현할 때만 씁니다.