I was looking for the best way to clear floats and find this perfect solution, if you take a look at the answer, the solution use display:table
rather than display:block
, the reason is explained:
The use of
table
rather thanblock
is only necessary if using:before
to contain the top-margins of child elements.
I try to understand the meaning, I did some tests but I can't figure out what is the reason for using the display:table
, if anyone can provide a code example to show the difference and the need to use display:table
.
Edit:
Here is a fiddle, I try to test the difference, I'm sure there is one but I can't figure out what to test.
Edit for clarifications:
My question is not about the difference between display block/table
, my question is about the reason for using the display:table
and not display:block
(in relation of clearing floats), there is an explanation brought by Bryan from this answer, but I can't understand the reason, if anyone can explain what the reason and maybe provide a code example that illustrate the difference.
The ::before pseudo-element can be used to insert some content before the content of an element.
Special welcome offer: get $200 of free credit. CSS ::before and ::after pseudo-elements allow you to insert “content” before and after any non-replaced element (e.g. they work on a <div> but not an <input> ). This effectively allows you to show something on a web page that might not be present in the HTML content.
1, an element can only have at most one of any kind of pseudo-element at any time. (This means an element can have both a :before and an :after pseudo-element — it just cannot have more than one of each kind.)
The comment — and by extension, the code — that you've quoted is from the micro clearfix hack as proposed by Nicolas Gallagher, as mentioned in the top answer to that question. Nicolas wrote an article introducing the technique (which for some reason isn't linked to within the other answer), and in it he explains why display: table
is used, as follows:
This “micro clearfix” generates pseudo-elements and sets their
display
totable
. This creates an anonymous table-cell and a new block formatting context that means the:before
pseudo-element prevents top-margin collapse. The:after
pseudo-element is used to clear the floats. As a result, there is no need to hide any generated content and the total amount of code needed is reduced.
In more detail, if an element has a first child and both of them are display: block
, and the child has a top margin, what happens is that the child margin will combine, or collapse, with the parent margin (if any), resulting in the top margin apparently disappearing from the child element, which can sometimes be undesirable. For an illustration of this effect, see this question.
Margins do not collapse through table elements for obvious reasons, which is why the display: table
hack works.
So, basically, the display: table
— and by extension, the :before
pseudo-element — is not essential to the clearfix, just an additional hack to block margins from collapsing between an element and its first child. If all you want to do is clear inner floats, which is what a clearfix is meant to do, then you don't need display: table
or :before
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With