Line Lengths

and CSS Length Units

Yesterday I made an observation about blog line lengths that got a really unexpected amount of traction, and I thought I would write down what I know and learned.

What’s the big deal about line length?

The Refactoring UI guys note:

Keep your line length in check

When styling paragraphs, it’s easy to make the mistake of fitting the text to your layout instead of trying to create the best reading experience.

Usually this means lines that are too long, making text harder to read.

For the best reading experience, make your paragraphs wide enough to fit between 45 and 75 characters per line. The easiest way to do this on the web is using em units, which are relative to the current font size. A width of 20-35em will get you in the right ballpark.

For the totally uninitiated: by default, content on a page goes from the extreme left of the screen to the extreme right of the screen. This just “looks ugly”, which is an unscientific term at best, but one plausible justification you can hang your hat on is that eyes get tired scanning left/right and prefer going up/down with scrolling.

The usual advice, from multiple sources, is to aim for about 45-80 characters per line, which works out to be 9-14 words per line. Of course this applies for blogs more than other types of sites and apps, but it is still applicable for other forms of site layout like landing page copy.

If you’re design blind like me, you won’t immediately believe how important this is. I went for 80 characters at first, but discovered that It feels good going as far down as 50.

CSS Units

So given the above advice, it seems an obvious immediate win to apply max-width: 69ch to your blog content blocks. However I found that most people don’t do this! Usually people seem to prefer specifying absolute pixels, or (rarer) using %’s of parent width, or (if you’re Basecamp) spanning the middle sections of a grid system.

I found that a big reason this happens is many people don’t seem to know the ch unit even exists! There are actually like a dozen length units in CSS, most of them not as useful.

Some people argued for ems over ch, on the basis that ch can be unpredictable as it based on the width of the 0 glyph. The counterargument is ch is apparently closer to the average letter length, and indeed you can easily verify this is so. 70ch is something like 35-40em‘s. If you’re really aiming for 70 chars per line anyway, which is more intuitive to use? However, there are some that feel intuition runs the other way in the bigger context of overall CSS architecture.

There are other approaches. Andy Bell and others use the “root rem plus vw viewport unit” trick. Basecamp ONLY uses CSS grid.

I don’t ultimately think it really matters what units you use - in the end the browser is going to convert it to pixels for you anyway and you just have to come up with something your readers can live with. If the rest of the elements in your design depend on your content width being pixel perfect (e.g. wanting header and footer to line up exactly with text) then you might have to use px, but of course you could equally do the same effect with any other unit.

I do think it’s easier to use px if you design in a design tool or on a grid, and ch if you “design in the browser” like I do. Designs with multiple fonts may also be inconsistent on what the ch means.

Managing Breakouts

Often in a blog you will want a consistent line length, but have some elements like images and code blocks “break out” of your content line to break the monotony and add emphasis. Dave Geddes has a wonderful approach mixing CSS Grid and minmaxing the ch unit.

Magic Numbers

I know this is lazy, but I like to get real life magic numbers to try on my own things :)

Preet also pointed me to this study on The Effects of Line Length on Reading Online News.

Try it yourself!

You can now edit line lengths of this blog.

Its line length starts off at a nice 69ch but if you hit “change theme” and opt to customize, you can edit it to whatever line length you like. Of course, you could always do this in browser devtools, but now you can do it on mobile too (where, admittedly, max width doesnt actually matter 😅).

This is still a WIP experimental feature (I still have to add persistence and maybe auth) but it has been a fun toy to play around with to make a site your own.

Tagged in: #css #design #tech

Leave a reaction if you liked this post! 🧡
Loading comments...

Subscribe to the newsletter

Join >10,000 subscribers getting occasional updates on new posts and projects!

I also write an AI newsletter and a DevRel/DevTools newsletter.

Latest Posts

Search and see all content