小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

整理高度塌陷與BFC

 新進(jìn)小設(shè)計(jì) 2021-10-25

當(dāng)面試官問(wèn)道你高度塌陷時(shí),人們第一想到的方法一定是

.clearfix::after {
    content: '';
    display: block;
    clear: both;
    visibility: hidden;
    height: 0;
}

 對(duì),沒(méi)錯(cuò),這是一個(gè)完美的解決方案,但是我們有考慮過(guò)這個(gè)方案的實(shí)現(xiàn)原理嗎,或者面試管繼續(xù)問(wèn)你這個(gè)方法的原理是什么?是不是一臉懵,不懵的也別杠,接下來(lái)我通過(guò)排他法來(lái)展示他的原理

 1. 首先 ::after 是元素的偽元素,在元素后面生成偽元素

 2.content 是偽元素的內(nèi)容,為空,只是讓偽元素不顯示,顯然不是原理

 3. height:0 是為了讓偽元素高度為0 ,顯然不是

 4. visibility:hidden 是為了偽元素瀏覽器渲染但不顯示,顯然也不是

 5. display: block 只是為了讓偽元素成為塊級(jí)元素,成為觸發(fā) clear:both 的條件,有點(diǎn)關(guān)系

 6. clear:both 規(guī)定在左右兩側(cè)不允許出現(xiàn)浮動(dòng)元素, 這便是清除浮動(dòng)的原理了

 

那么為什么要清除浮動(dòng),最常見(jiàn)的原因是 外層容器高度塌陷,下面簡(jiǎn)單演示一下

<style>
  .wrap {
    width: 200px;
    border: 1px solid #333;
  }
  .wrap:after {
    content: '偽元素';
  }
  .left {
    float: left;
    background: blue;
    height: 100px;
    width: 100px;
  }
  .right {
    float: left;
    background: red;
    height: 50px;
    width: 100px;
  }
</style>
<body>
  <div class="wrap">
    <div class="left"></div>
    <div class="right"></div>
  </div>
  <div style="background: #000; width: 200px;">ccc</div>
</body>

  

 

 

 這便是高度塌陷的情況,按理解來(lái)說(shuō),黑色的div 應(yīng)該存在于 .weap 下面,這就輪到 clear:both 出場(chǎng)了

<style>
  .wrap {
    width: 200px;
    border: 1px solid #333;
  }
  .wrap:after {
    content: '';
    display: block;
    clear: both;
  }
  .left {
    float: left;
    background: blue;
    height: 100px;
    width: 100px;
  }
  .right {
    float: left;
    background: red;
    height: 50px;
    width: 100px;
  }
</style>
<body>
  <div class="wrap">
    <div class="left"></div>
    <div class="right"></div>
  </div>
  <div style="background: #000; width: 200px;">ccc</div>
</body>

  

 

 

 現(xiàn)在高度塌陷問(wèn)題就解決了

 

接下來(lái)咱們聊聊 BFC, 觸發(fā)BFC 也能解決高度塌陷等問(wèn)題,咱們先來(lái)了解 BFC的概念及其規(guī)則

 1. 概念

  BFC的全稱是 Block Formatting Contexts。

   Formatting Contexts是頁(yè)面中的一塊渲染區(qū)域,它擁有一套渲染規(guī)則,決定其子元素將如何定位,以及和其它元素的關(guān)系      和相互作用。說(shuō)白了就是一個(gè)決定如何渲染元素的容器。

 2. BFC 的渲染規(guī)則

  ①: 內(nèi)部的塊級(jí)元素會(huì)在垂直方向,一個(gè)接一個(gè)地放置

  ②: 塊級(jí)元素垂直方向的距離由margin 決定。屬于同一個(gè)BFC的相鄰元素的margin 會(huì)重疊

   3:  對(duì)于從左往右的格式化,每個(gè)元素(塊級(jí)元素與行內(nèi)元素)的左邊緣,與包含塊的左邊緣相接觸,(對(duì)于從右往左的格式化則相反)。即使包含塊中的元素存在浮動(dòng)也是如此,除非其中元素再生成一個(gè)BFC 

 ?、埽?nbsp;BFC的區(qū)域不會(huì)與浮動(dòng)元素重疊。

  五:BFC是一個(gè)隔離的獨(dú)立容器,容器里面的子元素和外面的元素互不影響

  ⑥: 計(jì)算BFC容器的高度時(shí),浮動(dòng)元素也參與計(jì)算。

 3. 觸發(fā) BFC 條件

根元素
float的值不是none。
position的值不是static或者relative。
display的值是inline-block、inline-flex、flex、flow-root、table-caption、table-cell。
overflow的值不是visible。

 4. BCF 應(yīng)用

    4.1 規(guī)則二

       以上渲染規(guī)則,第一點(diǎn)很好理解,第二點(diǎn)我們用一盒例子來(lái)解釋

<body>
    <div style="width:100px;height:100px;background:red;margin:20px;"></div>
    <div style="width:100px;height:100px;background:blue;margin:20px;"></div>
</body>

  

按樣式代碼來(lái)看,紅塊和藍(lán)塊之間間距應(yīng)該是40px。但實(shí)際上是20px。這就是BFC渲染規(guī)則的第二點(diǎn)。

因?yàn)锽FC的觸發(fā)條件之一就是根元素,所以body就是一個(gè)BFC容器,紅塊和藍(lán)塊是同在body下的相鄰塊級(jí)元素,其margin會(huì)生重疊,所以紅塊和藍(lán)塊之間間距只有20px

我們利用BFC渲染規(guī)則第2點(diǎn)(屬于同一個(gè)BFC的兩個(gè)相鄰塊級(jí)元素的margin會(huì)發(fā)生重疊),那么不屬于同一個(gè)BFC的兩個(gè)相鄰塊級(jí)元素的margin就不會(huì)發(fā)生重疊。

那么我們?cè)诘诙€(gè)div元素用一個(gè)div元素包裹起來(lái),并用overflow:auto觸發(fā)其BFC。再看一下效果是不是不重疊了。

<body>
    <div style="width:100px;height:100px;background:red;margin:20px;"></div>
    <div style="overflow:auto">
        <div style="width:100px;height:100px;background:blue;margin:20px;"></div>
    </div>
</body>

 

     4.2 實(shí)現(xiàn)自適應(yīng)兩欄布局

自適應(yīng)兩欄布局,是一個(gè)主內(nèi)容區(qū)域和一個(gè)側(cè)邊欄區(qū)域組成,兩個(gè)區(qū)域的寬度都可以隨窗口大小自適應(yīng)。有很多種寫(xiě)法可以實(shí)現(xiàn),我們這里使用BFC 實(shí)現(xiàn) 
<style>
    .main{
        background: red;
        height:500px;
    }
    .sider {
        float: left;
        width: 20%;
        height:300px;
        background: blue;
    }
</stley>
<body>
    <div class="sider">我是側(cè)邊欄</div>
    <div class="main">我是主體內(nèi)容</div>
<body>

  

 

 

首先我們根據(jù)規(guī)則1,要先把.sider div寫(xiě)在.main div前面。這個(gè).sider div才會(huì)浮動(dòng)起來(lái)覆蓋在.main div上面。

再根據(jù)規(guī)則4(BFC的區(qū)域不會(huì)與浮動(dòng)元素重疊),給.main加上overflow:auto;觸發(fā).main div生成BFC。

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多