我想大家在寫CSS的時候應(yīng)該都對清除浮動的用法深有體會,今天我們就還討論下clearfix的進化史吧。

  clearfix清除浮動

  首先在很多很多年以前我們常用的清除浮動是這樣的。

.clear{clear:both;line-height:0;}

  現(xiàn)在可能還可以在很多老的站點上可以看到這樣的代碼,相當(dāng)暴力有效的解決浮動的問題。但是這個用法有一個致命傷,就是每次清除浮動的時候都需要增加一個空標(biāo)簽來使用。

  這種做法如果在頁面復(fù)雜的布局要經(jīng)常清楚浮動的時候就會產(chǎn)生很多的空標(biāo)簽,增加了頁面無用標(biāo)簽,不利于頁面優(yōu)化。但是我發(fā)現(xiàn)大型網(wǎng)站中 居然還在使用這種清楚浮動的方法。有興趣的同學(xué)可以上他們首頁搜索一下他們的.blank0這個樣式名稱。

  因此有很多大神就研究出了 clearfix 清除浮動的方法,直接解決了上面的缺陷,不需要增加空標(biāo)簽,直接在有浮動的外層加上這個樣式就可以了,這也是我們今天要討論的clearfix進化史。

  起源

.clearfix:after { 
    visibility: hidden; 
    display: block; 
    font-size: 0; 
    content: " "; 
    clear: both; 
    height: 0; 
} 
.clearfix { display: inline-table; } 

* html .clearfix { height: 1%; }//Hides from IE-mac 
.clearfix { display: block; }//End hide from IE-mac 

  解釋一下以上的代碼:

  起源代碼可能也是很早期的時候了,再往后Mac下的IE5也發(fā)展到IE6了,各種瀏覽器開始向W3C這條標(biāo)準(zhǔn)慢慢靠齊了。所以就有了下面這個寫法出現(xiàn)了。

.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 這個偽類,因此需要后面兩條來觸發(fā)IE6/7的haslayout,以清除浮動。幸運的是IE8支持 :after 偽類。因此只需要針對IE6/7的hack了。

  在一個有float 屬性元素的外層增加一個擁有clearfix屬性的div包裹,可以保證外部div的height,即清除"浮動元素脫離了文檔流,包圍圖片和文本的 div 不占據(jù)空間"的問題。

  Jeff Starr 在這里針對IE6/7用了兩條語句來觸發(fā)haslayout。我在想作者為什么不直接用 * 來直接對 IE6/7 同時應(yīng)用 zoom:1 或者直接就寫成:

.clearfix:after { 
    visibility: hidden; 
    display: block; 
    font-size: 0; 
    content: " "; 
    clear: both; 
    height: 0; 
} 
.clearfix{*zoom:1;} 

  但是對于很多同學(xué)這種優(yōu)化程度代碼還是不夠給力,clearfix 發(fā)展到現(xiàn)在的兩個終極版。

   重構(gòu)clearfix浮動

  構(gòu)成Block Formatting Context的方法有下面幾種: 

  float的值不為none。

  overflow的值不為visible。

  display的值為table-cell, table-caption, inline-block中的任何一個。 

  position的值不為relative和static。 

  很明顯,float和position不合適我們的需求。那只能從overflow或者display中選取一個。

  因為是應(yīng)用了.clearfix和.menu的菜單極有可能是多級的,所以overflow: hidden或overflow: auto也不滿足需求

 ?。〞严吕牟藛坞[藏掉或者出滾動條),那么只能從display下手。 

  我們可以將.clearfix的display值設(shè)為table-cell, table-caption, inline-block中的任何一個

  但是display: inline-block會產(chǎn)生多余空白,所以也排除掉。

  剩下的只有table-cell, table-caption,為了保證兼容可以用display: table來使.clearfix形成一個Block Formatting Context

  因為display: table會產(chǎn)生一些匿名盒子,這些匿名盒子的其中一個(display值為table-cell)會形成Block Formatting Context。

  這樣我們新的.clearfix就會閉合內(nèi)部元素的浮動。

  后面又有人對此進行了改良:

  終極版一:

.clearfix:after { 
    content:"\200B"; 
    display:block; 
    height:0; 
    clear:both; 
} 
.clearfix {*zoom:1;}/*IE/7/6*/ 

  解釋下:content:"\200B";這個參數(shù),Unicode字符里有一個“零寬度空格”,即 U+200B,代替原來的“.”,可以縮減代碼量。而且不再使用visibility:hidden。

  終極版二:

.clearfix:before,.clearfix:after{ 
    content:""; 
    display:table; 
} 
.clearfix:after{clear:both;} 
.clearfix{ 
    *zoom:1;/*IE/7/6*/ 
} 

  這兩個終極版代碼都很簡潔,終極版一和二都可以使用,以上代碼都經(jīng)過測試,大家趕緊用一下吧,如果有什么問題請及時跟我反饋,如果你還停留在clearfix的老代碼的時候就趕緊更新一下代碼吧。

  哈爾濱品用軟件有限公司致力于為哈爾濱的中小企業(yè)制作大氣、美觀的優(yōu)秀網(wǎng)站,并且能夠搭建符合百度排名規(guī)范的網(wǎng)站基底,使您的網(wǎng)站無需額外費用,即可穩(wěn)步提升排名至首頁。歡迎體驗最佳的哈爾濱網(wǎng)站建設(shè)。