What is the CSS ‘ch’ Unit?
Published 6 years, 4 months pastI keep seeing authors and speakers refer to the ch
unit as meaning “character width”. This leads to claims that you can “make your content column 60 characters wide for maximum readability” or “size images to be a certain number of characters!”
Well… yes and no. Specifically, yes if you’re using fixed-width fonts. Otherwise, mostly no.
This is because, despite what the letters ch
might imply, ch
units are not “character” units. They are defined as:
Equal to the used advance measure of the “0” (ZERO, U+0030) glyph found in the font used to render it. (The advance measure of a glyph is its advance width or height, whichever is in the inline axis of the element.)
So however wide the “0” character is in a given typeface, that’s the measure of one ch
. In monospace (fixed-width) fonts, where all characters are the same width, 1ch
equals one character. In proportional (variable-width) fonts, any given character could be wider or narrower than the “0” character.
To illustrate this, here are a few example elements which are set to be exactly 20ch wide, and also contain exactly 20 characters.
Courier
Look, 20 characters. abcdefghijklmnopqrst 12345678901234567890 iiiiiiiiiiiiiiiiiiii mmmmmmmmmmmmmmmmmmmmHelvetica
Look, 20 characters. abcdefghijklmnopqrst 12345678901234567890 iiiiiiiiiiiiiiiiiiii mmmmmmmmmmmmmmmmmmmmGeorgia
Look, 20 characters. abcdefghijklmnopqrst 12345678901234567890 iiiiiiiiiiiiiiiiiiii mmmmmmmmmmmmmmmmmmmmIt’s probably no surprise that in Courier, all the elements are the exact same width as their text contents. In Helvetica, by contrast, this is mostly not the case except for numbers, which appear to be fixed-width. In Georgia, by contrast, none of the text contents fit the boxes, not even the numbers.
What I’ve found through random experimentation is that in proportional typefaces, 1ch
is usually wider than the average character width, usually by around 20-30%. But there are at least a few typefaces where the zero symbol is skinny with respect to the other letterforms; in such a case, 1ch
is narrower than the average character width. Trajan Pro is one example I found where the zero was a bit narrower than the average, but I’m sure there are others. Conversely, I’m sure there are typefaces with Big Fat Zeroes, in which case the difference between ch
and the average character width could be around 50%.
So in general, if you want an 80-character column width and you’re going to use ch
to size it, aim for about 60ch
, unless you’re specifically working with a typeface that has a skinny zero. And if you’re working with multiple typefaces, say one for headlines and another for body copy, be careful about setting ch
measures and thinking they’ll be equivalent between the two fonts. The odds are very, very high they won’t be.
It would be interesting to see the Working Group take up the idea of average character width as a unit of measure — say, 1acw
or possibly just 1cw
— which actually uses all the letterforms in a typeface to calculate an average value. That would get a lot closer to “make your columns 60 characters wide!” in a lot more cases than ch
does now.