1. 程式人生 > >子div撐不開父div的幾種解決方法

子div撐不開父div的幾種解決方法

如何修正DIV float之後導致的外部容器不能撐開的問題  

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

HTML4STRICT程式碼:

  1. <div style="width:200px;border:1px solid red;">

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

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

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

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

    5. <div

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

  2. </div>

顯示的結果如下:

P_1160709253_0.gif

容器DIV沒有被撐開

大家可以看到,作為外部容器的邊框為紅色的DIV,沒有被撐開。這是因為內部的DIV因為float:left之後,就丟失了clear:both和display:block的樣式,所以外部的DIV不會被撐開。

我們想讓外部容器的DIV隨著內部DIV增多而增加高度,要怎麼解決呢?

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

HTML4STRICT程式碼:

  1. <div style="width:200px;border:1px solid red;">

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

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

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

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

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

    6. <div style="clear:both;"></div>

  2. </div>

顯示的結果如下:

P_1160709321_0.gif

顯示正常了

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

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

首先設定這樣的CSS:

CSS程式碼:

  1. .clearfix:after {

  2. content: ".";

  3. display: block;

  4. height: 0;

  5. clear: both;

  6. visibility: hidden;

  7. }

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

HTML4STRICT程式碼:

<div style="width:200px;border:1px solid red;" class="clearfix">

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

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

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

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

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

</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程式碼:

  1. .clearfix:after {

  2. content: ".";

  3. display: block;

  4. height: 0;

  5. clear: both;

  6. visibility: hidden;

  7. }

  8. /* Hides from IE-mac \*/

  9. * html .clearfix {height: 1%;}

  10. /* End hide from IE-mac */

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

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

P_1160709321_0.gif

====================================================================

法二:

剛入門網站設計佈局的開發者肯定會碰到這樣的問題,那就是當子容器全部浮動的時候,父容器的高度不能自動撐開。在我們沒有為富容器設定邊框或背景的時候是看不到這個問題的,如下的程式碼。

<div style="background: #F99; width: 400px; border: 1px solid #3CF;"> <div style="float: left; background: #36F; width: 180px; height: 180px;">I'm a son container .</div> <div style="float: left; background: #F60; width: 180px; height: 180px;">I'm the other son container .</div> </div>

執行後,大多數的人會覺得很明顯,這就是一個父容器包裹著兩個子容器,但其實沒有那麼簡單,父容器的高度會顯示為0,你能看到的只是父容器的邊框,而高度並沒有被內部的兩個子容器的高度撐開。這個時候如果我們為父容器設定背景將不會被顯示。
解決的方法其實比較簡單,那就是給父容器增加一個屬性,overflow:hidden。
另外一個有效的方法就是在所有的子元素閉合標籤後增加一個

<div style="clear:both;"></div> 

來清除浮動。這也是一個比較好的做法,通常用在父容器需要設定固定高度的時候,但是又怕內容太多由於設定了overflow而不能顯示。這兩種方法都是有效的,大家可以在實踐中測試。


法三:

給父容器增加屬性:display:table,個人常用的方法