天天看點

清除浮動(高度塌陷)的方法及原理!為什麼要清除浮動?清除浮動的方法(最常用的4種)

為什麼要清除浮動?

(清除浮動主要是為了解決,父元素因為子級元素浮動引起的内部高度為0的問題)

1.如下,我給父盒子設定一個boder,内部放兩個盒子一個big 一個small,未給big和small設定浮動,則他們會預設撐開父盒子

清除浮動(高度塌陷)的方法及原理!為什麼要清除浮動?清除浮動的方法(最常用的4種)

2.當我給内部兩個盒子加上float屬性的時候

清除浮動(高度塌陷)的方法及原理!為什麼要清除浮動?清除浮動的方法(最常用的4種)

頂部深藍色盒子就會頂上來,然後父盒子因為沒設定高度,變成一條線,big和small已經浮動了

總結一下:

  • 當父元素不給高度的時候,
  • 内部元素不浮動時會撐開
  • 而浮動的時候,父元素變成一條線

這時候很多人會想到建立标簽clear:both和float 方法,但是這兩種方法并不推薦使用!

什麼是clear:both

clear:both:本質就是閉合浮動, 就是讓父盒子閉合出口和入口,不讓子盒子出來

清除浮動的方法(最常用的4種)

1.額外标簽法

(在最後一個浮動标簽後,新加一個标簽,給其設定clear:both;)(不推薦)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .fahter{
            width: 400px;
            border: 1px solid deeppink;
        }
        .big{
            width: 200px;
            height: 200px;
            background: darkorange;
            float: left;
        }
        .small{
            width: 120px;
            height: 120px;
            background: darkmagenta;
            float: left;
        }
        .footer{
            width: 900px;
            height: 100px;
            background: darkslateblue;
        }
        .clear{
            clear:both;
        }
    </style>
</head>
<body>
    <div class="fahter">
        <div class="big">big</div>
        <div class="small">small</div>
        <div class="clear">額外标簽法</div>
    </div>
    <div class="footer"></div>
</body>
</html>
           

此時

清除浮動(高度塌陷)的方法及原理!為什麼要清除浮動?清除浮動的方法(最常用的4種)

如果我們清除了浮動,父元素自動檢測子盒子最高的高度,然後與其同高。

優點:通俗易懂,友善

缺點:添加無意義标簽,語義化差

不建議使用。

2.父級添加overflow屬性

(父元素添加overflow:hidden)(不推薦)

通過觸發BFC方式,實作清除浮動

.fahter{
    width: 400px;
    border: 1px solid deeppink;
    overflow: hidden;
}
           

優點:代碼簡潔

缺點:内容增多的時候容易造成不會自動換行導緻内容被隐藏掉,無法顯示要溢出的元素

不推薦使用

3.使用after僞元素清除浮動(推薦使用)

.clearfix:after{/*僞元素是行内元素 正常浏覽器清除浮動方法*/
    content: " ";/* content中包含的空格也能生效,舊版本Opera浏覽器中有個隐藏的bug,需要添加一個空格字元才能解決 */
    display: block;
    clear:both;
    /* 
    下面兩個屬性取消後,也可以清除浮動。
    我個人了解如下,為了保證after不在界面顯示,是以使用了下方屬性。 
    */
    height: 0;/* 高度為0,隐藏元素 */
    visibility: hidden;/* 元素隐藏,原位置還在 */
}
.clearfix{
    *zoom: 1;/*ie6清除浮動的方式 *号隻有IE6-IE7執行,其他浏覽器不執行*/
}

<body>
    <div class="fahter clearfix">
        <div class="big">big</div>
        <div class="small">small</div>
        <!--<div class="clear">額外标簽法</div>-->
    </div>
    <div class="footer"></div>
</body>
           

優點:符合閉合浮動思想,結構語義化正确

缺點:ie6-7不支援僞元素:after,使用zoom:1觸發hasLayout.

推薦使用

4.使用before和after雙僞元素清除浮動(推薦使用)

/* 提示:當我們不想要外邊距折疊(重疊取最大值)時,這個版本的清除浮動非常有效 */
.clearfix:after,.clearfix:before{
    content: " ";/* content中包含的空格也能生效,舊版本Opera浏覽器中有個隐藏的bug,需要添加一個空格字元才能解決 */
	/* 外邊距無法通過單元格元素折疊 */
    display: table;/* 防止僞元素外邊距折疊 */
}
/* 隻有after僞元素需要清除浮動 */
.clearfix:after{
    clear: both;
}
.clearfix{
    *zoom: 1;
}
<div class="fahter clearfix">
    <div class="big">big</div>
    <div class="small">small</div>
</div>
<div class="footer"></div>
           

優點:代碼更簡潔

缺點:用zoom:1觸發hasLayout.

此文章是轉載于其他部落客,如有侵權,請聯系删除

轉載來源:https://blog.csdn.net/h_qingyi/article/details/81269667

說明:原文部份内容,我做出了删除和添加(參考書籍:深入解析CSS)。