Frontend•Jun 2026•3 min read

Css Float vs Flexbox

Float was a hack for wrapping text around images that we abused into a layout system for a decade. Flexbox is an actual layout system. This isn't close.

The short answer

Flexbox over Css Float for most cases. Float was never a layout tool — it was designed to flow text around images, and we tortured it into building page columns with clearfix hacks and margin math.

  • Pick Css Float if literally wrapping text around a pull-quote or an image inside prose — the one job float was actually designed for
  • Pick Flexbox if building anything resembling a layout: navbars, card rows, centered content, toolbars, sidebars, equal-height columns
  • Also consider: For true two-dimensional grids (rows AND columns at once), reach past both for CSS Grid. Flexbox is one-axis; Grid is two.

— Nice Pick, opinionated tool recommendations

What they actually are

Float is a 1996-era property whose entire purpose was letting text wrap around an image. That's it. Everything else — multi-column layouts, grids, sticky footers — was a community workaround built on top of a feature that was never meant to do it. Flexbox (flexible box layout) is a purpose-built CSS module for distributing space and aligning items along a single axis, shipped to fix exactly the layout problems float made miserable. Calling them competitors is generous to float; it's like comparing a butter knife to a chef's knife because someone once spread jam with both. One was repurposed under duress. The other was engineered for the job. Treating float as a layout system is a habit inherited from an era that had no better option, and that era ended around 2017.

The pain of float layouts

Float layouts leak. The moment you float children, the parent collapses to zero height because floats are removed from normal flow — so you memorize the clearfix hack (::after { content: ''; display: table; clear: both; }) and paste it everywhere like a tax. Vertical centering? Impossible without absolute positioning or table tricks. Equal-height columns? You fake them with background images or JavaScript. Gutters become a margin-math puzzle where 33.333% minus a 20px gap fights the box model. Source order dictates visual order, so responsive reflows mean rewriting markup. Every float-based grid framework — the old Bootstrap, the 960 grid — existed purely to hide this misery behind generated classes. That's the tell: you needed an entire abstraction layer just to make float behave. Decisive: if your layout strategy requires a named hack to not collapse, it isn't a layout strategy.

Why Flexbox wins outright

display: flex gives you a parent that contains its children, distributes space, and aligns on both axes — without a single clearing hack. justify-content handles horizontal distribution, align-items handles vertical, and the legendary vertical-centering problem becomes two lines. gap replaces the entire margin-math circus. order and flex-direction let you reflow layout for mobile without touching HTML source order. flex-grow / flex-shrink / flex-basis express 'fill remaining space' declaratively instead of you computing percentages by hand. Browser support has been universal since 2017; there is no compatibility argument left for serious projects. What took a framework, a clearfix, and a prayer in float takes three properties in Flexbox. It's not a marginal improvement — it's the difference between fighting the language and writing it. The only thing float still does better is wrap text around an image, which, again, is its actual job.

The honest exception

There is exactly one case where float beats Flexbox, and I'll name it so nobody accuses me of zealotry: text wrapping. If you want a paragraph to flow around a floated image or a pull-quote that prose hugs on one side, float is the right and only tool — Flexbox treats children as flex items and won't let inline text wrap around them. shape-outside even lets float wrap text around non-rectangular shapes, which Flexbox can't touch. So keep float for typographic image embeds inside running copy. For everything structural, it's retired. And don't confuse this verdict with a vote for Flexbox-for-everything: two-dimensional layouts belong to CSS Grid. The real hierarchy is Grid for page-level 2D structure, Flexbox for 1D component alignment, and float for the narrow typographic job it was born to do. Float as a layout engine is dead. Let it rest.

Quick Comparison

FactorCss FloatFlexbox
Designed for layoutNo — built for text wrapping, abused into layoutYes — purpose-built layout module
Vertical centeringRequires absolute positioning or table hacksalign-items: center, two lines
Container collapseParent collapses, needs clearfix hack everywhereParent contains flex children automatically
Responsive reorder without HTML changeSource order locks visual orderorder and flex-direction reflow freely
Text wrapping around an imageNative job, plus shape-outsideCannot wrap inline text around items

The Verdict

Use Css Float if: You are literally wrapping text around a pull-quote or an image inside prose — the one job float was actually designed for.

Use Flexbox if: You are building anything resembling a layout: navbars, card rows, centered content, toolbars, sidebars, equal-height columns.

Consider: For true two-dimensional grids (rows AND columns at once), reach past both for CSS Grid. Flexbox is one-axis; Grid is two.

🧊
The Bottom Line
Flexbox wins

Float was never a layout tool — it was designed to flow text around images, and we tortured it into building page columns with clearfix hacks and margin math. Flexbox was built for layout: alignment, distribution, and ordering in one axis with one declaration. Use Flexbox.

Related Comparisons

Disagree? nice@nicepick.dev