Recently I was looking through some website's code, and saw that every <div>
had a class clearfix
.
After a quick Google search, I learned that it is for IE6 sometimes, but what actually is a clearfix?
Could you provide some examples of a layout with a clearfix, compared to a layout without a clearfix?
This question is related to
html
css
layout
cross-browser
clearfix
To offer an update on the situation on Q2 of 2017.
A new CSS3 display property is available in Firefox 53, Chrome 58 and Opera 45.
.clearfix {
display: flow-root;
}
Check the availability for any browser here: http://caniuse.com/#feat=flow-root
The element (with a display property set to flow-root) generates a block container box, and lays out its contents using flow layout. It always establishes a new block formatting context for its contents.
Meaning that if you use a parent div containing one or several floating children, this property is going to ensure the parent encloses all of its children. Without any need for a clearfix hack. On any children, nor even a last dummy element (if you were using the clearfix variant with :before on the last children).
.container {_x000D_
display: flow-root;_x000D_
background-color: Gainsboro;_x000D_
}_x000D_
_x000D_
.item {_x000D_
border: 1px solid Black;_x000D_
float: left;_x000D_
}_x000D_
_x000D_
.item1 { _x000D_
height: 120px;_x000D_
width: 120px;_x000D_
}_x000D_
_x000D_
.item2 { _x000D_
height: 80px;_x000D_
width: 140px;_x000D_
float: right;_x000D_
}_x000D_
_x000D_
.item3 { _x000D_
height: 160px;_x000D_
width: 110px;_x000D_
}
_x000D_
<div class="container">_x000D_
This container box encloses all of its floating children._x000D_
<div class="item item1">Floating box 1</div>_x000D_
<div class="item item2">Floating box 2</div> _x000D_
<div class="item item3">Floating box 3</div> _x000D_
</div>
_x000D_
A technique commonly used in CSS float-based layouts is assigning a handful of CSS properties to an element which you know will contain floating elements. The technique, which is commonly implemented using a class definition called clearfix
, (usually) implements the following CSS behaviors:
.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
zoom: 1
}
The purpose of these combined behaviors is to create a container :after
the active element containing a single '.' marked as hidden which will clear all preexisting floats and effectively reset the the page for the next piece of content.
Here is a different method same thing but a little different
the difference is the content dot which is replaced with a \00A0
== whitespace
More on this http://www.jqui.net/tips-tricks/css-clearfix/
.clearfix:after { content: "\00A0"; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;}
.clearfix{ display: inline-block;}
html[xmlns] .clearfix { display: block;}
* html .clearfix{ height: 1%;}
.clearfix {display: block}
Here is a compact version of it...
.clearfix:after { content: "\00A0"; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;width:0;font-size: 0px}.clearfix{ display: inline-block;}html[xmlns] .clearfix { display: block;}* html .clearfix{ height: 1%;}.clearfix {display: block}
The other answers are correct. But I want to add that it is a relic of the time when people were first learning CSS, and abused float
to do all their layout. float
is meant to do stuff like float images next to long runs of text, but lots of people used it as their primary layout mechanism. Since it wasn't really meant for that, you need hacks like "clearfix" to make it work.
These days display: inline-block
is a solid alternative (except for IE6 and IE7), although more modern browsers are coming with even more useful layout mechanisms under names like flexbox, grid layout, etc.
I tried out the accepted answer but I still had a problem with the content alignment. Adding a ":before" selector as shown below fixed the issue:
// LESS HELPER
.clearfix()
{
&:after, &:before{
content: " "; /* Older browser do not support empty content */
visibility: hidden;
display: block;
height: 0;
clear: both;
}
}
LESS above will compile to CSS below:
clearfix:after,
clearfix:before {
content: " ";
/* Older browser do not support empty content */
visibility: hidden;
display: block;
height: 0;
clear: both;
}
The other (and perhaps simplest) option for acheiving a clearfix is to use overflow:hidden;
on the containing element. For example
.parent {_x000D_
background: red;_x000D_
overflow: hidden;_x000D_
}_x000D_
.segment-a {_x000D_
float: left;_x000D_
}_x000D_
.segment-b {_x000D_
float: right;_x000D_
}
_x000D_
<div class="parent">_x000D_
<div class="segment-a">_x000D_
Float left_x000D_
</div>_x000D_
<div class="segment-b">_x000D_
Float right_x000D_
</div>_x000D_
</div>
_x000D_
Of course this can only be used in instances where you never wish the content to overflow.
Simply put, clearfix is a hack.
It is one of those ugly things that we all just have to live with as it is really the only reasonable way of ensuring floated child elements don't overflow their parents. There are other layout schemes out there but floating is too commonplace in web design/development today to ignore the value of the clearfix hack.
I personally lean towards the Micro Clearfix solution (Nicolas Gallagher)
.container:before,
.container:after {
content:"";
display:table;
}
.container:after {
clear:both;
}
.container {
zoom:1; /* For IE 6/7 (trigger hasLayout) */
}
The clearfix
allows a container to wrap its floated children. Without a clearfix
or equivalent styling, a container does not wrap around its floated children and collapses, just as if its floated children were positioned absolutely.
There are several versions of the clearfix, with Nicolas Gallagher and Thierry Koblentz as key authors.
If you want support for older browsers, it's best to use this clearfix :
.clearfix:before, .clearfix:after {
content: "";
display: table;
}
.clearfix:after {
clear: both;
}
.clearfix {
*zoom: 1;
}
In SCSS, you could use the following technique :
%clearfix {
&:before, &:after {
content:" ";
display:table;
}
&:after {
clear:both;
}
& {
*zoom:1;
}
}
#clearfixedelement {
@extend %clearfix;
}
If you don't care about supporting older browsers, there's a shorter version :
.clearfix:after {
content:"";
display:table;
clear:both;
}
Source: Stackoverflow.com