父元素高度塌陷的解決辦法


很多時候子元素的浮動,會造成父元素高度塌陷

解決方法:

1.給父元素末尾添加一個空元素,並設置成清除浮動,即:

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

優點:通俗易懂,易於掌握

缺點:添加了無意義標簽,不易於后期維護,違背了結構和表現分離的標准

 

2.給父元素添加 overflow:auto;

 

3.讓父元素也浮動

缺點:影響整體頁面布局,若父元素也有父元素呢?總不能一直浮動到body吧?

 

4.使用after偽元素

給父元素添加一個類,來添加一個看不見的塊元素,以實現清除浮動。

.clearfix:after
{
content:".";
dispaly:block;
height:0;
clear:both;
visibility:hidden;
}

 優點:這個方法和第一種方法有點類似,但實際沒有在頁面上添加無意義標簽,是頁面結構更完整。

5.最優解

首先我們說一個CSS的概念——BFC塊級格式上下文,簡單來說就是只要樣式或方法觸發了BFC就可以防止高度塌陷.

以下就是可以觸發BFC的部分樣式

flaot: left | right;
overflow: auto | hidden | scorll;
dispaly: table-cell | table-caption | inline-block;
position: fixed | absolute;

前面幾個方法也是借助了這個原理,但都有些缺陷。下面我們來介紹一個比較優雅的方法來實現。

.clearfix:after,
.clearfix:before
{
content: " ";
display:table;
}
.clearfix:after
{
clear:both;
}

table屬性可以創建一個匿名的表格單元,也會觸發BFC。

加入before對於清除浮動沒有影響,主要是為了解決瀏覽器頂部空白崩潰的問題。

 

例如:現有上下兩個盒子,上盒子設置了margin-bottom:10px,下盒子設置了margin-top:10px。

按理說兩個盒子的上下距離應該是20px,但實際上只有10px,兩個盒子的外邊距會發生一個疊加。

觸發BFC即可解決這一問題。

 

 

  ----------------------------------------分割線(2017-9-21 更新)-------------------------------------

    W3C是這樣定義BFC的:

  http://www.w3.org/TR/CSS2/visuren.html#block-formatting

  

浮動元素和絕對定位元素,非塊級盒子的塊級容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不為“visiable”的塊級盒子,都會為他們的內容創建新的塊級格式化上下文。

在一個塊級格式化上下文里,盒子從包含塊的頂端開始垂直地一個接一個地排列,兩個盒子之間的垂直的間隙是由他們的margin 值所決定的。兩個相鄰的塊級盒子的垂直外邊距會發生疊加。

在塊級格式化上下文中,每一個盒子的左外邊緣(margin-left)會觸碰到容器的左邊緣(border-left)(對於從右到左的格式來說,則觸碰到右邊緣),即使存在浮動也是如此,除非這個盒子創建一個新的塊級格式化上下文。(谷歌翻譯)  

 

BFC有一下特性:

  1. 內部的Box會在垂直方向,從頂部開始一個接一個地放置。
  2. Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生疊加
  3. 每個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,否則相反)。即使存在浮動也是如此。
  4. BFC的區域不會與float box疊加。
  5. BFC就是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素,反之亦然。
  6. 計算BFC的高度時,浮動元素也參與計算。

-----------------------------------------------------------------------------------------------------------------------------

 

 

 

  現在我們只需在每個浮動的元素添加一個 clearfix類就可以解決高度塌陷的問題 是不是很簡單呢?

  以上是筆者的一些見解,有不當之處,歡迎指正~


免責聲明!

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



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