Boneyard Tools

Fluid typography with CSS clamp(): a practical guide

How clamp() replaces breakpoint media queries with a single fluid rule, the linear math behind the value, and how to keep it accessible.

From breakpoint jumps to a smooth line

Traditional responsive type sets a fixed size at each breakpoint, so text jumps in steps as the window crosses each media query. Fluid typography replaces those steps with a straight line: the size grows in proportion to the viewport width between a lower and an upper bound. clamp() expresses that in one declaration by combining a minimum, a preferred fluid value, and a maximum. The result reads naturally at every width in between rather than snapping at arbitrary breakpoints.

The linear math behind the value

Two points define a line: your min size at the min viewport, and your max size at the max viewport. The slope is the change in size divided by the change in width, and multiplying it by 100 turns it into a vw unit. The intercept is where that line would cross a zero-width viewport, calculated as min size minus slope times min viewport. Writing the preferred value as intercept in rem plus slope in vw reproduces the exact line, and clamp() caps it so it never escapes your chosen sizes.

Why the rem base protects accessibility

A tempting shortcut is to make the preferred value pure vw, but that ties text size only to window width and ignores the reader. Someone who raises their default font size, or zooms the page, expects text to respond. Because rem is relative to the root font size, keeping a rem term in the preferred value lets user preferences still move the text. The vw term then adds viewport-driven growth on top of that user-respecting base, so the type stays both fluid and adjustable.

Choosing sensible bounds

Good fluid type starts with real design decisions rather than arbitrary numbers. Pick the smallest comfortable reading size for your narrowest supported phone, and the largest size that still fits your widest layout without dominating the page. Set the viewport bounds to the widths where those sizes should lock in, often a small phone width and a common desktop width. Keeping the slope gentle avoids text that balloons on very wide monitors, and testing the preview at the middle width confirms the midpoint feels right.

Frequently asked questions

Should I use px or rem inside clamp()?

This calculator outputs the fixed bounds and the base in rem so the value honors the user's root font size and zoom. Pure px bounds would freeze the type regardless of preference, so rem is the accessible default for typography.

Does the size keep growing past my max viewport?

No. Beyond the max viewport the preferred value would exceed the max size, so clamp() pins it to the maximum. Below the min viewport it holds at the minimum, so the fluid growth only happens between your two breakpoints.