一,什麼是.clearfix
你隻要到Google或者Baidu随便一搜"css清除浮動",就會發現很多網站都講到"盒子清除内部浮動時可以用到.clearfix"。
.clearfix:after {
content: " ";
display: block;
clear: both;
height: 0;
}
.clearfix {
zoom: 1;
<div class="clearfix">
<div class="floated"></div>
</div>
上面的代碼就是.clearfix的定義和應用,簡單的說下.clearfix的原理:
1、在IE6, 7下zoom: 1會觸發hasLayout,進而使元素閉合内部的浮動。
2、在标準浏覽器下,.clearfix:after這個僞類會在應用到.clearfix的元素後面插入一個clear: both的塊級元素,進而達到清除浮動的作用。
<div>
<div style="clear: both"></div>
二,.clearfix的弊端
在上面的代碼中可以看到,抛開IE6, 7不談,.clearfix在标準浏覽器下插入了一個clear: both的元素,這樣很可能清除掉不必要的浮動。舉例來說明:
<!DOCTYPE html>
<html>
<head>
<title>Demo</title>
<style type="text/css">
html, body { padding: 0; margin: 0; }
ul { margin: 0; padding: 0; }
.clearfix:after {
content: " ";
display: block;
clear: both;
height: 0;
}
.clearfix {
zoom: 1;
.left-col {
background: red;
float: left;
width: 100px;
height: 300px;
.right-col {
margin-left: 100px;
.menu {
border: 1px solid #000;
.menu li {
padding: 0 1em;
margin: 0 1em 0 0;
background: #ccc;
.placeholder {
background: yellow;
height: 400px;
</style>
</head>
<body>
<div class="left-col">
</div>
<div class="right-col">
<ul class="menu">
<li>Menu Item</li>
</ul>
<div class="placeholder"></div>
</body>
</html>
上面的代碼構成一個兩列布局的頁面。注意.menu這個菜單設定了邊框,但是由于.menu的li元素是左浮動的,導緻.menu沒有高度,于是可以用.clearfix來清除.menu内部的浮動。代碼如下:
<ul class="menu clearfix">
<li>Menu Item</li>
</ul>
但是應用完.clearfix後,在标準浏覽器下頁面變得很亂,這是因為.clearfix:after把.left-col的浮動也給清除掉了。
三,重構.clearfix
在
遭遇到上面的錯誤之後,分析一下除了.clearfix:after這種方式之外還有沒有别的方法清除元素内部的浮動。答案是有的,在白話Block
Formatting Contexts這篇文章中提到過構成Block Formatting
Context的元素可以清除内部元素的浮動。那麼隻要使.clearfix形成Block Formatting
Context就好了。構成Block Formatting Context的方法有下面幾種:
float的值不為none。overflow的值不為visible。display的值為table-cell, table-caption, inline-block中的任何一個。position的值不為relative和static。
很
明顯,float和position不合适我們的需求。那隻能從overflow或者display中選取一個。因為是應用了.clearfix
和.menu的菜單極有可能是多級的,是以overflow: hidden或overflow:
auto也不滿足需求(會把下拉的菜單隐藏掉或者出滾動條),那麼隻能從display下手。
我們可以将.clearfix的
display值設為table-cell, table-caption, inline-block中的任何一個,但是display:
inline-block會産生多餘空白,是以也排除掉。剩下的隻有table-cell,
table-caption,為了保證相容可以用display: table來使.clearfix形成一個Block Formatting
Context,因為display:
table會産生一些匿名盒子,這些匿名盒子的其中一個(display值為table-cell)會形成Block Formatting
Context。這樣我們新的.clearfix就會閉合内部元素的浮動。下面是重構之後的.clearfix。
display: table;
四,總結
在IE6,
7下面隻要是觸發了hasLayout的元素就可以清除内部浮動了。而在标準浏覽器下面清除元素内部浮動的方法有很多,除
了.clearfix:after這種方式,其餘的方法無非就是産生新的Block Formatting
Context以達到目的。如果可以做到在什麼條件下用哪種方法,我認為這樣就足夠了......
本文轉自:http://www.missage.com/1220.html
原文連結:http://www.45eggs.com/xhtml-css/2011/css-clearfix.html