起源:css
.clearfix:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; } .clearfix { display: inline-table; } /* Hides from IE-mac \*/ * html .clearfix { height: 1%; } .clearfix { display: block; } /* End hide from IE-mac */
說明:html
因爲此方法針對的瀏覽器或成爲歷史(尤爲是Mac下的IE5 ),或正在靠近
標準的路上,這個方法就再也不那麼與時俱進了。ios
拋掉對 IE/Mac 的支持以後,新的清除浮動方法:css3
/* new clearfix */ .clearfix:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; } * html .clearfix { zoom: 1; } /* IE6 */ *:first-child+html .clearfix { zoom: 1; } /* IE7 */
說明:瀏覽器
IE6 和 IE7 都不支持 :after 這個僞類,所以須要後面兩條來觸發IE6/7的haslayout,以清除浮動。幸運的是IE8支持 :after 僞類。所以只須要針對IE6/7的hack了。ide
糖伴西紅柿說:
Jeff Starr 在這裏針對IE6/7用了兩條語句來觸發haslayout。我在想做者爲何不直接用 * 來直接對 IE6/7 同時應用 zoom:1 或者直接就寫成:工具
.clearfix:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; } .clearfix{*zoom:1;}
以我目前的淺薄認知來說,以上寫法應該也能夠直接達到一樣效果。關於這個地方,在文章的評論裏也有些討論,我但願再聽聽你們的高見。spa
我平時都是用 overflow:hidden 來清除浮動的,由於夠簡單粗暴。可是 overflow 有時候也不太適用:code
父級元素使用 overflow:hidden 時,若是其子元素定位到部分或所有在父元素以外,父元素就會對超出其外的子元素部分進行裁剪。orm
對 css3 來講,也會 overflow:hidden 也會對一些屬性產生影響。
例如 box-shadow, 當父元素使用 overflow:hidden 屬性時,box-shadow 會被裁剪。
其餘可能被影響的元素如 text-shadow 和 transform。能夠參考 Andy Ford 的 demo
對於那些不肯意再給標籤添加額外的 clearfix 類來清除浮動的人來講,直接將須要清除浮動的元素添加進清除浮動代碼塊這個組也是一個辦法。
.group:after, #content:after, #sidebar:after, #some .other .thing:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; zoom:1; }
這種狀況下,html 和 css 文件就像一個蹺蹺板的兩頭。html 代碼卻是整潔了,css 代碼卻出現了必定的繁冗。並且一旦專題頁面過長,或者在項目中使用,用這個清除組的方式反而會不勝其擾。
歸結下來,仍是得看我的、項目的權衡選擇.雖然我一直用簡單粗暴的overflow:hidden,可是如今更傾向於使用 clearfix,感受這種一體化的東西更靠譜,能避免偶爾對 zoom 的遺忘。
成熟的東西穩定性好,可是會比較複雜、厚重;簡單的靈活性好,可是過於零散、隨意,沒有組織性,還沒那麼穩定.權衡決定到底要使用那種方法,有時候反而比問題自己還讓人頭疼.
我我的的想法是沒有好與壞的區別,只有合適不合適的區別。可是咱們一直都受困於所受的教育,什麼問題都有標準答案,非對即錯,非好即壞。常常可見對 一些工具的討論,都是奔着爭出個誰好誰壞而去的,例如 jQuery mootools YUI.相比起究竟是好誰壞,咱們仍是最好趕忙轉變思想,摒棄」一刀切」的思想吧。