플루이드 타이포그래피

Fluid typography

브레이크포인트마다 폰트 크기를 딱딱 바꾸는 대신, 화면(또는 컨테이너) 크기에 비례해 연속적으로 부드럽게 커지고 작아지게 하는 방식.

다른 이름: 가변형 폰트 크기Responsive type scale
···
html
<div class="stage">
  <div class="box" id="box">
    <h2 id="h">Fluid Type</h2>
  </div>
  <div class="readout">container <span id="w">0</span>px · font-size <span id="fs">0</span>px</div>
</div>
css
.box{width:26%;min-width:60px;container-type:inline-size;border:1px dashed var(--line);border-radius:12px;padding:10px 6px;display:grid;place-items:center;animation:resize 4.5s ease-in-out infinite}
h2{margin:0;font-size:clamp(13px, 22cqw, 44px);font-weight:800;line-height:1.1;font-family:system-ui,-apple-system,sans-serif;color:var(--fg);text-align:center;white-space:nowrap}
@keyframes resize{0%,100%{width:22%}50%{width:88%}}
.readout{margin-top:14px;font:11px ui-monospace,Menlo,monospace;color:var(--muted)}
js
const box = document.getElementById('box');
const h = document.getElementById('h');
const wEl = document.getElementById('w');
const fsEl = document.getElementById('fs');
function tick(){
  wEl.textContent = Math.round(box.getBoundingClientRect().width);
  fsEl.textContent = Math.round(parseFloat(getComputedStyle(h).fontSize));
  requestAnimationFrame(tick);
}
tick();

`font-size: clamp(최솟값, 선호값, 최댓값)`이 핵심 도구입니다. 선호값에 `vw`(뷰포트 폭의 1%) 같은 상대 단위를 섞으면, 화면이 넓어질수록 값이 커지다가 최댓값에서 멈추고, 좁아질수록 작아지다가 최솟값에서 멈춥니다. 중간 화면 폭에서 미디어쿼리 없이 매끄럽게 이어집니다.

`vw`는 뷰포트 전체 기준이라 사이드바 안 텍스트처럼 "컨테이너 크기"에 반응해야 하는 곳에는 안 맞습니다. 이때는 부모에 `container-type: inline-size`를 주고 `cqw`(컨테이너 폭의 1%) 단위를 쓰면, 뷰포트가 아니라 그 컨테이너 자체의 폭에 비례해서 커집니다 — 이 데모도 `cqw`로 만들었습니다.

너무 넓은 `clamp()` 범위는 작은 화면에서 글자가 과하게 작아지거나, 큰 화면에서 줄 길이(measure)가 지나치게 길어지는 부작용을 낳을 수 있어 최소·최대값을 실제로 테스트해보는 게 안전합니다.

언제 쓰나

히어로 헤드라인, 카드 안 제목처럼 다양한 화면·컨테이너 폭에서 크기 단계가 부드럽게 이어져야 할 때.