Using :after to clear floats
The example block below demonstrates how to use the :after pseudo-class to clear all floating elements in a block. In this example, the middle block (in this case a <p>) has a :after which will create another block and have it clear.
I'm normal content within the .p div
The code is pretty straight-forward
<style type="text/css">
.container p { margin: 0; border: 1px solid #ffff00; }
/* this is the middle element */
.container p:after {
display: block;
content: "I want this to clear";
border: 1px solid #900;
float: left;
clear: both;
}
.container {
border: 1px solid #0f0;
width: 80%;
margin: 0 auto;
}
.left {
float: left; width: 5em;
border: 1px solid #789;
}
.right {
float: right; width: 5em;
border: 1px solid #aca;
}
</style>
<!-- skip to you body -->
<div class="container">
<div class="left">
This div floats to the left
</div>
<div class="right">This is the right floating div</div>
<p>I'm normal content within the container div</p>
</div>
There are a few things to notice, first, the clearing block is applied not to the container, but rather the middle block. The middle block is denoted with a bright yellow border. The reason that this works is because the :after pseudo-class is still contained within the creating block. In the above example, the clearing block is denoted with a red border. Note: In IE you will not see the red bordered element at all.
Since the height of an in-the-flow block is stretched beyond the height of the floating elements, its container will grow as well. The container, in this example, has a green border.
IE does it wrong anyway
IE does this wrong anyway, so there is no containing floats issues with IE. And since IE ignores the :after pseudo-class, nothin is lost!
The only difference IE will show is that the yellow bordered inner-block will not stretch around all elements
The gotcha
In order for this to work in a layout, you need the content to probably be empty. No problem. Use the following CSS instead:
<style type="text/css">
.container p:after {
display: block;
clear: both;
content: " ";
height: 0;
overflow: hidden;
}
</style>
Using the above, the results look like this:
I'm normal content within the container div
It's magic! No red bordered element, no content, no gaps.
Thanks to Phrogz for the inspiration.

0 Comments:
Post a Comment
<< Home