Should body text be sized in pixels, rems, or something fluid?
On this page
Size body text in a relative unit, rems being the standard choice, because relative units respect the user’s own text-size preference while fixed pixels quietly override it. That is the deciding factor: rems scale from the browser’s root font size, so when someone has bumped their default text up for comfort or necessity, your body text grows with it, whereas a pixel value ignores that setting and locks the text at whatever you typed. Fluid sizing, where the text scales with the viewport width, is a separate tool that solves a different problem and is worth using in specific places, but for the running body copy people actually read, relative units should be the default because accessibility favors them.
The tradeoff underneath is user control against precise control. Pixels give you exactly the value you specify on every screen, which feels reassuring during design because what you set is what renders, and that appeal is exactly why the pixel habit persists. But that precision comes at the user’s expense: a reader who has set a larger default text size, often because they need it, gets none of it, since the pixel value is absolute and the preference has nowhere to apply. Rems hand part of that control back. You still set the proportions of your scale, but the baseline they multiply against is the user’s, so your hierarchy is preserved while the overall size honors the person reading. For body text, where readability is the whole point, that is the right side of the tradeoff.
Concretely, define your scale in rems against the root. If the root is the browser default, then 1rem is the default body size, a heading might be 1.5rem, a caption 0.875rem, and the relationships hold no matter what root the user has chosen. Now a reader who has set their browser to a larger default text size opens the page and every size scales up proportionally, the body becomes comfortably larger and the headings stay correctly bigger than it, because they were all expressed relative to that root. Had you written those same sizes in pixels, the reader’s setting would have been silently discarded and the text would have stayed small. The accessibility win is not theoretical; it is the difference between a preference working and a preference being ignored.
The point worth naming is that fluid sizing earns its place too, just not as the default for reading text. A hero headline that should feel large on a wide monitor and still fit a phone is a good candidate for fluid scaling, and modern CSS gives you clamp() to do it safely, setting a minimum, a preferred fluid value, and a maximum so the size scales with the viewport but never collapses too small or balloons too large. The mistake is making running body copy purely viewport-driven, since that ties reading size to window width rather than to the reader’s need and can produce uncomfortable extremes. Reserve fluid for display type and clamp it; keep body on a relative unit.
So default body text to rems so user text-size settings still apply, build your whole type scale as relative multiples of the root, and treat pixels as the exception rather than the rule. Where you want type to respond to screen width, use a clamped fluid value with sensible minimum and maximum bounds for headings and display, and leave the body copy on a relative unit so the people who depend on their own settings keep them.