The <^>clearfix<^> hack has been around for a long time now, and patches a problem that can happen with floating elements that are larger than their container.

Here's an example of the problem:

				
					
.box {

  padding: 1rem;

  background: rgba(255, 105, 180, 0.1);

  border: 3px dashed rgba(255, 105, 180, 0.1);

  border-radius: 5px;

}

.box img {

  float: left;

}

				
			
				
					
&lt;div class="box"&gt;

  &lt;img class="sammy" src="Sammy_punk.svg" width="200" height="128" alt="Sammy!"&gt;

  Lorem ipsum dolor sit amet, consectetur adipiscing elit...

&lt;/div&gt;

				
			
				
					&lt;div class="demowrap"&gt;
				
			
				
					&lt;div class="box"&gt;
				
			

<img class="sammy" src="images/css-no-more-clearfix-flow-root-section-1.png; width="200" height="128"

alt="Sammy!">

Lorem ipsum dolor sit amet, consectetur adipiscing elit…

</div>

</div>

Old clearfix hacks

flow-root illustration for: Old clearfix hacks

The old fix was to set overflow: auto on the container, so a class like this is often created and used on elements that contain floated elements:

				
					
.clearfix {

  overflow: auto;

}

				
			
				
					
&lt;div class="box clearfix"&gt;

  &lt;img class="sammy" src="Sammy_punk.svg" width="200" height="128" alt="Sammy!"&gt;

  Lorem ipsum dolor sit amet, consectetur adipiscing elit...

&lt;/div&gt;

				
			

And now everything works as expected:

				
					&lt;div class="demowrap"&gt;
				
			
				
					&lt;div class="box clearfix"&gt;
				
			

<img class="sammy" src="images/css-no-more-clearfix-flow-root-section-1.png; width="200" height="128"

alt="Sammy!">

Lorem ipsum dolor sit amet, consectetur adipiscing elit…

</div>

</div>

display: flow-root Improvements

With <^>display: flow-root<^> on the container element, a new block formatting context is established for the element with flow layout formatting, and this fixes our overflowing issues much more elegantly.

				
					
.box {

  display: flow-root;

  padding: 1rem;

  background: rgba(255, 213, 70, 0.1);

  border-bottom: 2px solid rgba(236, 198, 48, 0.2);

}

				
			
				
					
&lt;div class="box"&gt;

  &lt;img class="sammy" src="Sammy_punk.svg" width="200" height="128" alt="Sammy!"&gt;

  Lorem ipsum dolor sit amet, consectetur adipiscing elit...

&lt;/div&gt;

				
			
				
					&lt;div class="demowrap"&gt;
				
			
				
					&lt;div class="box box2"&gt;
				
			

<img class="sammy" src="images/css-no-more-clearfix-flow-root-section-1.png; width="200" height="128"

alt="Sammy!">

Lorem ipsum dolor sit amet, consectetur adipiscing elit…

</div>

</div>

Browser Compatibility

As of 2020, 87% of browsers worldwide will properly handle flow-root, based on Can I Use data. Opera Mini and Internet Explorer 11 cannot handle display: flow-root;, but in 2020 it makes up less than 1.5% of worldwide usage.

<style>

.demowrap {

margin: 16px;

display: flow-root;

}

.box {

padding: 1rem;

background: rgba(255, 105, 180, 0.1);

border: 3px dashed rgba(255, 105, 180, 0.1);

border-radius: 5px;

}

.sammy {

float: left;

border: none!important;

}

.clearfix {

overflow: auto;

}

.box2 {

display: flow-root;

}

</style>