1. 程式人生 > >深入理解盒子模型——CSS之BFC詳解

深入理解盒子模型——CSS之BFC詳解

  首先我們看看w3c對BFC是怎麼定義的:
  Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with ‘overflow’ other than ‘visible’ (except when that value has been propagated to the viewport) establish new block formatting contexts for their contents.
  In a block formatting context, boxes are laid out one after the other, vertically, beginning at the top of a containing block. The vertical distance between two sibling boxes is determined by the ‘margin’ properties. Vertical margins between adjacent block-level boxes in a block formatting context collapse.
  In a block formatting context, each box’s left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats (although a box’s line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats).

  浮動元素和絕對定位元素,非塊級盒子的塊級容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不為“visiable”的塊級盒子,都會為他們的內容建立新的塊級格式化上下文。
  在一個塊級格式化上下文裡,盒子從包含塊的頂端開始垂直地一個接一個地排列,兩個盒子之間的垂直的間隙是由他們的margin 值所決定的。兩個相鄰的塊級盒子的垂直外邊距會發生疊加。
在塊級格式化上下文中,每一個盒子的左外邊緣(margin-left)會觸碰到容器的左邊緣(border-left)(對於從右到左的格式來說,則觸碰到右邊緣),即使存在浮動也是如此,除非這個盒子建立一個新的塊級格式化上下文。
  從上面我們還可找出幾個幾個比較重要的概念東西,比如:boxe , block formatting context。毫無疑問BFC就是block formatting context的縮寫,中文就是“塊級格式化上下文”的意思。我們在那個w3c那個頁面發現還有其他inline formatting context,所以我們可以看看 formatting context是個什麼東西:
Formatting context是W3C CSS2.1規範中的一個概念。它是頁面中的一塊渲染區域,並且有一套渲染規則,它決定了其子元素將如何定位,以及和其他元素的關係和相互作用。
  最常見的Formatting context有Block fomatting context(簡稱BFC)和Inline formatting context(簡稱IFC)。CSS2.1 中只有BFC和IFC, CSS3中還增加了GFC和FFC.
  至於那個box還要講嗎?嗯,還是回顧一下:
  Box是CSS佈局的物件和基本單位, 直觀點來說,就是一個頁面是由很多個Box(即boxes)組成的。元素的型別和display屬性,決定了這個Box的型別。 不同型別的Box, 會參與不同的Formatting context(一個決定如何渲染文件的容器),因此Box內的元素會以不同的方式渲染。常見的盒子型別block-level box: display屬性為block, list-item, table的元素,會生成block-level box。並且參與block fomatting context。 inline-level box: display屬性為inline, inline-block, inline-table的元素,會生成inline-level box。並且參與inline formatting context。
  這裡我們也通俗的理解一下:
  BFC就是“塊級格式化上下文”的意思,建立了 BFC的元素就是一個獨立的盒子,不過只有Block-level box可以參與建立BFC, 它規定了內部的Block-level Box如何佈局,並且與這個獨立盒子裡的佈局不受外部影響,當然它也不會影響到外面的元素。


  

BFC有一下特性:


  1. 內部的Box會在垂直方向,從頂部開始一個接一個地放置。
  2. Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生疊加
  3. 每個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,否則相反)。即使存在浮動也是如此。
  4. BFC的區域不會與float box疊加。
  5. BFC就是頁面上的一個隔離的獨立容器,容器裡面的子元素不會影響到外面的元素,反之亦然。
  6. 計算BFC的高度時,浮動元素也參與計算。
  到最後我就是考慮How了,不用說你也知道了,就是怎麼解決這些問題,這些知識點該怎麼用,還有沒有其他的方法..
  

那麼我們該怎麼使用BFC呢,如何觸發BFC呢?:


  1. float 除了none以外的值
  2. overflow 除了visible 以外的值(hidden,auto,scroll )
  3. display (table-cell,table-caption,inline-block, flex, inline-flex)
  4. position值為(absolute,fixed)
  5. fieldset元素
  在以上的情況裡可以建立BFC。
  

接下我們看下怎麼運用BFC,在哪些場景可以用到BFC.


  

1.解決margin疊加問題


  三P每個p之間的距離為50px,發生了外邊距疊加。 要解決這個疊加問題即讓每個P之間是100px,我們可以新建一個BFC,怎麼建呢?可以給p元素新增一個父元素,讓它觸發BFC。如下:
  

2.用於佈局


  從圖中我們會發現上面BFC的第三個特性,就是元素的左外邊距會觸碰到包含塊容器的做外邊框,就算存在浮動也會如此。那麼我們如何解決這個問題呢?看上面BFC第四個特性,就是BFC不會與浮動盒子疊加,那麼我們是不是可以建立一個新的BFC來解決這個問題呢?來看看: 發現我們用overflow:hidden觸發main元素的BFC之後,效果立馬出現了,一個兩欄佈局就這麼妥妥的搞掂…
  

3.用於清除浮動,計算BFC高度.


  因為上面第六個特性提到計算BFC高度時,浮動元素也會參與計算,我們先看一個例子: 我們發現由於裡面兩個子元素浮動的關係,兩個box已經脫離了父元素的包含塊,父元素高度已經塌陷,我們需要讓父元素包含兩個box子元素,這樣計算高度時,兩個浮動子元素就會參與,所以我們要閉合浮動,觸發父元素的BFC,我們還是繼續用overflow:hidden來看看效果吧:
  怎麼樣,效果還很明顯的嗎,當然清理(閉合)浮動還有很多方法,大家可以看看一絲大神寫的那些年我們一起清除過的浮動。 好了寫到這裡基本才不多了,BFC是個很奇怪的東西,她一直隱式的存在我們的css樣式裡,但是我們要記住BFC是頁面元素裡一個獨立存在作用塊,它不影響它外面的佈局,外面的元素也不會影響到BFC裡面的佈局。

相關推薦

深入理解盒子模型——CSSBFC

  首先我們看看w3c對BFC是怎麼定義的:   Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-c

CSSBFC

在瞭解BFC前,首先需要知道它是什麼,它有哪些特性,它是如何形成的。 一、什麼是BFC BFC(Block Formatting Context)塊級格式化上下文,是Web頁面中盒模型佈局的CSS渲染模式,指一個獨立的渲染區域或者說是一個隔離的獨立容器。 二、B

深入理解CSSBFC

什麼是BFC? 塊級格式化上下文(Block formatting context)是CSS對於一個頁面進行視覺化渲染時產生的區域,在這個區域中會產生被渲染的盒子模型、以及相互影響的浮動元素。 簡單來說,就是BFC就是一種屬性,影響著元素的定位,以及兄弟元素之間的相互影響。

CSSPosition

CSS的很多其他屬性大多容易理解,比如字型,文字,背景等。有些CSS書籍也會對這些簡單的屬性進行大張旗鼓的介紹,而偏偏忽略了對一些難纏的屬性講解,有避重就輕的嫌疑。CSS中主要難以理解的屬性包括盒型結構,以及定位。正如positioniseverything,本文將主要講述

深入理解CSS3 Animation 幀動畫(step)

CSS3我在5年之前就有用了,包括公司專案都一直在很前沿的技術。 最近在寫慕課網的七夕主題,用了大量的CSS3動畫,但是真的沉澱下來仔細的去深入CSS3動畫的各個屬性發現還是很深的,這裡就寫下關於幀動畫steps屬性的理解 我們知道CSS3的Animation有八個屬性 animation-nameanim

CSS基礎學習——理解盒子模型

初瞭解 CSS盒子模型,一個神祕的方形組織。 MDN中的定義:W3C盒模型是 CSS 規範的一個模組,它定義了一個長方形的盒子,每個盒子擁有各自的內邊距和外邊距,並根據視覺格式化模型來對元素進行佈局。 自己的話來解釋一番:盒子模型是相對於塊狀元素和行內可替換元素而言的,當我們編輯好h

html 盒子模型基礎(高度塌陷問題,BFC)(六)

1.高度塌陷問題解決: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css

深入理解AndroidXposed

一、背景Xposed,大名鼎鼎得Xposed,是Android平臺上最負盛名的一個框架。在這個框架下,我們可以載入很多外掛App,這些外掛App可以直接或間接操縱系統層面的東西,比如操縱一些本來只對系統廠商才open的功能(實際上是因為Android系統很多API是不公開的,

深入理解Tomcat系列URL請求

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

深入理解Spark》運算元

 XML Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

CSS基礎學習十六:CSS盒子模型補充border-radius屬性

       CSS盒子模型有很多的內容和屬性,CSS也一直在更新和新增屬性,今天我們來說說CSS3新增的盒子模型中的 邊框中的內容,也就是border-radius屬性。        border

06深入理解C指針---指針類型和長度

特征 都是 負數 意義 參數類型 同時 print 相關 通過   該系列文章源於《深入理解C指針》的閱讀與理解,由於本人的見識和知識的欠缺可能有誤,還望大家批評指教。   如果考慮到程序的可移植性和跨平臺性時,指針長度就是一個問題,需要慎重處理。一般情況下,數據指針的長度

深入理解 Java 虛擬機學習筆記(1)

over 信息 hotspot 體系 ima 模塊化 介紹 style 創建 本書結構: 從宏觀的角度介紹了整個Java技術體系、Java和JVM的發展歷程、模塊化,以及JDK的編譯 講解了JVM的自動內存管理,包括虛擬機內存區域的劃分原理以及各種內存溢出異常產

深入理解JAVA虛擬機JVM性能篇---基礎知識點

默認 生命周期 ima 線程 images 對象 情況 -- 是否 一、堆與棧   堆和棧是程序運行的關鍵,其間的關系有必要理清楚,兩者如下圖所示:      1. 堆:   所有線程共享,堆中只負責存儲對象信息。   2. 棧:   在Java中每個線程都會有一個相應的線

深入理解JAVA虛擬機JVM性能篇---垃圾回收

小數據 alt tro 調優 permsize 多次 快速 com src 一、基本垃圾回收算法 1. 按基本回收策略分   1) 引用計數(Reference Counting)     對象增加一個引用,即增加一個計數,刪除一個引用則減少一個計數。垃圾回收時,只用收集計

CSS BFC

css 之 bfcBFC 的概念: BFC 直譯為“塊級格式化上下文”,它是一個獨立的渲染區域,只有 Block-level-box 參與,它規定了獨立的渲染區域內 Block-level-box 是如何布局的,並且這個獨立區域與外部區域互不影響。以下元素會觸發 BFC:

彈性盒子模型屬性flex-grow

web前端 怎樣 分配 span -name 是不是 彈性 num code 在學習彈性盒子模型的時候,有幾個屬性常常讓同學們感覺頭痛, 不知到最後得到的效果數值到底是怎樣計算得來的,那麽不要慌,穩住,我們能贏 !!!今天就讓我們先來看看flex-grow這個屬性 flex

彈性盒子模型屬性flex-shrink

用法 img 求和 htm blog .com es2017 常常 邊框 上一次,我們已經了解過flex-grow的具體用法後,這周,讓我們一起來見一下flex-basis這個屬性. flex-shrink 定義項目的縮小比例,默認值為1,註意前提是空間不足的

理解盒子模型

inline pad 理解 影響 組成 mar idt 繼承 none 一、組成:一個盒子包括了content(實際內容)、border(邊框)、padding(內邊距)和margin(外邊距)。二、兩種盒子模型:IE盒模型: width=content+paddin

CSS預處理器Less

如果能 order 不同 例如 什麽 諸多 選擇 程序 無需 本文最初發表於博客園,並在GitHub上持續更新前端的系列文章。歡迎在GitHub上關註我,一起入門和進階前端。 以下是正文。 CSS 預處理器 為什麽要有 CSS 預處理器 CSS基本上是設計師的工具,