Sizing & measure
Why 66 characters per line and 1.5 line height feel right
**Legibility** is whether you can tell an `l` from a `1`. **Readability** is whether you can read sustained paragraphs without effort. Body size, line length, and line height form a triangle. Get one wrong and the paragraph feels effortful.
## Body size: the anchor
Set body size first. Derive heading sizes upward and caption sizes downward.
- **Desktop:** 16–24px. 16 is a hard minimum. Most sites read better at 18–20px.
- **Mobile:** 14–19px. Phones are held closer, so smaller sizes look the same.
- **Print:** 10–12pt.
The right number depends on **x-height**. Verdana has a tall x-height. Garamond a short one. Both at 16px and Verdana looks two sizes bigger.
If 19px looks alive but 18px feels thin and 20px feels heavy, use 19px. The scale is a starting point. The eye is the editor.
### Common body-size mistakes
- **14px desktop body.** Cramped on modern screens.
- **24+ px desktop body.** Reserve for narrow columns or accessibility-first sites.
- **Same size on mobile and desktop.** Different contexts need different sizes.
## Line length: the measure
Target: **66 characters**, with 45–75 the workable range. Below 45, the eye snaps back before settling. Above 75, the eye loses the next line.
```css
.prose {
max-width: 65ch;
margin-inline: auto;
}
```
For fluid sizing, `clamp()` scales between breakpoints without jumps:
```css
body {
font-size: clamp(1rem, 0.9rem + 0.5vw, 1.25rem);
}
```
### Common line-length mistakes
- **Letting copy fill the viewport.**
- **Constraining only by pixels.** `ch` units track character count as font size changes.
## Line height: the vertical space
For body copy, **1.45–1.5**. Tall x-height faces need more. Small-x-height faces can run tighter. For large display type, drop to **1.0–1.2**.
### Always unitless
Use `line-height: 1.5`, not `line-height: 24px` or `line-height: 150%`. Unitless values inherit as a multiplier. Fixed values inherit as computed pixels, breaking when children have different font sizes:
```css
body {
line-height: 1.5;
} /* good, every child computes its own */
body {
line-height: 24px;
} /* bad, h1 inherits 24px and overlaps */
```
## The three decisions together
Changing one usually requires adjusting the others:
- **Larger body size** = measure shrinks at the same pixel width.
- **Wider column** = more characters per line, increase line height.
- **Taller x-height** = lines feel more packed, increase line height.
No formula replaces reading the result. Set the three values, read a real paragraph, adjust.