Bhinish Dhiman
Why 16px is not 16px: x-height across 872 font families
Across 872 font families measured from their OS/2 tables, x-height ranges from 0.351 em (Suravaram) to 0.84 em (Matangi), with a median of 0.500 em and a 5th-to-95th percentile band of 0.411 to 0.570. Matching the x-height of 16px Helvetica takes 15.2 px in Inter, 18.6 px in Times New Roman and 20.8 px in EB Garamond.
font-size: 16px sets the height of an invisible box. What a reader sees is the lowercase inside it, and how much of the box the lowercase fills is a property of the typeface. We had the measurements for 872 families in our font metrics table, so we computed the distribution.
The term
x-height is the height of a lowercase letter without ascender or descender — the x, the a, the e — expressed as a fraction of the em, the box that font-size sets. A face with an x-height of 0.5 em at 16px has lowercase letters 8 px tall. It is the single measurement that best predicts how large a text setting looks, and it is the one CSS does not let you set.
The measurement
src/lib/type/font-metrics.json is built from @capsizecss/metrics 4.3.0, which reads each font’s OS/2 table. The build keeps sans-serif, serif and monospace families, excludes the script-specific Noto and Material families, and excludes 48 families whose files report no x-height or one below 0.35 em, which leaves 872. We computed percentiles, the share by category, and for each family the pixel size that gives the same lowercase height as Helvetica at 16px — Helvetica measuring 0.523 em, against the 0.52 em reference that APCA’s font lookup table is calibrated on. Computed on 1 October 2026.
| Percentile | x-height (em) | Size to match 16px Helvetica |
|---|---|---|
| Minimum | 0.351 | 23.7 px |
| 5th | 0.411 | 20.3 px |
| 10th | 0.440 | 18.9 px |
| 25th | 0.478 | 17.4 px |
| Median | 0.500 | 16.6 px |
| 75th | 0.524 | 15.9 px |
| 90th | 0.546 | 15.2 px |
| 95th | 0.570 | 14.6 px |
| Maximum | 0.840 | 9.9 px |
Between the 5th and 95th percentiles the same nominal size produces lowercase letters that differ by a factor of 1.39. Between the extremes, 2.39.
How far the families sit from the reference
166 families — 19.0% — have an x-height more than 10% below 0.52 em. 39 families, 4.5%, sit more than 10% above it. Only 458, or 52.5%, are within 5% of it. The reference describes about half the catalogue; a table of minimum sizes calibrated on it is quietly wrong for the other half, and wrong in the direction of too small for one family in five.
The category medians differ less than the spread inside them: sans-serif 0.508, serif 0.479, monospace 0.518. Serifs sit lower on average because the old-style tradition runs small, but Merriweather, a serif, is at 0.556 and Josefin Sans, a sans, is at 0.378.
Named families
| Family | x-height (em) | Size to match 16px Helvetica |
|---|---|---|
| Merriweather | 0.556 | 15.0 px |
| Inter | 0.546 | 15.2 px |
| Verdana | 0.545 | 15.3 px |
| Roboto | 0.528 | 15.8 px |
| Helvetica | 0.523 | 15.9 px |
| Arial | 0.519 | 16.0 px |
| Lato | 0.506 | 16.4 px |
| Georgia | 0.481 | 17.3 px |
| Source Serif 4 | 0.475 | 17.5 px |
| Times New Roman | 0.447 | 18.6 px |
| Crimson Pro | 0.420 | 19.8 px |
| EB Garamond | 0.400 | 20.8 px |
| Cormorant Garamond | 0.386 | 21.6 px |
| Josefin Sans | 0.378 | 22.0 px |
EB Garamond at 16px has lowercase letters 6.4 px tall. Inter at 16px has them at 8.7 px — 37% taller, at the same declared size. Two pages that both “use 16px body text” can differ by more than a whole step of a type scale in what the reader actually receives.
The top of the distribution is not what it looks like
The families above 0.7 em — Matangi, Anton, Antonio, Bebas Neue — are condensed display faces. Bebas Neue reports an x-height of 0.700 em against a cap height of 0.700 em, because it has no lowercase and its file measures small capitals instead; Anton and Antonio draw a lowercase nearly as tall as their capitals. “Large x-height” at that end means a headline face, not a generous text face. The genuine upper end for text is around 0.55 to 0.58 em: Merriweather, Poppins, Oswald.
What it means for a minimum size
APCA’s lookup gives a minimum size at each contrast level for a font near the reference, and its documentation says to scale that minimum by 0.52 divided by your font’s x-height. The table above is that correction, precomputed. For the median family it is a 4% adjustment; for the 5th percentile it is 27%; for EB Garamond it is 30%. Our type legibility checker applies it from the same metrics, so the minimum it reports is for the family you chose rather than for Helvetica.