轻谈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 ...
随机推荐
- Flex布局:实现左右两列自伸缩撑满效果的
目前测试支持的浏览器: 兼容IE10及以上.Chrom.Firefox浏览器. 假如考虑IE10以下浏览器,可以考虑其他写法. 话不多说,上代码: <div style="back ...
- 用git上传本地文件到github
1.在自己的github账号下新建仓库--------得到github仓库地址 2.本地安装git---在将要克隆的文件夹下 右击点击Git Bash Here 3.输入命令 $ git clone ...
- shadow dom 隔离代码 封装
Shadow DOM是指浏览器的一种能力,它允许在文档(document)渲染时插入一棵DOM元素子树,但是这棵子树不在主DOM树中. Shadow DOM 解决了 DOM 树的封装问题. ...
- http 状态
用户如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求.此状态 ...
- Problem B: 大整数的加法运算
Problem B: 大整数的加法运算 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 112 Solved: 57[Submit][Status][W ...
- Linux系列教程(十七)——Linux权限管理之文件系统系统属性chattr权限和sudo命令
上篇博客我们介绍了权限管理的ACL权限,通过设定 ACL 权限,我们为某个用户指定某个文件的特定权限.这篇博客我们将介绍权限管理中用的比较多的两个命令 chattr 和 sudo . 1.设定文件系统 ...
- 高阶函数,柯里化,sort排序
高阶函数概念 first class object: 函数在python中时一等公民. 函数也是对象,可调用的对象. 函数可以作为普通变量,参数,返回值等等. 高阶函数: ...
- JSP 学习笔记
JSP 全名为Java Server Pages,中文名叫java 服务器页面,它是在传统的 HTML 页面中插入 JAVA 代码片段和 JSP 标签形成的文件. 上一篇 Servlet 中只是讲解了 ...
- SAX解析文件
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import ja ...
- Java 8的新特性—终极版
作者:杜琪[译] 原文链接:http://www.jianshu.com/p/5b800057f2d8 1. 简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本 ...