--- id: wiki-2026-0508-fluid-typography title: Fluid Typography category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Fluid Typography, Responsive Typography, Clamp Typography] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [css, web, design, responsive] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: css framework: web --- # Fluid Typography ## 매 한 줄 > **"매 viewport 에 따라 font-size 가 부드럽게 scale 된다"**. 매 Fluid Typography는 fixed breakpoint 의 jumpy 변화 대신 매 linear interpolation 으로 매 자연스러운 size 변화 — `clamp()` + `vw` 가 매 modern standard. 2026 모든 design system 의 default. ## 매 핵심 ### 매 Why fluid? - **Breakpoint jumps**: 매 320px → 768px 에서 갑자기 font 12px → 18px (jarring) - **Fluid interp**: 매 320px = 12px, 1280px = 24px, 매 사이는 linear - **Single source of truth**: 매 media query × N 대신 매 1 line CSS ### 매 clamp(min, preferred, max) - `min`: 매 최소 (small viewport) - `preferred`: 매 vw 기반 fluid value - `max`: 매 최대 (large viewport cap) - 매 browser가 자동 clamp ### 매 응용 1. Modern design systems (Tailwind v4 fluid presets, Open Props). 2. Editorial sites (NYT, Medium-style readers). 3. Marketing landing pages. 4. CSS-in-JS theme tokens. ## 💻 패턴 ### Basic clamp() pattern ```css :root { /* 매 min 1rem (16px), max 1.5rem (24px), fluid 사이 */ --fs-body: clamp(1rem, 0.875rem + 0.625vw, 1.5rem); --fs-h1: clamp(2rem, 1rem + 5vw, 5rem); --fs-h2: clamp(1.5rem, 1rem + 2.5vw, 3rem); } body { font-size: var(--fs-body); } h1 { font-size: var(--fs-h1); line-height: 1.1; } h2 { font-size: var(--fs-h2); line-height: 1.2; } ``` ### Linear interp formula (Utopia.fyi) ```javascript // 매 min 320px viewport: 16px font // 매 max 1280px viewport: 24px font function fluidClamp(minPx, maxPx, minVwPx = 320, maxVwPx = 1280) { const slope = (maxPx - minPx) / (maxVwPx - minVwPx); const intercept = minPx - slope * minVwPx; const slopeVw = slope * 100; return `clamp(${minPx / 16}rem, ${intercept / 16}rem + ${slopeVw}vw, ${maxPx / 16}rem)`; } console.log(fluidClamp(16, 24)); // "clamp(1rem, 0.833rem + 0.833vw, 1.5rem)" ``` ### Type scale (modular) ```css :root { --ratio: 1.25; /* 매 major third scale */ --fs-0: clamp(1rem, 0.9rem + 0.5vw, 1.125rem); --fs-1: calc(var(--fs-0) * var(--ratio)); --fs-2: calc(var(--fs-1) * var(--ratio)); --fs-3: calc(var(--fs-2) * var(--ratio)); --fs--1: calc(var(--fs-0) / var(--ratio)); } ``` ### Tailwind v4 fluid (CSS) ```css @import "tailwindcss"; @theme { --text-fluid-sm: clamp(0.875rem, 0.8rem + 0.4vw, 1rem); --text-fluid-base: clamp(1rem, 0.875rem + 0.625vw, 1.25rem); --text-fluid-lg: clamp(1.125rem, 0.95rem + 0.9vw, 1.5rem); --text-fluid-xl: clamp(1.5rem, 1rem + 2.5vw, 2.5rem); } ``` ```html
매 body text fluid
``` ### Container query fluid (modern) ```css /* 매 viewport 대신 container 기반 — true component fluidity */ .card { container-type: inline-size; } .card-title { font-size: clamp(1rem, 4cqi, 2rem); /* 매 cqi = container query inline */ } ``` ### Accessibility-safe (rem floor) ```css /* 매 user font-size preference 존중 — rem 사용 */ :root { --fs-readable: clamp(1rem, 0.9rem + 0.5vw, 1.25rem); /* 매 NOT: clamp(16px, 1vw, 20px) — px ignores user setting */ } ``` ### Line-height 도 fluid ```css .prose { font-size: clamp(1rem, 0.9rem + 0.5vw, 1.25rem); /* 매 작은 size 일수록 line-height 더 큼 (readability) */ line-height: clamp(1.4, 1.6 - 0.1vw, 1.6); /* 매 ch unit으로 measure 제한 */ max-width: 65ch; } ``` ### Spacing 도 fluid (consistency) ```css :root { --space-xs: clamp(0.5rem, 0.4rem + 0.5vw, 0.75rem); --space-sm: clamp(1rem, 0.8rem + 1vw, 1.5rem); --space-md: clamp(1.5rem, 1.2rem + 1.5vw, 2.25rem); --space-lg: clamp(2.25rem, 1.8rem + 2.25vw, 3.375rem); } ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | Marketing site | Fluid type + spacing | | App UI (dense) | Discrete sizes (consistent UX) | | Editorial (long-form) | Fluid + max-width 65-75ch | | Component library | Container query fluid | | Email | Static (limited CSS) | **기본값**: 매 clamp() + rem + Utopia.fyi calculator. 매 viewport range 320-1280px 기준. ## 🔗 Graph - 부모: [[Responsive Design]] - 변형: [[컨테이너 쿼리 (Container Queries)|Container Queries]] - 응용: [[Design Systems]] · [[CSS_Architecture_and_Styling|Tailwind CSS]] · [[CSS_Architecture_and_Styling|CSS Variables]] - Adjacent: [[Type Scale]] · [[Accessibility (A11y)|Accessibility]] ## 🤖 LLM 활용 **언제**: 매 design system token 생성, clamp() formula 계산, breakpoint refactor. **언제 X**: 매 email HTML, legacy IE — clamp() unsupported. ## ❌ 안티패턴 - **px in clamp()**: 매 user font preference 무시 → 매 a11y 실패. - **No max cap**: 매 4K monitor 에서 매 font 너무 큼. - **No min floor**: 매 320px 미만 viewport 에서 매 unreadable. - **vw alone**: 매 `font-size: 2vw` — 매 zoom 시 깨짐 (no rem fallback). ## 🧪 검증 / 중복 - Verified (Utopia.fyi, "Fluid responsive design", 2020). - Verified (CSS Values L4 spec, clamp() function). - Verified (Caniuse: clamp() 96%+ global support). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — clamp() + container queries + Tailwind v4 |