天天看點

CSS 之 BFC(塊級格式化上下文)

偶然看到CSS的BFC。還心想,啥是BFC,怎麼一點印象都沒有。

查到MDN資料如下:

看完的感覺就是:還是不懂

後來看下了下面的示例:

示例1 :

<div class="box">
    <div class="float">I am a floated box!</div>
    <p>I am content inside the container.</p>
</div>      
.box {
    background-color: rgb(224, 206, 247);
    border: 5px solid rebeccapurple;
}

.float {
    float: left;
     200px;
    height: 150px;
    background-color: white;
    border:1px solid black;
    padding: 10px;
}      
      

 看完才發現,這個示例說的其實就是高度坍塌(父元素如果不設定高度,高度是預設内部内容撐開的,如果内部所有元素都活動了,那麼父元素就認為内部沒有内容了,是以高度變成0)

 那說了這麼多,高度坍塌如何解決呢?

  (1)給父元素設定高度,問題是很多時候不确定父元素的高度;

  (2)父元素也設定浮動,問題是會讓父元素的兄弟元素也收到影響;

  (3)在最後一個子元素後面加一個空的塊級元素,設定clear:both(可以通過僞類選擇器 ::after{}實作);

  (4)就是MDN給出的解決方法:建立一個會包含這個浮動的BFC,通常的做法是設定父元素

overflow: auto

或者設定其他的非預設的

overflow: visible

的值。

.box {
    background-color: rgb(224, 206, 247);
    border: 5px solid rebeccapurple;
    overflow: auto;
}      

使用

overflow

來建立一個新的BFC,是因為

overflow

屬性告訴浏覽器你想要怎樣處理溢出的内容。當你使用這個屬性隻是為了建立BFC的時候,你可能會發現一些不想要的問題,比如滾動條或者一些剪切的陰影,需要注意。另外,對于後續的開發,可能不是很清楚當時為什麼使用

overflow

。是以你最好添加一些注釋來解釋為什麼這樣做。  

  (5)還是MDN給出的解決方法:一個新的

display

屬性的值,它可以建立無副作用的BFC。在父級塊中使用

display: flow-root

可以建立新的BFC。

.box {
    background-color: rgb(224, 206, 247);
    border: 5px solid rebeccapurple;
    display: flow-root;
}      

<div>

display: flow-root

屬性後,

<div>

中的所有内容都會參與BFC,浮動的内容不會從底部溢出。

示例2:外邊距坍塌

兩個相鄰

<div>

之間的 外邊距合并 問題:

在特殊情況下,為子元素設定上外邊距,會作用到父元素上:

如HTML代碼如下:

<body>
  <div class="parent">
    <div class="child"></div>
  </div>
</body>      

CSS樣式如下:

  *{
      margin: 0;
      padding: 0;
    }
    .parent{
      width:300px;height:300px;
      background-color: turquoise;
    }
    .child{
      width:100px;height:100px;
      background-color: yellow;
      margin-top:30px;
    }      

結果:

 可以看到,隻是為子元素設定了上外邊距,結果作用到了父元素上。

特殊情況包括:

  (1)父元素沒有上邊框;

  (2)子元素的内容區域的上沿與父元素的内容區域的上沿重合;

解決方法:

  (1)給父元素加一個上外邊框。問題是,影響了父元素的實際占地高度;

  (2)給父元素加上内邊距。問題也是影響了父元素的實際占地高度;

  (3)在子元素前添加一個空的table标簽,也可以通過在父元素的僞類選擇器實作(.parent::before{content:'',display:"table"});

下一篇: H5 --拖放