Lately, I’ve seen more people complain about how display: inline-block is broken. But it’s not. I’ll explain.

The Situation

Developers often use display: inline-block as a layout tool in lieu of floats. This can be a good alternative to complex floating and clearing… sometimes.

As an example, let’s say you have 3 child divs you want to stack, left-to-right, inside a container div. The widths of the 3 child divs add up to the width of the container div. So you think, hey, I’ll throw display: inline-block on them and call it a day. This is what you end up with:

See the Pen Inline Blocks: Unintended by Will Boyd (@lonekorean) on CodePen.

Chaos! Rogue margin between the left and center div! And what the hell does that right div think he’s doing? Go home right div, you’re drunk!

Alright, so here’s what’s happening. When you use display: inline-block, you’re telling those divs to flow inline, like text. And not just like text, but with text. You know what counts as text? Whitespace. That’s right, the whitespace between your divs is being rendered inline along with them, causing that tiny bit of spacing. Furthermore, those few extra pixels are more than the container div can hold, which is why the right div wrapped to the next line.

inline blocks meme

While the results may seem odd, the rendering is actually technically correct (which we all know is the best kind of correct).

The Solutions

There are several ways to work around this, but these are probably your three best options.

Option #1: Remove the whitespace from your markup. This cuts straight to the problem, but can leave you with long, unformatted lines of HTML, which is not the greatest feeling.

See the Pen Inline Blocks: No Whitespace by Will Boyd (@lonekorean) on CodePen.

Option #2: Reduce font-size to 0 on the container. This makes the whitespace have no width. Just be sure to restore font-size within the child divs if you have text in them.

See the Pen Inline Blocks: Zero Font Size by Will Boyd (@lonekorean) on CodePen.

Option #3: Don’t use display: inline-block. Like many CSS techniques, it has its place, but if you find yourself cursing the intended behavior then maybe that’s a sign you’re using the wrong tool for the job. Consider using floats.