An interesting conversation came up at work the other day: Should we use the CSS
float property now that we have CSS Grid and Flexbox?
The short answer
No! Well, mostly. I’d only use it today for wrapping text around images, though and I’d avoid using
float entirely for layouts.
The longer, more annoying answer
Before flexbox and grid, we had to use the CSS
float property to make grids and layouts. In fact, it was the first thing I learned about web design. On one hot summer afternoon I cracked open a copy of Designing with Web Standards by Jeffrey Zeldman and then moved a tiny red div with
float: right. It was magic. There was power in the
It was so easy to move something around on the screen that I now wonder how many designers fell in love with the web simply because of how easy it is to use move things around like that.
float to build complex layouts was always a hack: it was only really designed to let text wrap around an image.
The problems with
float begin when we try to build giant layouts and magazine-style grids. But that’s what we had to do since there were no alternatives back then like we do today.
One problem with the
float property is that you’d have to wrap floated elements with something called a clearfix that looked like this:
Jay Hoffman described the clearfix hack a while back:
The clearfix, for those unaware, is a CSS hack that solves a persistent bug that occurs when two floated elements are stacked next to each other. When elements are aligned this way, the parent container ends up with a height of 0, and it can easily wreak havoc on a layout. All you might be trying to do is position a sidebar to the left of your main content block, but the result would be two elements that overlap and collapse on each other. To complicate things further, the bug is inconsistent across browsers. The clearfix was invented to solve all that.
Things began to slowly change after that. Back in 2017, Rachel Andrew explained how browsers can handle the clearfix problem without any hacks at all. All we need is the following CSS to make the same fix:
The odd thing is that I didn’t know the
flow-root value existed until about three minutes before I typed that. But I guess this sort of defends the argument I’m about to make here: with CSS Grid and Flexbox we don’t really need
float at all. The property was really designed to do one thing: let text wrap around images. But now, with grid and flexbox, we have wonderful powers that can do all the heavy lifting for real layouts.
Back to the argument I was having at work. Some folks said that we should go back and delete all the instances of
float in our codebase because it’s old code and we can easily replace it with flexbox or grid. But this is where I’d say,
Whoa! hold up a sec. I don’t think having the
float property in a few places in our codebase is doing that much harm at all — this isn’t radioactive code that’s causing problems.
So should we be using CSS
float for anything besides letting text wrap around text? Nope. But should we all go out and immediately purge the web of CSS float declarations because it’s not pure and not the “correct” way of doing things? Nope again.
The nifty thing about the web is that old code shouldn’t break things. Just ask Chris. A website that isn’t using the fanciest CSS properties or the coolest tricks isn’t useless or bad. We’ve simply replaced
float with alternatives that are better. I think it’s a good lesson here that these CSS properties are likely going to stick around forever because they still have applicable use cases in modern web design.
And that’s okay.
You can support CSS-Tricks by being an MVP Supporter.