Everything is flexible these days. If you write grid-template-columns: 200px 200px 200px;
, sure, you’d have equal-width columns, but that’s a rare day. What you usually mean is three columns of equal fluid width.
We’ve got fractional units for that, like grid-template-columns: 1fr 1fr fr;
. That’s usually fine, but they aren’t very sturdy like pixels. A large bit of media (or something like a <pre>
, or long bit of text like a URL) can cause those columns to stretch and that’s almost never what you want. I’ve called that a grid blowout. The big idea is that the minimum width of a 1fr
column is auto
, not 0
. In other words,. those widened columns are just being as narrow as they know how to be!
To fix that, we can do like:
.el {
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
}
..or we could shorten it:
.el {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
It’s a little awkward, but OK. You only gotta learn it once. You might not even ever run into this if you’re always setting max-width
on your media and handling line breaks.
If you want to make your columns sturdy again without the minmax
dance, you could use percentages rather than pixels and stay flexible. But what percentage do you use? 33.33%
? That’s fine as long as you don’t have any gap
— otherwise, the gap will add to the width and overflow the container. You could fake gaps by putting padding inside the columns, but that’s a little janky and uneven.
This whole thing comes from a great tweet from Wes Bos:
🔥 A visual guide to getting equal width columns in CSS Grid pic.twitter.com/PY4yYokY18
— Wes Bos (@wesbos) May 1, 2020
I know a ton of people run into this — based on the number of emails I get about the grid blowout article — so it’s worth kinda internalizing why all this is the way it is. It probably should be easier but I don’t have any particular suggestions on how it could be.
calc(33.3333% – 30px) should help with the gap problem
How? Like as one of the column widths? Are you thinking then you do
gap: 30px
to match? If so, that’s not quite right, as in a three-column grid that means you’re subtracting 90px (3 columns), but there are only 2 “gaps”, at 60px. The math is still possible if you know the number of columns, but it’s not if you don’t.