CSS中的浮動、高度塌陷以及清除浮動


一、CSS浮動

    浮動(float)的框可以左右移動,直至它的外邊緣碰到包含框或另一個浮動框的外邊緣。浮動框不屬於文檔中的普通流,當一個元素浮動之后,不會影響到塊級元素的布局而只會影響內聯元素(通常是文本)的排列,文檔中的普通流就表現得如同浮動框不存在一樣。當浮動框高度超出包含框的時候,就會出現包含框不會自動升高來閉合浮動元素(“高度塌陷”現象)。

<!DOCTYPE html>
<html>
<head>
   <style type="text/css">
   * {
           margin:0;
           padding:0;
   }
       .container {
           width:300px;
           height:156px;
           border:1px solid blue;
           margin:100px;
       }
       .block1 {
           width:50px;
           height:50px;
           border:1px solid red;
       }
       .block2 {
           width:50px;
           height:50px;
           border:1px solid red;
       }
       .block3 {
           width:50px;
           height:50px;
           border:1px solid red;
       }
   </style>
</head>
<body>
    <div class="container">
        <div class="block1"><span>塊1</span></div>
        <div class="block2"><span>塊2</span></div>
        <div class="block3"><span>塊3</span></div>
    </div>
</body>
</html

以上代碼是三塊div均未加float時在瀏覽器顯示效果如下圖。塊元素各自獨占一行。

    以下是塊1向右浮動,開始脫離文檔普通流向右移動,知道塊1的右邊緣碰到包含它的塊(父塊)的右邊緣。由於我們給包含塊設置了padding,所以塊1與父塊之間有該內邊距。可知,所謂邊緣相碰,應該是包含了內邊距在內的。

    因為浮動塊不在文檔的普通流中,所以文檔的普通流中的塊框就表現得像浮動塊不存在一樣排列(浮動不影響塊級元素排列)。所以塊2、塊3就按照沒有塊1存在那樣排列。

    以下是塊1向左移動。在代碼中我將塊三width變寬,塊3文字靠右。可以發現,當塊1向左浮動時,它脫離文檔流並且向左移動,知道它的左邊緣碰到父塊的左邊緣。因為它不再處於文檔流中,所以它不占據空間,而因為又不影響塊框的排列,所以實際上塊1覆蓋住了塊2,使塊2從視圖中消失。但是據圖可知,塊2的內容卻顯示在塊1未浮動時塊2所處的位置了。所以:浮動元素不影響塊框元級元素布局,但是可以影響內聯元素(主要是文本)布局。所以可以使用浮動來達到文字環繞圖片的效果。

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4    <style type="text/css">
 5    * {
 6            margin:0;
 7            padding:0;
 8    }
 9        .container {
10            width:300px;
11            height:156px;
12            border:1px solid blue;
13            margin:100px;
14            padding-right:5px;
15        }
16        .block1 {
17            width:50px;
18            height:50px;
19            border:1px solid red;
20            float:left;
21        }
22        .block2 {
23            width:50px;
24            height:50px;
25            border:1px solid red;
26        }
27        .block3 {
28            width:100px;
29            height:50px;
30            border:1px solid red;
31            text-align: right;
32        }
33        
34    </style>
35 </head>
36 <body>
37     <div class="container">
38         <div class="block1"><span>塊1</span></div>
39         <div class="block2"><span>塊2</span></div>
40         <div class="block3"><span>塊3</span></div>
41     </div>
42 </body>
43 </html>
浮動不影響塊框元素

 

如果把三個框都向左浮動,那么塊1向左浮動直到碰到包含框,另外兩個框向左浮動直到碰到前一個浮動框。

如果包含框太窄,無法容納水平排列的三個浮動框,那么其他浮動框向下移動,直到有足夠的空間。

如果浮動元素的高度不同,那么當它們向下移動時可能被其他元素"卡住"。

二、浮動“”塌陷“”:

    如果父元素只包含浮動元素,且父元素未設置高度和寬度的時候,那么它的高度就會踏縮為零。這是因為浮動元素脫離了文檔流,包圍它們的父塊中沒有內容了,所以“”塌陷“”了。

    解決“塌陷”有以下幾種方法:

方法一、使用帶clear屬性的空元素

    在父塊中、浮動元素后使用一個空元素,如<div class="clear"></div>,並在css中賦予 .clear{clear:both}屬性即可清除浮動。也可使用<br class="clear"/>或<hr class="clear"/>來進行清除。

    給空元素設置clear后,因為它的左右兩邊不能有任何浮動元素,所以空元素下移到浮動元素下方。而空元素又包含在父塊中,相當於把父塊撐開了,視覺上起到了父塊包含浮動元素的效果。

    優點:簡單,代碼少,瀏覽器兼容性好。

    缺點:需要添加大量無語義的html元素,代碼不夠優雅,后期不容易維護。不推薦使用。

方法二:使用CSS的overflow屬性

    給浮動元素的容器添加overflow:hidden;或overflow:aoto;可以使浮動元素回到容器層內,清除浮動。

方法三:給浮動元素的容器添加浮動

    給浮動元素的容器(父元素)也添加上浮動屬性即可清除浮動,但是這樣會使下一個元素收到這個浮動元素的影響,影響整體布局,不推薦使用。

方法四:使用CSS的:after偽元素

    :after偽元素(注意這不是偽類,而是偽元素,代表一個元素之后最近的元素)。

    給浮動元素的容器添加一個clearfix的class,然后給這個class添加一個:after偽元素實現元素末尾添加一個看不見的塊元素清理浮動。

<!DOCTYPE html>
<html>
<head>
   <style type="text/css">
   * {
           margin:0;
           padding:0;
   }
       .container {
           
           border:1px solid blue;
           margin:100px;
           padding-right:5px;
       }
       .block1 {
           width:50px;
           height:50px;
           border:1px solid red;
           float:left;
       }
       .block2 {
           width:50px;
           height:50px;
           border:1px solid red;
           float:left;
       }
       .block3 {
           width:50px;
           height:50px;
           border:1px solid red;
           text-align: right;
           float:left;
       }
    .clearfix:after{
        content:".";
        display:block;
        height:0;
        clear:left;
        visibility:hidden;
    }
   </style>
</head>
<body>
    <div class="container clearfix">
        <div class="block1"><span>塊1</span></div>
        <div class="block2"><span>塊2</span></div>
        <div class="block3"><span>塊3</span></div>
    </div>
    
</body>
</html>

    通過CSS偽元素在容器內部元素最后添加了一個看不見的點“.”,並且賦予clear屬性來清除浮動。 

 

    參考文章列表:

  1. CSS浮動
  2. CSS技巧(一):清除浮動
  3. 浮動布局float帶來的高度塌陷——清除浮動


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM