起源:
<span>.clearfix</span><span>:after</span><span>{</span><span>visibility</span><span>:</span><span>hidden</span><span>;</span><span>display</span><span>:</span><span>block</span><span>;</span><span>font-size</span><span>:</span><span>0</span><span>;</span><span>content</span><span>:</span><span>" "</span><span>;</span><span>clear</span><span>:</span><span>both</span><span>;</span><span>height</span><span>:</span><span>0</span><span>;</span><span>}</span><span>.clearfix</span><span>{</span><span>display</span><span>:</span><span>inline-table</span><span>;</span><span>}</span><span>/* Hides from IE-mac */</span><span>*</span>html<span>.clearfix</span><span>{</span><span>height</span><span>:</span><span><span>1</span>%</span><span>;</span><span>}</span><span>.clearfix</span><span>{</span><span>display</span><span>:</span><span>block</span><span>;</span><span>}</span><span>/* End hide from IE-mac */</span>
說明:
*對大多數(shù)符合標準的瀏覽器應(yīng)用第一個聲明塊,目的是創(chuàng)建一個隱形的
內(nèi)容為空的塊來為目標元素清除浮動,
清除浮動新說網(wǎng)頁設(shè)計
。*第二條為clearfix應(yīng)用 inline-table 顯示屬性,僅僅針對IE/Mac。
*利用 * / 對 IE/Mac 隱藏一些規(guī)則:
* height:1% 用來觸發(fā) IE6 下的haslayout。
*重新對 IE/Mac 外的IE應(yīng)用 block 顯示屬性。
*最后一行用于結(jié)束針對 IE/Mac 的hack。
由于此方法針對的瀏覽器或成為歷史(尤其是Mac下的IE5 ),或正在靠近
標準的路上,這個方法就不再那么與時俱進了。
拋掉對 IE/Mac 的支持之后,新的清除浮動方法:
<span>/* new clearfix */</span><span>.clearfix</span><span>:after</span><span>{</span><span>visibility</span><span>:</span><span>hidden</span><span>;</span><span>display</span><span>:</span><span>block</span><span>;</span><span>font-size</span><span>:</span><span>0</span><span>;</span><span>content</span><span>:</span><span>" "</span><span>;</span><span>clear</span><span>:</span><span>both</span><span>;</span><span>height</span><span>:</span><span>0</span><span>;</span><span>}</span><span>*</span>html .clearfix<span>{</span>zoom<span>:</span><span>1</span><span>;</span><span>}</span><span>/* IE6 */</span><span>*</span><span>:first-child</span><span>+</span>html<span>.clearfix</span><span>{</span>zoom<span>:</span><span>1</span><span>;</span><span>}</span><span>/* IE7 */</span>
說明:
IE6 和 IE7 都不支持 :after 這個偽類,因此需要后面兩條來觸發(fā)IE6/7的haslayout,以清除浮動。幸運的是IE8支持 :after 偽類。因此只需要針對IE6/7的hack了。
糖伴西紅柿說:
Jeff Starr 在這里針對IE6/7用了兩條語句來觸發(fā)haslayout。我在想作者為什么不直接用 * 來直接對 IE6/7 同時應(yīng)用 zoom:1 或者直接就寫成:
<span>.clearfix</span><span>:after</span><span>{</span><span>visibility</span><span>:</span><span>hidden</span><span>;</span><span>display</span><span>:</span><span>block</span><span>;</span><span>font-size</span><span>:</span><span>0</span><span>;</span><span>content</span><span>:</span><span>" "</span><span>;</span><span>clear</span><span>:</span><span>both</span><span>;</span><span>height</span><span>:</span><span>0</span><span>;</span>zoom<span>:</span><span>1</span><span>;</span><span>}</span>
以我目前的淺薄認知來講,以上寫法應(yīng)該也可以直接達到同樣效果,
電腦資料
《清除浮動新說網(wǎng)頁設(shè)計》(http://www.msguai.com)。關(guān)于這個地方,在文章的評論里也有些討論,我希望再聽聽大家的高見。我平時都是用 overflow:hidden 來清除浮動的,因為夠簡單粗暴。但是 overflow 有時候也不太適用:
父級元素使用 overflow:hidden 時,如果其子元素定位到部分或全部在父元素之外,父元素就會對超出其外的子元素部分進行裁剪。
對 css3 來說,也會 overflow:hidden 也會對一些屬性產(chǎn)生影響。
例如 box-shadow, 當父元素使用 overflow:hidden 屬性時,box-shadow 會被裁剪。
其他可能被影響的元素如 text-shadow 和 transform?梢詤⒖ Andy Ford 的 demo
對于那些不愿意再給標簽添加額外的 clearfix 類來清除浮動的人來說,直接將需要清除浮動的元素添加進清除浮動代碼塊這個組也是一個辦法。
<span>.group</span><span>:after</span><span>,</span><span>#content</span><span>:after</span><span>,</span><span>#sidebar</span><span>:after</span><span>,</span><span>#some</span><span>.other</span><span>.thing</span><span><span>:</span>after</span><span>{</span><span>visibility</span><span>:</span><span>hidden</span><span>;</span><span>display</span><span>:</span><span>block</span><span>;</span><span>font-size</span><span>:</span><span>0</span><span>;</span><span>content</span><span>:</span><span>" "</span><span>;</span><span>clear</span><span>:</span><span>both</span><span>;</span><span>height</span><span>:</span><span>0</span><span>;</span>zoom<span>:</span><span>1</span><span>;</span><span>}</span>
這種情況下,html 和 css 文件就像一個蹺蹺板的兩頭。html 代碼倒是整潔了,css 代碼卻出現(xiàn)了一定的繁冗。而且一旦專題頁面過長,或者在項目中使用,用這個清除組的方式反而會不勝其擾。
歸結(jié)下來,還是得看個人、項目的權(quán)衡選擇.雖然我一直用簡單粗暴的overflow:hidden,但是現(xiàn)在更傾向于使用 clearfix,感覺這種一體化的東西更靠譜,能避免偶爾對 zoom 的遺忘。
成熟的東西穩(wěn)定性好,但是會比較復(fù)雜、厚重;簡單的靈活性好,但是過于零散、隨意,沒有組織性,還沒那么穩(wěn)定.權(quán)衡決定到底要使用那種方法,有時候反而比問題本身還讓人頭疼.
我個人的想法是沒有好與壞的區(qū)別,只有合適不合適的區(qū)別。但是我們一直都受困于所受的教育,什么問題都有標準答案,非對即錯,非好即壞。經(jīng)?梢妼σ恍┕ぞ叩挠懻摚际潜贾鵂幊鰝誰好誰壞而去的,例如 jQuery mootools YUI.相比起到底是好誰壞,我們還是最好趕緊轉(zhuǎn)變思想,摒棄”一刀切”的思想吧。
最后,關(guān)于為什么要采用一下這種復(fù)雜方式來針對IE6/7,而不采用其他稍微簡潔的方式,還希望大家給我指點下迷津。
<span>*</span>html .clearfix<span>{</span>zoom<span>:</span><span>1</span><span>;</span><span>}</span><span>/* IE6 */</span><span>*</span><span>:first-child</span><span>+</span>html<span>.clearfix</span><span>{</span>zoom<span>:</span><span>1</span><span>;</span><span>}</span><span>/* IE7 */</span>
Reference:
[1].Jeff Starr,The New Clearfix Method, December 6, 2009
[2].Andy Ford, Saying Goodbye to the overflow: hidden Clearing Hack, December 10th, 2009
本文來自:http://www.qianduan.net/new-clearfix.html