BFC

BFC——格式化上下文。

這到底是個(gè)啥?

首先來(lái)回顧一下css定位機(jī)制。

CSS 有三種基本的定位機(jī)制:普通流、浮動(dòng)和絕對(duì)定位。 BFC屬于普通流。

具有 BFC 特性的元素可以看作是隔離了的獨(dú)立容器,是一個(gè)獨(dú)立的渲染區(qū)域。簡(jiǎn)單來(lái)說就是一個(gè)獨(dú)立的盒子,并且這個(gè)盒子里的布局不受外部影響,也不會(huì)影響到外部元素。

具有BFC特性的容器有以下特點(diǎn):
  1. Box垂直方向的距離由margin決定,屬于同一個(gè)BFC的兩個(gè)相鄰Box的margin會(huì)發(fā)生重疊。
  2. BFC是頁(yè)面一個(gè)獨(dú)立的容器,容器里面的元素不會(huì)影響到外面的元素,反之亦然。
  3. 計(jì)算BFC的高度時(shí),浮動(dòng)元素也會(huì)參與計(jì)算。
  4. BFC內(nèi)部的盒子Box會(huì)在垂直方向,一個(gè)接一個(gè)地放置。
  5. BFC的區(qū)域不會(huì)與浮動(dòng)盒子float box重疊。
哪些情況可以觸發(fā)BFC?
  1. body根元素。
  2. float屬性不為none,也就是left/right。
  3. position為absolute或fixed。
  4. display為inline-block, table-cell, table-caption, flex, inline-flex。
  5. overflow不為visible,也就是auto/hidden。
BFC可以解決什么問題?
  1. 清除浮動(dòng)
    回顧一下我們?yōu)樯兑宄?dòng)?主要是為了避免出現(xiàn)父元素高度塌陷的問題。
    高度塌陷示例:
<html>
    <head>
      <title>test</title>
      <style type="text/css">
        .father {
          border: #000 1px solid;
        }
        .child {
          float: left;
        }
        .child1 {
          background: red;
          width: 200px;
          height: 200px;
        }
        .child2 {
          background: blue;
          width: 200px;
          height: 200px;
        }
      </style>
    </head>
    <body>
      <div class="father">
        <div class="child child1"></div>
        <div class="child child2"></div>
      </div>
    </body>
</html>
屏幕快照 2020-04-12 下午3.23.12.png

我們把父元素的邊框設(shè)置為黑色、1px,但發(fā)現(xiàn)父元素中的子元素沒有被這個(gè)邊框包裹起來(lái),出現(xiàn)了高度坍塌。
解決辦法之一是使用clear:both來(lái)清除浮動(dòng):

<html>
    <head>
      <title>test</title>
      <style type="text/css">
        .father {
          border: #000 1px solid;
        }
        .child {
          float: left;
        }
        .child1 {
          background: red;
          width: 200px;
          height: 200px;
        }
        .child2 {
          background: blue;
          width: 200px;
          height: 200px;
        }
        .clear {
          clear: both;
        }
      </style>
    </head>
    <body>
      <div class="father">
        <div class="child child1"></div>
        <div class="child child2"></div>
        <div class="clear"></div>
      </div>
    </body>
</html>
屏幕快照 2020-04-12 下午3.30.06.png

可以看到,問題解決了。

另一個(gè)方法是把父元素變成BFC容器,給父元素加上overflow:hidden的樣式:

<html>
    <head>
      <title>test</title>
      <style type="text/css">
        .father {
          border: #000 1px solid;
          overflow: hidden;
        }
        .child {
          float: left;
        }
        .child1 {
          background: red;
          width: 200px;
          height: 200px;
        }
        .child2 {
          background: blue;
          width: 200px;
          height: 200px;
        }
      </style>
    </head>
    <body>
      <div class="father">
        <div class="child child1"></div>
        <div class="child child2"></div>
      </div>
    </body>
</html>
屏幕快照 2020-04-12 下午3.32.40.png
  1. 邊距重疊問題
<html>
  <head>
    <title>test</title>
    <style type="text/css">
      .box1 {
        background: blue;
        width: 200px;
        height: 200px;
        margin: 20px;
      }
      .box2 {
        background: red;
        width: 200px;
        height: 200px;
        margin: 20px;
      }
    </style>
  </head>
  <body>
    <div class="box1"></div>
    <div class="box2"></div>
  </body>
</html>

問:box1和box2的間隔有多寬?20+20=40(px)?,錯(cuò)了,因?yàn)榘l(fā)生了邊距重疊,所以兩者之間的間隔只有20px。


屏幕快照 2020-04-12 下午3.37.12.png

出現(xiàn)問題的原因是:box1和box2同屬于BFC容器body,屬于同一個(gè)BFC的兩個(gè)相鄰Box的margin會(huì)發(fā)生重疊。

那么解決方法顯而易見:把它們放在不同的BFC里面就ok了。

<html>
    <head>
      <title>test</title>
      <style type="text/css">
        .bfc {
          overflow: hidden;
        }
        .box1 {
          background: blue;
          width: 200px;
          height: 200px;
          margin: 20px;
        }
        .box2 {
          background: red;
          width: 200px;
          height: 200px;
          margin: 20px;
        }
      </style>
    </head>
    <body>
      <div class="bfc">
        <div class="box1"></div>
      </div>
      <div class="bfc">
        <div class="box2"></div>
      </div>
    </body>
</html>
屏幕快照 2020-04-12 下午3.49.47.png
  1. 防止被浮動(dòng)元素覆蓋
<html>
    <head>
      <title>test</title>
      <style type="text/css">
        .box2 {
          background: red;
          width: 100px;
          height: 100px;
          float: left;
        }
        .box1 {
          background: blue;
          width: 200px;
          height: 200px;
        }
      </style>
    </head>
    <body>
      <div class="box2"></div>
      <div class="box1"></div>
    </body>
</html>
屏幕快照 2020-04-12 下午4.22.09.png

box1被浮動(dòng)元素box2蓋住了。

把box1改為BFC試試:

<html>
    <head>
      <title>test</title>
      <style type="text/css">
        .box2 {
          background: red;
          width: 100px;
          height: 100px;
          float: left;
        }
        .box1 {
          background: blue;
          width: 200px;
          height: 200px;
          overflow: hidden;
        }
      </style>
    </head>
    <body>
      <div class="box2"></div>
      <div class="box1"></div>
    </body>
</html>
屏幕快照 2020-04-12 下午4.24.25.png

現(xiàn)在兩者是并列的,box1不會(huì)被覆蓋。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容