整理高度塌陷與BFC

来源:https://www.cnblogs.com/SuperBrother/archive/2020/05/06/12836340.html
-Advertisement-
Play Games

當面試官問道你高度塌陷時,人們第一想到的方法一定是 .clearfix::after { content: ''; display: block; clear: both; visibility: hidden; height: 0; } 對,沒錯,這是一個完美的解決方案,但是我們有考慮過這個方案的 ...


當面試官問道你高度塌陷時,人們第一想到的方法一定是

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

 對,沒錯,這是一個完美的解決方案,但是我們有考慮過這個方案的實現原理嗎,或者面試管繼續問你這個方法的原理是什麼?是不是一臉懵,不懵的也別杠,接下來我通過排他法來展示他的原理

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

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

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

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

 5. display: block 只是為了讓偽元素成為塊級元素,成為觸發 clear:both 的條件,有點關係

 6. clear:both 規定在左右兩側不允許出現浮動元素, 這便是清除浮動的原理了

 

那麼為什麼要清除浮動,最常見的原因是 外層容器高度塌陷,下麵簡單演示一下

<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>

  

 

 

 這便是高度塌陷的情況,按理解來說,黑色的div 應該存在於 .weap 下麵,這就輪到 clear:both 出場了

<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>

  

 

 

 現在高度塌陷問題就解決了

 

接下來咱們聊聊 BFC, 觸發BFC 也能解決高度塌陷等問題,咱們先來瞭解 BFC的概念及其規則

 1. 概念

  BFC的全稱是 Block Formatting Contexts。

   Formatting Contexts是頁面中的一塊渲染區域,它擁有一套渲染規則,決定其子元素將如何定位,以及和其它元素的關係      和相互作用。說白了就是一個決定如何渲染元素的容器。

 2. BFC 的渲染規則

  ①: 內部的塊級元素會在垂直方向,一個接一個地放置

  ②: 塊級元素垂直方向的距離由margin 決定。屬於同一個BFC的相鄰元素的margin 會重疊

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

  ④: BFC的區域不會與浮動元素重疊。

  五:BFC是一個隔離的獨立容器,容器裡面的子元素和外面的元素互不影響

  ⑥: 計算BFC容器的高度時,浮動元素也參與計算。

 3. 觸發 BFC 條件

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

 4. BCF 應用

    4.1 規則二

       以上渲染規則,第一點很好理解,第二點我們用一盒例子來解釋

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

  

按樣式代碼來看,紅塊和藍塊之間間距應該是40px。但實際上是20px。這就是BFC渲染規則的第二點。

因為BFC的觸發條件之一就是根元素,所以body就是一個BFC容器,紅塊和藍塊是同在body下的相鄰塊級元素,其margin會生重疊,所以紅塊和藍塊之間間距只有20px

我們利用BFC渲染規則第2點(屬於同一個BFC的兩個相鄰塊級元素的margin會發生重疊),那麼不屬於同一個BFC的兩個相鄰塊級元素的margin就不會發生重疊。

那麼我們在第二個div元素用一個div元素包裹起來,並用overflow:auto觸發其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 實現自適應兩欄佈局

自適應兩欄佈局,是一個主內容區域和一個側邊欄區域組成,兩個區域的寬度都可以隨視窗大小自適應。有很多種寫法可以實現,我們這裡使用BFC 實現 
<style>
    .main{
        background: red;
        height:500px;
    }
    .sider {
        float: left;
        width: 20%;
        height:300px;
        background: blue;
    }
</stley>
<body>
    <div class="sider">我是側邊欄</div>
    <div class="main">我是主體內容</div>
<body>

  

 

 

首先我們根據規則1,要先把.sider div寫在.main div前面。這個.sider div才會浮動起來覆蓋在.main div上面。

再根據規則4(BFC的區域不會與浮動元素重疊),給.main加上overflow:auto;觸發.main div生成BFC。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 新聞 1. "Pixel 4a渲染圖曝光:或能成新款iPhone SE有力競爭者" 1. "Google Play商店為預註冊的游戲和應用提供自動安裝功能" 1. "Android最強單攝Pixel 4a樣張曝光:1200萬像素輕鬆擊敗4800萬" 1. "Kotlin Vocabulary | 枚 ...
  • 插件 1. "MediumClapFlutter" A Custom Floating Action Button (FAB) library like clapping effect on Medium 1. "flutter alipay" A flutter plugin to use ali ...
  • 寫在前面 書籍介紹:本書主要講解瞭如何運用HTML5和CSS3來進行響應式Web設計,使頁面的設計與開髮根據用戶行為以及設備環境(系統平臺、屏幕尺寸、屏幕定向等)來進行相應的響應和調整。 我的簡評:響應式Web設計,個人從業經驗上覺得應該是一個很龐大的話題,也是一個實用性很強的方面。作者在本書中講的 ...
  • 介紹 棧(stack) 棧stack為自動分配的記憶體空間,它由系統自動釋放 堆(heap) 堆heap是動態分配的記憶體,大小不定也不會自動釋放 動態演示地址 http://latentflip.com/loupe 數據類型 基本類型:String、Number、Boolean、Null、Undefi ...
  • 介紹 Composition API的主要思想是,我們將它們定義為從新的 setup 函數返回的JavaScript變數,而不是將組件的功能(例如state、method、computed等)定義為對象屬性。 案例對比 下麵是一個經典的vue2的計數器案例. //Counter.vue export ...
  • 塊級元素 行內元素 塊級元素和行內元素的區別 行內塊標簽 inline block 標簽顯示模式轉換 display ...
  • 我是前端小白一枚,為了鞏固知識和增強記憶,開始整理相關的知識,方便以後複習和麵試的時候看看。OK,讓我們進入正題~ 先說說淺拷貝和深拷貝的理解吧,個人是這樣理解的:兩個對象A、B, A有數據B為空,B複製了A,我們修改A,如果B中的數據跟著變化了,那就是淺拷貝,如果沒有變化,那就是深拷貝。說明B另開 ...
  • 操作DOM 由於HTML文檔被瀏覽器解析後就是一棵DOM樹,要改變HTML的結構,就需要通過JavaScript來操作DOM。 始終記住DOM是一個樹形結構。操作一個DOM節點實際上就是這麼幾個操作: 更新:更新該DOM節點的內容,相當於更新了該DOM節點表示的HTML的內容; 遍歷:遍歷該DOM節 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...