轻谈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)
- overflow, 除了 visible 以外的值(hidden,auto,scroll)
- floadt,浮动元素,float 除 none 以外的值
- display,为以下其中之一的值 inline-blocks,table-cells,table-captions, flex, 或者 inline-flex(display:table可以生成BFC,原因在于Table会默认生成一个匿名的table-cell,这个table-cell生成了BFC)
- position,绝对定位元素,position(absolute,fixed)
BFC特性
- 在块格式上下文中,框从一个包含块的顶部开始,一个接一个地垂直排列
- 块格式化上下文中相邻块级别框之间的垂直边距折叠
- 在块格式化上下文中,每个框的左外边缘都与包含块的左边缘接触(用于从右到左格式化,右边缘接触)。即使在有浮动的情况下也是如此(虽然箱子的线框可能因为浮动而缩小),除非箱子建立了新的块格式上下文(在这种情况下,箱子本身可能由于浮动而变窄)。
其他抄过来的特性 - BFC的区域不会与float box重叠。实用场景是文字环绕。结合第三条,调整文字和图片的距离,应该设置图片的margin更合适
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。解决margin折叠
- 计算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-文字环绕
- P标签产生BFC,就不受外界浮动影响
- 调整图片和文字的距离,两种方式,p标签的margin-left(足够大),img的margin-right
- BFC-解决margin折叠
- .outer,.wrap,第一个.item的margin-top都是10,最后距离顶部距离也是10,说名什么,折叠后再折叠。
- .last产生BFC,让自己和子元素margin不折叠。
BFC 三栏布局
BFC 区域,不会与浮动元素重叠。因此我们可以利用这一点来实现3列布局。Margin-自身的 margin-top 和 margin-bottom折叠
Margin-margin-top和margin-bottom折叠
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特性下多栏自适应布局
轻谈BFC的更多相关文章
- 【css】浅谈BFC
定义: 块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域. BFC的布 ...
- 谈BFC和haslayout
今天提到BFC和haslayout,就顺带在网上查查资料,总结一下它们. CSS2我们再熟悉不过,当然它里面我们需要掌握的,就是CSS2的选择器和布局,选择器总共31种.避开这个不说,我们说布局. 布 ...
- 浅谈BFC
Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由很多个 Box 组成的.元素的类型和 display属性,决定了这个 Box 的类型. 不同类型的 Box, 会参与不同的 Fo ...
- 浅谈BFC与应用
什么是BFC BFC(Block formatting context)的中文翻译我们一般叫做块级格式化上下文.它是一个独立渲染的区域,规定了内部如何布局,同时不受外界的影响.我们的根元素本身就是一个 ...
- 浅谈BFC的理解
在 web 页面布局中,有三种控制元素版式布局的模型: 普通流 (Flow) 元素在 HTML 中按照先后位置从上至下的流式排列方式布局. 浮动流(Float) 在浮动布局中,元素首先按照普通流的位置 ...
- 浅谈BFC和IFC
先说说FC,FC的含义就是Fomatting Context.它是CSS2.1规范中的一个概念. 它是页面中的一块渲染区域.而且有一套渲染规则,它决定了其子元素将怎样定位.以及和其它元素的关系和相互作 ...
- 浅谈BFC与高度塌陷
这个概念我大概是去年时候接触到的吧,略略记录了一下,没有深入研究,恰逢最近秋招,在这里写一写,顺便加深自己的印象. 什么是BFC? 页面中的元素都隐含一个属性Block Formatting Cont ...
- LinqToDB 源码分析——轻谈Linq查询
LinqToDB框架最大的优势应该是实现了对Linq的支持.如果少了这一个功能相信他在使用上的快感会少了一个层次.本来笔者想要直接讲解LinqToDB框架是如何实现对Linq的支持.写到一半的时候却发 ...
- 轻谈 return i++
在写函数的时候,发现了又一个很有意思的事情 先上代码 public class Test{ static int number = 2; public static void main(String ...
随机推荐
- DOM 遍历-同胞
在 DOM 树中水平遍历 有许多有用的方法让我们在 DOM 树进行水平遍历: siblings() next() nextAll() nextUntil() prev() prevAll() prev ...
- rewirte 规则
Nginx Rewrite Rewirte 规则也称为规则重写,主要功能是实现浏览器访问 HTTP URL 的跳转,其正则 表达式是基于 Perl 语言.通常而言,几乎所有的 WEB 服务器均可以支持 ...
- (原创)遗传算法C++实现
本文没有对遗传算法的原理做过多的解释 基础知识可以参考下面的博客:http://blog.csdn.net/u010451580/article/details/51178225 本实验用到的变异用到 ...
- 阿里云RDS SQL Server 2008 R2 使用本地SQL备份文件还原全过程
最近公司准备全面转向阿里云,写了好几个方案,最终决定购买一台ECS和一台RDS搭配使用.开始对阿里的RDS产品陌生,加上公司的数据库文件近20G,诸多担心,生怕产品买来了不能用,给公司造成损失.后来联 ...
- codefoces384A-Mafia心得
题目描述:One day n friends gathered together to play "Mafia". During each round of the game so ...
- Facebook-Haystack合并小文件
1.原文 https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Beaver.pdf 2.翻译版 http://www.importn ...
- JAVA基础5——与String相关的系列(2)
差异点比较 String使用+直接拼接 这种情况需要分两种情况来讨论: 1. 都是确定的字符串常量之间进行的+号拼接的时候,由于在编译器就可以确定其具体值了,所以编译器在编译期的时候就会把这些常量拼接 ...
- Windows下安装BeautifulSoup
python版本为2.7 1.去官网下载BeautifulSoup4 Beautiful Soup 4.3.2 2.解压文件 将下载得到的压缩包解压到任意文件夹,路径不含中文 3.打开cmd命令提示符 ...
- 大数据基础篇(一):联机分析处理(OLAP) 与 联机事务处理(OLTP)
联机事务处理(OLTP) OLTP也称实时系统(Real Time System),支持事务快速响应和大并发,这类系统典型的有ATM机(Automated Teller Machine)系统.自动售票 ...
- c++的引用和c的指针之创建链表,二叉树的烦恼和区别
/* **代码功能:创建一个令人头疼的不算头疼的链表,然后把特定的数据删除. *这次的主题不是在代码上,主要是关于创建链表时候的传参问题,嘿嘿,不相信你没遇到过 */#include "st ...