輕談BFC

BFC 定義

CSS2.1的定義 Block formatting contexts
9.4.1 Block formatting contexts
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).

用google 翻譯
浮動,絕對定位的元素,塊容器(如嵌入塊,表格單元格和表格標題)不是塊框,以及“溢出”而不是“可見”的塊框(除了已經傳播的值到視口)為其內容建立新的塊格式上下文。

在塊格式上下文中,框從一個包含塊的頂部開始,一個接一個地垂直排列。兩個兄弟框之間的垂直距離由“邊距”屬性決定。塊格式化上下文中相鄰塊級別框之間的垂直邊距折疊。

在塊格式化上下文中,每個框的左外邊緣都與包含塊的左邊緣接觸(用于從右到左格式化,右邊緣接觸)。即使在有浮動的情況下也是如此(雖然箱子的線框可能因為浮動而縮小),除非箱子建立了新的塊格式上下文(在這種情況下,箱子本身可能由于浮動而變窄)。

從上面的話我們可以得出幾點BFC的產生條件,特性。
BFC本身就可以理解為一個具有特性的塊級格式化上下文。除了BFC,IFC, CSS3 中還增加了 GFC 和 FFC.

BFC可以包含浮動元素這個特性,可以用來清除浮動,當然可能導致容器長度縮短。當然目前解決浮動的最好方法應該是after的方式。
IE6、7內有個hasLayout的概念,當元素的hasLayout屬性值為true的時候會達到和BFC類似的效果。

產生條件 OFDP(overflow,float,display, position)

  1. overflow, 除了 visible 以外的值(hidden,auto,scroll)
  2. floadt,浮動元素,float 除 none 以外的值
  3. display,為以下其中之一的值 inline-blocks,table-cells,table-captions, flex, 或者 inline-flex(display:table可以生成BFC,原因在于Table會默認生成一個匿名的table-cell,這個table-cell生成了BFC)
  4. position,絕對定位元素,position(absolute,fixed)

BFC特性

  1. 在塊格式上下文中,框從一個包含塊的頂部開始,一個接一個地垂直排列
  2. 塊格式化上下文中相鄰塊級別框之間的垂直邊距折疊
  3. 在塊格式化上下文中,每個框的左外邊緣都與包含塊的左邊緣接觸(用于從右到左格式化,右邊緣接觸)。即使在有浮動的情況下也是如此(雖然箱子的線框可能因為浮動而縮小),除非箱子建立了新的塊格式上下文(在這種情況下,箱子本身可能由于浮動而變窄)。
    其他抄過來的特性
  4. BFC的區域不會與float box重疊。實用場景是文字環繞。結合第三條,調整文字和圖片的距離,應該設置圖片的margin更合適
  5. BFC就是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。反之也如此。解決margin折疊
  6. 計算BFC的高度時,浮動元素也參與計算。 這個用來解決浮動導致的高度塌陷問題。

collapsing-margins(邊距折疊)

www.w3.org里面有介紹的collapsing-margins
我這接直接借用別人的翻譯
折疊的結果:

  • 兩個相鄰的外邊距都是正數時,折疊結果是它們兩者之間較大的值。
  • 兩個相鄰的外邊距都是負數時,折疊結果是兩者絕對值的較大值。
  • 兩個外邊距一正一負時,折疊結果是兩者的相加的和。

產生折疊的必備條件:margin必須是鄰接的!
而根據w3c規范,兩個margin是鄰接的必須滿足以下條件:

  • 必須是處于常規文檔流(非float和絕對定位)的塊級盒子,并且處于同一個BFC當中。
  • 沒有線盒,沒有空隙(clearance,下面會講到),沒有padding和border將他們分隔開
  • 都屬于垂直方向上相鄰的外邊距,可以是下面任意一種情況
  • 元素的margin-top與其第一個常規文檔流的子元素的margin-top
  • 元素的margin-bottom與其下一個常規文檔流的兄弟元素的margin-top
    height為auto的元素的margin-bottom與其最后一個常規文檔流的子元素的margin-bottom
    高度為0并且最小高度也為0,不包含常規文檔流的子元素,并且自身沒有建立新的BFC的元素的margin-top和margin-bottom

以上的條件意味著下列的規則:

  • 創建了新的BFC的元素(例如浮動元素或者'overflow'值為'visible'以外的元素)與它的子元素的外邊距不會折疊
  • 浮動元素不與任何元素的外邊距產生折疊(包括其父元素和子元素)
  • 絕對定位元素不與任何元素的外邊距產生折疊
  • inline-block元素不與任何元素的外邊距產生折疊
  • 一個常規文檔流元素的margin-bottom與它下一個常規文檔流的兄弟元素的margin-top會產生折疊,除非它們之間存在間隙(clearance)。
  • 一個常規文檔流元素的margin-top 與其第一個常規文檔流的子元素的margin-top產生折疊,條件為父元素不包含 padding 和 border ,子元素不包含 clearance。
  • 一個 'height' 為 'auto' 并且 'min-height' 為 '0'的常規文檔流元素的 margin-bottom 會與其最后一個常規文檔流子元素的 margin-bottom 折疊,條件為父元素不包含 padding 和 border ,子元素的 margin-bottom 不與包含 clearance 的 margin-top 折疊。
  • 一個不包含border-top、border-bottom、padding-top、padding-bottom的常規文檔流元素,并且其 'height' 為 0 或 'auto', 'min-height' 為 '0',其里面也不包含行盒(line box),其自身的 margin-top 和 margin-bottom 會折疊。

case研究

  • BFC-文字環繞
  1. P標簽產生BFC,就不受外界浮動影響
  2. 調整圖片和文字的距離,兩種方式,p標簽的margin-left(足夠大),img的margin-right

    BFC-文字環繞

  • BFC-解決margin折疊
  1. .outer,.wrap,第一個.item的margin-top都是10,最后距離頂部距離也是10,說名什么,折疊后再折疊。
  2. .last產生BFC,讓自己和子元素margin不折疊。

    BFC-解決margin折疊

  • BFC 三欄布局
    BFC 區域,不會與浮動元素重疊。因此我們可以利用這一點來實現3列布局。

    三欄布局BFC

  • Margin-自身的 margin-top 和 margin-bottom折疊

    Margin-自身的 margin-top 和 margin-bottom折疊

  • Margin-margin-top和margin-bottom折疊

    Margin-margin-top和margin-bottom

  • Margin-margin-top折疊

    Margin-margin-top折疊


Block formatting contexts
collapsing-margins
CSS 屬性flow-root
display:flow-root|Can I Use
淺析BFC及其作用
理解CSS中BFC
前端精選文摘:BFC 神奇背后的原理
CSS清浮動處理(Clear與BFC)
CSS深入理解流體特性和BFC特性下多欄自適應布局

轉載于:https://www.cnblogs.com/cloud-/p/8086292.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370140.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370140.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370140.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java中的Selenium / WebDriver示例

幾年前,我正在忙于一些工作,客戶希望了解如何解決現實世界中的問題。 他們要求我自動化woot.com網站上的某些任務。 他們的任務是訪問各個網站,并閱讀當天商品的名稱和價格。 我寫了一些Selenium代碼,以為可以將其張貼在這里&am…

c語言中怎樣實現空格的替換,C語言實現去除字符串中空格的簡單實例

在網上看了些去除空格的代碼,覺得都不是很簡潔,就自己寫代碼實現它本著高效率,不使用額外存儲空間的想法實現該功能去除空格一共有三種:1、去除全部空格;2、一種是去除左邊空格;3、去除右邊空格想去除左右兩邊空格,只要先去除左邊…

python消息隊列中間件_python-RabbtiMQ消息隊列

1.RabbitMQ簡介AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的中間件設計。消息中間件主要用于組件之間的解耦,消息的發送者無需知道消息使用者的存在&#xff…

CSS position(定位)屬性

關于CSS position,來自MDN的描述: CSS position屬性用于指定一個元素在文檔中的定位方式。top、right、bottom、left 屬性則決定了該元素的最終位置。 然后來看看什么是文檔流(normal flow),下面是 www.w3.org 的描述: Normal flo…

tomcat配置文件server.xml詳解

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 目錄(?)[] 元素名 屬性 解釋 server port 指定一個端口,這個端口負責監聽關閉tomcat 的請求 shutdown 指定向端口發送的命令字符串 service name 指定service 的名字 Con…

均值,方差,協方差,協方差矩陣,特征值,特征向量

大牛博客,收藏一下 http://blog.csdn.net/yangleo1987/article/details/52845912轉載于:https://www.cnblogs.com/gaohai/p/8086626.html

Java ByteBuffer –速成課程

以我的經驗,當開發人員第一次遇到java.nio.ByteBuffer時,會引起混亂和細微的錯誤,因為如何正確使用它尚不明顯。 在我對API文檔感到滿意之前,需要反復閱讀API文檔和一些經驗以實現一些微妙之處。 這篇文章是關于如何正確使用它們的…

c語言cth三角函數表示,三角函數與雙曲函數基本公式對照表

圓函數(三角函數)1.基本性質:sin tan cos x x x ,cos cot sin xx x 1sec cos x x ,1csc sin x x tan cot 1x x sin csc 1x x sec cos 1x x 22sin cos 1x x 221tan sec x x ,221cot csc x x 2.奇偶性:sin()sin x x -- cos()cos x x - tan()tan x x --3.…

實現編輯功能有哪幾個action_Web 應用的撤銷重做實現

背景前不久,我參與開發了團隊中的一個 web 應用,其中的一個頁面操作如下圖所示:GIF這個制作間頁面有著類似 PPT 的交互:從左側的工具欄中選擇元素放入中間的畫布、在畫布中可以刪除、操作(拖動、縮放、旋轉等&#xff…

為什么我們要做三份 Webpack 配置文件

時至今日,Webpack 已經成為前端工程必備的基礎工具之一,不僅被廣泛用于前端工程發布前的打包,還在開發中擔當本地前端資源服務器(assets server)、模塊熱更新(hot module replacement)、API Pro…

使用maven插件構建docker鏡像

為什么要用插件 主要還是自動化的考慮,如果額外使用Dockerfile進行鏡像生成,可能會需要自己手動指定jar/war位置,并且打包和生成鏡像間不同步,帶來很多瑣碎的工作。 插件選擇 使用比較多的是spotify的插件:https://github.com/spo…

windows下如何安裝pip以及如何查看pip是否已經安裝成功?

最近剛學習python,發現很多關于安裝以及查看pip是否安裝成的例子都比較老,不太適合于現在(python 3.6 )因此,下一個入門級別的教程。 0:首先如何安裝python我就不做介紹了。 1:如果安裝的是pyth…

檢查用戶顯示器的分辨率

檢查用戶顯示器的分辨率 轉載于:https://www.cnblogs.com/Renyi-Fan/p/8088012.html

android 字體 dpi,詳解Android開發中常用的 DPI / DP / SP

Android的碎片化已經被噴了好多年,隨著國內手機廠商的崛起,碎片化也越來越嚴重,根據OpenSignal的最新調查,2014年市面上有18796種不同的Android設備,作為開發者,一個無法回避的難題就是需要適配各種各樣奇奇…

android studio閃退代碼不報錯_代碼不報錯,不代表真的沒錯

今天是生信星球陪你的第695天大神一句話,菜鳥跑半年。我不是大神,但我可以縮短你走彎路的半年~就像歌兒唱的那樣,如果你不知道該往哪兒走,就留在這學點生信好不好~這里有豆豆和花花的學習歷程,從新手到進階&#xff0c…

Centos7操作系統部署指南

一、硬件環境: Dell R620 二、軟件環境: Centos6.4 X86_64 KVM Windows7vnc 三、安裝說明 操作系統更新之迅速,讓作為新手的系統運維人員有點措手不及,相對于老手就胸有成竹。怎么講?由于老手對技術方向把握的非常好&…

Eclipse插件中的SLF4J登錄

一直都在使用Maven和純Java庫進行開發,我從沒想過在開發Eclipse插件時發出一些日志語句可能會成為問題。 但是,在Eclipse開發人員的想象中,一切似乎總是在Eclipse環境中,而Eclipse宇宙之外則什么都沒有。 如果您使用Google搜索上…

CSS(四)

css元素溢出 當子元素的尺寸超過父元素的尺寸時,需要設置父元素顯示溢出的子元素的方式,設置的方法是通過overflow屬性來設置。 overflow的設置項: 1、visible 默認值。內容不會被修剪,會呈現在元素框之外。2、hidden 內容會被修…

mysql排名

轉載自思心思危http://www.cnblogs.com/zengguowang/p/5541431.html 一、sql1{不管數據相同與否,排名依次排序(1,2,3,4,5,6,7.....)} SELECTobj.user_id,   obj.score,  rownum : rownum 1 AS rownum FROM(SELECT…

python中變量名后的逗號_深入淺析python變量加逗號,的含義

逗號,用于生成一個長度為1的元組>>> (1)1>>> (1,)(1,)>>> 1,(1,)因此需要將長度為1的元組中元素提取出來可以用,簡化賦值操作>>> a(1,)>>> ba>>> b(1,)>>> b,a>>> b1最后print打印變量加,實現連續打印…