CSS中經常使用clearfix清除浮動,作者列出了幾個clearfix的不同的使用方法進行對比,需要的朋友可以參考下css clearfix清除浮動的方法.(css為什麼要清除浮動(float)? Baidu隨便一搜"css清除浮動",就會發現很多網站都講到"盒子清除內部浮動時可以用到.clearfix"。
.clearfix:after { content: " "; display: block; clear: both; height: 0; } .clearfix { zoom: 1; }<p class="clearfix"> <p class="floated"></p> </p>上面的程式碼是.clearfix的定義和應用,簡單的說下.clearfix的原理:
1、在IE6, 7下zoom: 1會觸發hasLayout,從而使元素閉合內部的浮動。
2、在標準瀏覽器下,.clearfix:after這個偽類會在應用到.clearfix的元素後面插入一個clear: both的塊級元素,從而達到清除浮動的作用。
<p> <p class="floated"></p> </p> <p style="clear: both"></p>二,.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 { float: left; display: block; padding: 0 1em; margin: 0 1em 0 0; background: #ccc; } .placeholder { background: yellow; height: 400px; } </style> </head> <body> <p class="left-col"> </p> <p class="right-col"> <ul class="menu"> <li>Menu Item</li> <li>Menu Item</li> <li>Menu Item</li> <li>Menu Item</li> <li>Menu Item</li> <li>Menu Item</li> </ul> <p class="placeholder"></p> </p> </body> </html>
上面的程式碼構成一個兩列佈局的頁面。注意.menu這個選單設定了邊框,但是由於.menu的li元素是左浮動的,導致.menu沒有高度,於是可以用.clearfix來清除.menu內部的浮動。程式碼如下:
<ul class="menu clearfix"> <li>Menu Item</li> <li>Menu Item</li> <li>Menu Item</li> <li>Menu Item</li> <li>Menu Item</li> <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 { zoom: 1; display: table; width: 100%; }四,總結
在IE6, 7下面只要是觸發了hasLayout的元素就可以清除內部浮動了。而在標準瀏覽器下面清除元素內部浮動的方法有很多,除了.clearfix:after這種方式,其餘的方法無非就是產生新的Block Formatting Context以達到目的。如果可以做到在什麼條件下用哪種方法,我認為這樣就足夠了......
更多關於css clearfix清除浮動的方法的相關文章,請關注php中文網
相關文章:
深入解析clearfix清除浮動 css之clearfix的用法深入理解 # ###淺談css清除浮動clearfix和clear的用法介紹#############CSS之關於clearfix清除浮動方法#######