Formatting context

我们把网页看作是由很多个盒子组成的,而这些盒子的展示方式,就是由display这个属性来决定的。

这里出现了一个概念,叫做Formatting context(格式上下文):

Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,有一套渲染规则决定了其子元素将如何定位,以及和其他元素的关系和相互作用。

Formatting context的种类

  • Block fomatting context (BFC):块级格式化上下文
  • Inline formatting context (IFC):行内格式化上下文
  • Flex formatting context(FFC):CSS3中的flex布局
  • Grid formatting context(GFC):CSS3中的Grid布局

BFC

接触的缘由?

相信很多人了解到BFC这个概念,都是因为在思考为什么这样做可以“清除浮动”而搜索到了和BFC有关的结果。那么我们先来拓展一下:

Q:浮动的时候,文字是不会重叠的,为什么?

来源于网络的答案:

使用float脱离文档流时,其他盒子会无视这个元素,但其他盒子内的文本依然会为这个元素让出位置,环绕在周围。

Q:为什么用clear属性可以清除浮动?

首先有一个前提,clear属性只能赋给块级元素才可能会有效果。

然后来自MDN:

  • 当应用于不浮动的块时,它将这个块的边框边界移动到所有相关浮动元素外边界的下方。这个行为作用时会导致margin collapsing不起作用。
  • 当应用于浮动元素时,它将元素的外边界移动到所有相关的浮动元素外边界的下方。这会影响后面的浮动元素的位置无法高于它之前的元素。

另外一种最常用的就是使用overflow:hidden来进行清除浮动,而它的原理就和BFC有关。

触发BFC的条件

  • 浮动元素,float 除 none 以外的值
  • 绝对定位元素,positionabsolute/fixed
  • display为以下其中之一的值inline-blocks、table-cell、flex、table-caption或者inline-flex。
  • overflow除了visible以外的值(hidden,auto,scroll)。
  • fieldset元素

BFC的特性

如果形成了BFC,就形成了一个单独的块。块和块之间不会出现干扰,所以浮动的元素块不会重叠。

下面是搜索了一些来源于网络的特性

  1. 如果这两个相邻的块框不属于同一个BFC,它们的外边距就不会叠加。(margin collopse)证实出来的结果是错误的!!!

    一般情况下,如下图所示,本应该是相隔40px,但是会发生重叠,结果出现的是盒子1的marginTop和盒子2的marginBottom里那个更大的距离:

     
    margin collopse

    如果我们给box1加上overflow:hidden,还是给box2加上overflow:hidden还是都加上,都无法解决这个问题。(不知是否是本人理解错误,目前我定它为错误)

  2. BFC边框和内部贴紧子元素不发生重叠:

一个BFC的边框不能和它里面的元素的外边距重叠,所以如果给一个挨着浮动的块级格式化上下文添加负的外边距时"不起作用"??。

除了上面相邻会出现重叠外,这种父子的情况也会出现重叠。如果不给下面这个父亲盒子加上overflow,里面的孩子就永远是紧贴着父亲的边框的,并且parent会取孩子和它自己marginTop里面最大的那个值来和test隔开。

 
margin collapse

另外这里引用写的是“margin负值不起作用”,经过测试之后发现也是错的。

  1. 盒子高度包含了浮动元素:

创建了BFC的元素就是一个独立的盒子,里面的子元素不会在布局上影响外面的元素,反之亦然,同时BFC依旧属于文档中的普通流。

就是BFC内的浮动元素可以撑起这个盒子。

  1. BFC的区域不会与float box重叠:

    也就是如果两个盒子黏在一起,一个是BFC一个是float(话说,float不也是BFC么=_=)这个时候它们不会重叠。

拓展:hasLayout

使用 *zoom: 1 的属性,这是一个IEhack, 因为 IE6-7 并不支持 W3C 的 BFC ,而是使用私有属性 hasLayout 。

从表现上说,hasLayout 跟 BFC 很相似。 hasLayout 自身存在很多问题,导致了IE6-7 中一系列的 bug。

FFC

触发FFC的条件

  • display: flex;
  • display: inline-flex;

与BFC的不同

以下来源于网络:

  • Flexbox 不支持 ::first-line 和 ::first-letter 这两种伪元素
  • vertical-align 对 Flexbox 中的子元素 是没有效果的
  • float 和 clear 属性对 Flexbox 中的子元素是没有效果的,也不会使子元素脱离文档流(但是对Flexbox本身是有效果的!)
  • 多栏布局(column-*) 在 Flexbox 中也是失效的,就是说我们不能使用多栏布局在Flexbox 排列其下的子元素
  • Flexbox 下的子元素不会继承父级容器的宽

关于各种Formatting context的更多相关文章

  1. Block formatting context(块级格式化上下文)

    今天看到豆瓣面试官的一篇文章,讲到关于CSS中的一个知识点:Block formatting context  ,感觉这个确实挺有用,同时我也挺赞同作者的一些观点的,这里就不展开谈我的感受了, 此文只 ...

  2. 块级格式化上下文(block formatting context)

    在CSS2.1中,有三种定位方案--普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inline元素水平排列,直到行被占满后换行,block元素则被渲染为完整的一行,除非指定,所有元素 ...

  3. 【转】关于Block Formatting Context--BFC和IE的hasLayout

    转自穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为“块级格式化范围”. 是 W3C CSS ...

  4. 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解

    CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...

  5. 浅入“Block Formatting Context”

    本文主要是针对BFC特性的应用,至于什么是BFC,可以参看MDN的简介: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Block_fo ...

  6. 关于Block Formatting Context--BFC和IE的hasLayout

    转文请标明 --- 出处:穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为"块级格式 ...

  7. css--block formatting context

    block formatting context(块级格式化上下文) 如何产生BFC:当一个HTML元素满足下面条件的任何一点,都可以产生Block Formatting Context: float ...

  8. BFC(Box,Formatting,Context) —— 块级格式化上下文

    Box:CSS布局的基本单位 Formatting context是页面中的一块渲染区域,最常见的是BFC和IFC,CSS3增加了GFC和FFC BFC定义:块级格式化上下文,它是一个独立的渲染区域, ...

  9. css Block formatting context BFC

    w3c关于BFC解释: http://www.w3.org/TR/CSS21/visuren.html#block-formatting Mdn描述: A block formatting conte ...

  10. Block formatting context

    不会JS中的OOP,你也太菜了吧!(第一篇)   一.你必须知道的 1) 字面量 2) 原型 3) 原型链 4) 构造函数 5) 稳妥对象(没有公共属性,而且其方法也不引用this的对象.稳妥对象适合 ...

随机推荐

  1. MySQL、SqlServer、Oracle 三种数据库的优缺点

    MySQL.SqlServer.Oracle 三种数据库的优缺点 一.MySQL 优点: 缺点: 二.SqlServer 优点: 缺点: 三.Oracle 优点: 缺点: 一.MySQL 优点: 体积 ...

  2. 区域之间PA、FortiGate内网互联专线、IPSec互备方案

    网络拓扑: 现状描述: 办公区和IDC之间有防火墙互联的点对点专线实现内网互通,现需要两地防火墙构建IPSec VPN作为专线的热备链路. 解决方案: 飞塔侧 1.按照阶段一.阶段二建立IPSec V ...

  3. HarmonyOS单模块编译与源码导读

    我这里以3518的开发板为例进行讲解,3516的也是通用的. 下面是之前全量编译的脚本 python build.py ipcamera_hi3518ev300 -b debug HarmonyOS最 ...

  4. 【论文研读】Sabir, Ekraam, et al. "Recurrent convolutional strategies for face manipulation detection in videos." Interfaces (GUI) 3.1 (2019).

    #摘要 错误信息通过合成逼真的图像和视频进行传播这一严重问题,需要鲁棒的篡改检测方法来应对.尽管在检测静止图像上的面部篡改方面已付出了巨大的努力,但人们对于通过利用视频流中存在的时序信息,对视频中被篡 ...

  5. TDH社区版搭建总结

    在安装之前需要对docker分区进行格式化处理: Redhat/CentOS 在Redhat/CentOS上,docker分区必须采用XFS格式,实现的步骤如下: 1. 创建目录/var/lib/do ...

  6. 简单判断long long 以内的回文数

    bool Ispalindrome(long long x) { if(x<0||(x>0&&x%10==0))return false; long long back=0 ...

  7. Codeforces Round #646 (Div. 2) 题解 (ABCDE)

    目录 A. Odd Selection B. Subsequence Hate C. Game On Leaves D. Guess The Maximums E. Tree Shuffling ht ...

  8. 牛客练习赛71 C.数学考试 (DP,容斥原理)

    题意:RT 题解:先对\(p\)排个序,然后设\(dp[i]\)表示前\(i-1\)个\(p[i]\)满足条件但是\(p[i]\)不满足,即在\([1,p[i]]\)中不存在从\(p[1]\)到\(p ...

  9. Linux网络文件下载

    wget 以网络下载 maven 包为例 wget -c http://mirrors.shu.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-ma ...

  10. 关于vmwaretools

    今天安装Ubuntu16.04-i386,vmware15.5,使用的快速安装,然后安装vmwaretools出现问题:无法复制粘贴,顶部管理"重新安装vmware-tools"选 ...