CSS:DIV未被撐開(如何修正DIV float之後導致的外部容器不能撐開)

來源:互聯網
上載者:User
CSS:DIV未被撐開(如何修正DIV float之後導致的外部容器不能撐開)
September 24, 2010 | tags | views 122

Comments 0

在寫HTML代碼的時候,發現在Firefox等符合W3C標準的瀏覽器中,如果有一個DIV作為外部容器,內部的DIV如果設定了float樣式,則外部的容器DIV因為內部沒有clear,導致不能被撐開。看下面的例子:

<div style="border: 1px solid red; width: 200px;"><br /><div style="border: 1px solid blue; float: left; width: 80px; height: 80px;">TEST DIV</div><br /><div style="border: 1px solid blue; float: left; width: 80px; height: 80px;">TEST DIV</div><br /><div style="border: 1px solid blue; float: left; width: 80px; height: 80px;">TEST DIV</div><br /><div style="border: 1px solid blue; float: left; width: 80px; height: 80px;">TEST DIV</div><br /><div style="border: 1px solid blue; float: left; width: 80px; height: 80px;">TEST DIV</div><br /></div>

  
  
    小提示:您還可以先修改部分HTML代碼再運行、複製或者儲存。

<div<br /> style="border: 1px solid red; width: 200px;"><br/><div<br />style="border: 1px solid blue; float: left; width: 80px; height:<br />80px;">TEST DIV</div><br/><div style="border: 1px<br />solid blue; float: left; width: 80px; height: 80px;">TEST<br />DIV</div><br/><div style="border: 1px solid blue; float:<br />left; width: 80px; height: 80px;">TEST<br />DIV</div><br/><div style="border: 1px solid blue; float:<br />left; width: 80px; height: 80px;">TEST<br />DIV</div><br/><div style="border: 1px solid blue; float:<br />left; width: 80px; height: 80px;">TEST<br />DIV</div><br/></div>

容器DIV沒有被撐開

大家可以看到,作為外部容器的邊框為紅色的DIV,沒有被撐開。這是因為內部的DIV因為float:left之後,就丟失了clear:both和display:block的樣式,所以外部的DIV不會被撐開。
我們想讓外部容器的DIV隨著內部DIV增多而增加高度,要怎麼解決呢?

以前我都是用這樣的方法來解決:

<div style="width:200px;border:1px solid red;"><br /><div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div><br /><div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div><br /><div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div><br /><div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div><br /><div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div><br /><div style="clear:both;"></div><br /></div>

  
  
    小提示:您還可以先修改部分HTML代碼再運行、複製或者儲存。

<div<br /> style="width:200px;border:1px solid red;"><br/><div<br />style="float:left;width:80px;height:80px;border:1px solid blue;">TEST<br /> DIV</div><br/><div<br />style="float:left;width:80px;height:80px;border:1px solid blue;">TEST<br /> DIV</div><br/><div<br />style="float:left;width:80px;height:80px;border:1px solid blue;">TEST<br /> DIV</div><br/><div<br />style="float:left;width:80px;height:80px;border:1px solid blue;">TEST<br /> DIV</div><br/><div<br />style="float:left;width:80px;height:80px;border:1px solid blue;">TEST<br /> DIV</div><br/><div<br />style="clear:both;"></div><br/></div>
顯示的結果如下:

顯示正常了

我們看到,在容器DIV內要顯示出來的float:left的所有的DIV之後,我們添加了這樣的一個DIV: 。這樣,其實就在最後增加了clear的動作。


是,我總覺得,這麼多加一個DIV有點不妥。一是多了一個沒有意義的DIV,二是在用dojo做Drag &
Drop的時候,由於這個DIV是容器DIV的一個位元組點,如果這個節點被移動,則會造成排版上的Bug:如果要顯示的藍框的DIV被移到這個DIV之
後,則因為clear:both,它會被強制換一行顯示。所以,我一直在尋找更好的解決辦法。

昨天在無數次的詢問了Google大仙后,我終於找到了How To Clear Floats Without Structural Markup 這篇文章,找到瞭解決的辦法。

首先設定這樣的CSS:
CSS代碼:

.clearfix:after {<br /> content: ".";<br /> display: block;<br /> height: 0;<br /> clear: both;<br /> visibility: hidden;<br /> }

  
  
    小提示:您還可以先修改部分HTML代碼再運行、複製或者儲存。

.clearfix:after {<br/> content: ".";<br/><br />display: block;<br/> height: 0;<br/> clear:<br />both;<br/> visibility: hidden;<br/> }

然後,我們再修改原來的HTML代碼,讓外部的容器DIV來使用這個CSS:

<div class="clearfix" style="border: 1px solid red; width: 200px;"><br /><div style="border: 1px solid blue; float: left; width: 80px; height: 80px;">TEST DIV</div><br /><div style="border: 1px solid blue; float: left; width: 80px; height: 80px;">TEST DIV</div><br /><div style="border: 1px solid blue; float: left; width: 80px; height: 80px;">TEST DIV</div><br /><div style="border: 1px solid blue; float: left; width: 80px; height: 80px;">TEST DIV</div><br /><div style="border: 1px solid blue; float: left; width: 80px; height: 80px;">TEST DIV</div><br /></div>

  
  
    小提示:您還可以先修改部分HTML代碼再運行、複製或者儲存。

<div<br /> class="clearfix" style="border: 1px solid red; width:<br />200px;"><br/><div style="border: 1px solid blue; float:<br />left; width: 80px; height: 80px;">TEST<br />DIV</div><br/><div style="border: 1px solid blue; float:<br />left; width: 80px; height: 80px;">TEST<br />DIV</div><br/><div style="border: 1px solid blue; float:<br />left; width: 80px; height: 80px;">TEST<br />DIV</div><br/><div style="border: 1px solid blue; float:<br />left; width: 80px; height: 80px;">TEST<br />DIV</div><br/><div style="border: 1px solid blue; float:<br />left; width: 80px; height: 80px;">TEST<br />DIV</div><br/></div>

在Firefox
裡測試一下,哈哈,這樣做的確很有效,顯示正常,而且dojo的 Drag & Drop
也不會有問題了。原來,這個clearfix的CSS使用了after這個偽對象,它將在應用clearfix的元素的結尾添加content中的內容。

在這裡添加了一個句號”.”,並且把它的display設定成block;高度設為0;clear設為both;visibility設為隱藏。這樣就達
到了撐開容器的目的啦。

但是,在文章中說,Windows IE並不支援這樣做。所以要讓IE也完美顯示,則必須在clearfix這個CSS定義的後面加上一些專門為IE設定的HACK。CSS如下:
CSS代碼:

.clearfix:after {<br /> content: ".";<br /> display: block;<br /> height: 0;<br /> clear: both;<br /> visibility: hidden;<br /> }<br /> /* Hides from IE-mac /*/<br /> * html .clearfix {height: 1%;}<br /> /* End hide from IE-mac */

  
  
    小提示:您還可以先修改部分HTML代碼再運行、複製或者儲存。

.clearfix:after {<br/> content: ".";<br/><br />display: block;<br/> height: 0;<br/> clear:<br />both;<br/> visibility: hidden;<br/> }<br/><br /> /* Hides from IE-mac /*/<br/> * html .clearfix {height:<br />1%;}<br/> /* End hide from IE-mac */

因為轉義字
符”/”,Mac IE瀏覽器會忽略掉這段Hack,但Windows IE不會,它會應用 * html .clearfix {height:
1%;} 來達到撐開DIV容器的目的(貌似Mac IE沒有辦法解決這個問題,不過幸好使用者數量是在是太少了,Safari支援就可以了:p)。

測試一下,果然大功告成。

 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.