div之float,clear特性

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

HTML4STRICT代碼:
  1. <div style="width:200px;border:1px solid red;">
  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="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  7. </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;">
  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="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  7.     <div style="clear:both;"></div>
  8. </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,它會被強制換一行顯示。所以,我一直在尋找更好的解決辦法。

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

首先設置這樣的CSS:
CSS代碼:
  1. .clearfix:after {
  2.     content: ".";
  3.     display: block;
  4.     height: 0;
  5.     clear: both;
  6.     visibility: hidden;
  7. }


然後,我們再修改原來的HTML代碼,讓外部的容器DIV來使用這個CSS:
HTML4STRICT代碼:
  1. <div style="width:200px;border:1px solid red;" class="clearfix">
  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="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  7. </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. * html .clearfix {height: 1%;}



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

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

P_1160709321_0.gif
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章