가변 폰트

Variable font

굵기·너비·기울기 같은 축을 하나의 폰트 파일 안에서 연속적으로 보간하는 폰트 형식. Regular와 Bold를 따로 다운받을 필요가 없습니다.

다른 이름: Variable FontOpenType Font Variations
···
html
<div class="stage">
  <span class="word" id="w">Variable</span>
  <div class="readout">wght <span id="wght">400</span> (font-weight 보간 근사)</div>
</div>
css
.word{font:14vmin/1.1 system-ui,-apple-system,"Segoe UI",sans-serif;color:var(--fg);display:block;text-align:center;font-variation-settings:"wght" 400}
.readout{margin-top:16px;font:12px ui-monospace,Menlo,monospace;color:var(--muted);text-align:center}
#wght{color:var(--accent);font-weight:700}
js
const w = document.getElementById('w');
const label = document.getElementById('wght');
const start = performance.now();
function loop(now){
  const t = (now - start) / 2400;
  const wght = Math.round(400 + Math.sin(t) * 300);
  w.style.fontWeight = wght;
  w.style.fontVariationSettings = '"wght" ' + wght;
  label.textContent = wght;
  requestAnimationFrame(loop);
}
requestAnimationFrame(loop);

과거엔 굵기별로(Light, Regular, Bold…) 폰트 파일을 따로 불러와야 했지만, 가변 폰트는 파일 하나에 "굵기 축(wght)"의 최솟값·최댓값 원도(마스터)만 넣어두고 그 사이 어떤 값이든 실시간으로 보간합니다. CSS에서는 `font-variation-settings: "wght" 650`처럼 임의의 숫자를 줄 수 있고, `font-weight: 650`도 동작합니다.

굵기(wght) 외에 너비(wdth), 기울기(slnt), 광학 크기(opsz, 아래 "옵티컬 사이즈" 참고) 등 폰트마다 다른 축을 지원할 수 있습니다. 축을 스크롤·호버 같은 인터랙션에 애니메이션으로 연결하면 정적인 텍스트에 표정이 생깁니다.

파일 하나로 여러 굵기를 대체하므로 총 다운로드 용량이 줄어드는 것도 장점입니다. 다만 모든 폰트가 가변 폰트로 나오는 건 아니고, 축 이름과 범위는 폰트마다 다르므로 실제 사용 전 폰트의 지원 축을 확인해야 합니다.

이 데모는 외부 폰트를 불러올 수 없어 시스템 폰트의 `font-weight` 보간만으로 개념을 근사했습니다 — 실제 가변 폰트만큼 매끄럽지 않을 수 있습니다.

언제 쓰나

헤딩 굵기를 스크롤·호버에 따라 부드럽게 바꾸거나, 굵기별 파일을 여러 개 받기 부담스러운 다국어 사이트에 씁니다.