锋利的BFC
在初学前端的时候,我们会经常碰到各种各样的布局问题,尤其当使用浮动的时候,然而学习了BFC之后,其中的一些怪异现象,也因此成为理所当然,会有一种拨开云雾的快感。
下面简单介绍下BFC,究竟什么是BFC,它到底有什么作用和特点?
链接:http://www.w3.org/TR/CSS21/visuren.html#block-formatting是w3c关于BFC的描述。
一、什么是BFC
BFC(Block Formatting Context),即块格式化上下文,它是CSS2.1里的一个概念,我们可以简单的把它理解成一个环境,它规定了元素内容如何布局和定位,以及元素间的相互影响和作用。触发了BFC的元素会按照如下方式对其子元素进行排列:
1、子元素会一个接一个的放置。垂直方向上子元素的起点是包含块的顶部,在BFC中相邻的块级元素在垂直方向上,会发生margin折叠现象。
2、每一个子元素的左外边与包含块的左边相接触(对于从右到左的格式化,右外边接触右边),除非这个元素也触发了BFC,如自身也是一个浮动元素。
二、如何触发BFC
1、float值为left|right
2、display值为inline-block|table-cell|table-caption
3、overflow值不为visible(除非该值已经传到viewport)
4、position值为absolute|fixed
三、BFC有什么作用
BFC的主要用途是清除元素浮动和实现多栏布局
1、包含浮动元素
触发了BFC的元素中,子浮动元素也会参与高度的计算,从而避免发生高度“塌陷”,实现了清除浮动的功能。
<div id="container" style="background:blue;width:300px;overflow:hidden">
<div id="div1" style="background:green;height:200px">in flow</div>
<div id="div2" style="float:left;background:red">flow:left</div>
</div>
上面代码中,container属性overflow值为hidden,触发了BFC,将div2也包含进来。效果图如下:

如果去掉overflow:hidden,即overflow为默认值visible,则显示如下:

2、不被浮动元素覆盖
与浮动元素相邻的,触发了BFC的元素,都不能与浮动元素相互覆盖,因此我们可以利用此特性实现多栏布局
<div id="container" style="background:blue;width:300px">
<div id="div2" style="float:left;background:red;filter:alpha(opacity=50);opacity:0.5;">flow:left</div>
<div id="div1" style="background:green;height:200px;overflow:hidden">in flow</div>
</div>
上面代码div1触发了BFC,效果图如下:
如果去掉div1中的overflow:hidden,则div2会覆盖div1,显示如下:

注意:当BFC宽度大于容器剩余宽度时,浏览器可能会发生兼容性问题,主要有两种情况:1、BFC显示在浮动元素下一行;2、BFC显示在浮动同一行,并且溢出容器。
3、阻止父子元素margin折叠
触发了BFC的元素不会与它的子元素发生外边距折叠
<div id="div1" style="width:200px; height:200px;background:red;overflow:hidden;">
<div id="div2" style="width:100px; height:100px;background:green;margin:50px;"></div>
</div>
以上代码显示如下:
如果去掉div1中的overflow:hidden,则根据 CSS 2.1 8.3.1 Collapsing margins 第一条,两个相邻(兄弟或者父子)的普通流中的块框在垂直位置的空白边(只要他们之间没有阻挡(例如边框,非空内容,padding等))会发生折叠现象,显示发生变化如下:

四、补充
IE中的haslayout和标准的BFC之间的区别和联系。
区别:
1、在IE8之前,还没有 Block Formatting Context和Inline Formatting Context的概念,而是通过hasLayout来实现相似的目的。
2、在IE中可以通过设置width、height、min-width、min-height、max-width、max-height、zoom(IE6)和writting-mode来触发hasLayout,而这些属性值的设置不能触发BFC。
3、在IE中,一些元素默认就有hasLayout,如input、button、select、textarea,但是这些元素会触发Inline Formatting Context。
相同点:
1、两者都规定了如何对内容进行定位、大小计算,以及和其他元素的相互作用。
2、浮动元素、绝对定位元素、inline-block元素、除visible以外的overflow、table-cell和table-caption既可以触发BFC又可以触发hasLayout。
兼容:
为了兼容IE8-,那么同时触发BFC和hasLayout,那么都不触发。
1、对于触发hasLayout的元素,如input,通过设置CSS属性来触发BFC。
2、对于触发BFC,但没有触发hasLayout的元素,通过设置zoom:1来触发hasLayout。
外边距折叠的问题:
发生外边距折叠的条件:两个元素在垂直方向上有相邻的外边距时。
1、当兄弟元素时,元素间的距离折叠;
2、当父子元素时,子元素的外边距折叠到父元素上。
发生外边距折叠时的计算法则:
1、两个元素的外边距都是正值时,取较大者;
2、两个元素的外边距一正一负时,取两者之和。
锋利的BFC的更多相关文章
- 浅谈BFC
Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由很多个 Box 组成的.元素的类型和 display属性,决定了这个 Box 的类型. 不同类型的 Box, 会参与不同的 Fo ...
- 深入理解BFC
定义 在解释BFC之前,先说一下文档流.我们常说的文档流其实分为定位流.浮动流和普通流三种.而普通流其实就是指BFC中的FC.FC是formatting context的首字母缩写,直译过来是格式化上 ...
- “fixed+relative==absolute”——对BFC的再次思考
好久没写博客了,刚好今天跨年夜没约到什么妹子,在家宅着不如写点东西好了. 需求 昨天晚上,给公司年会做一个移动端的投票页面,遇到一个UI优化的问题: · 正文内容少于一屏时,投票提交按钮固定显示在页面 ...
- 关于CSS inline-block、BFC以及外边距合并的几个小问题
CSS inline-block和BCF对于初学者来说,总是弄不太明白,下面记录下我在学习这块知识的过程中遇到的几个问题,供大家参考,有不足的地方,欢迎大家批评指正. 一.在什么场景下会出现外边距合并 ...
- 我对BFC的理解
最初这篇文章打算回答寒冬大神的第一问,谈谈CSS布局.本来呢我以为布局主要涉及float跟display相关属性,以及他们的包含框.静态位置等等.后来看了大神的一片面试文章,嗯?这里怎么还有个BFC, ...
- CSS3与页面布局学习总结(三)——BFC、定位、浮动、7种垂直居中方法
一.BFC与IFC 1.1.BFC与IFC概要 BFC(Block Formatting Context)即“块级格式化上下文”, IFC(Inline Formatting Context)即行内格 ...
- 前端精选文摘:BFC 神奇背后的原理
BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...
- BFC的形成条件和特性分析
初学CSS时,我们学到很多有意思的CSS规则,比如外边距塌陷,还有浮动元素的一些特性等,其实这些规则背后都是BFC这个东西在控制,下面我们来看下BFC到底是什么. 什么是BFC BFC(Block f ...
- BFC布局
这几天都没有写博客,自己的懒惰又要跑出来了,发觉不能再这样下去了,不然就什么都不想干了,然后将之前已经写得差不多的博客重新检视了一遍.这篇博客已经写得挺久的了,但是一直没有发布,现在补充了一些,也让自 ...
随机推荐
- [转]Spring IOC详解
Spring框架的Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大 ...
- postman 中 form-data、x-www-form-urlencoded、raw、binary的区别
区别 form-data: 就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件.当上传的字段是文件 ...
- C# 解析 json Newtonsoft果然强大,代码写的真好
C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...
- HA 高可用mysql集群
注意问题: 1.保持mysql用户和组的ID号是一致的: 2.filesystem 共享存储必须要有写入权限: 3.删除资源必须先删除约束,在删除资源: 1.安装数据库,这里使用maridb数据库: ...
- NB-IOT/LoRa/Zigbee无线组网方案对比
物联网设备节点组网存在2种组网方式, 无线组网和有线组网. 无线组网我们常见到的有Zigbee,LoRa, NB-IOT等,其中Lora/NB-IOT属于LPWAN技术,LPWAN技术有覆盖广.连接多 ...
- 2018-2019 Exp2 后门原理与实践
2018-2019 Exp2 后门原理与实践 目录 一.实验内容说明及基础问题回答 二.工具准备 查看WindowsIP和LinuxIP Windows获得Linuxshell Linux 获得Win ...
- Unity3D 中判断点与多边形的关系
由点发出的射线与多边形边的交点个数,如果是偶数个说明在多边形的外面,交点个数为奇数个在多边形的内部,下面是代码: public bool IsPointInPolygon(Vector2 point, ...
- 【转载】Vmware Vconverter从物理机迁移系统到虚拟机P2V
本文完整记录了如何从物理服务器,保持所有环境配置信息,纹丝不动的迁移到虚拟机上,俗称 P2V .采用的工具是VMware公司的 VMware vcenter vconverter standalone ...
- 1117 Eddington Number (25 分)
1117 Eddington Number (25 分) British astronomer Eddington liked to ride a bike. It is said that in o ...
- mysql存储过程中遍历数组字符串的两种方式
第一种:多次使用substring_index()的方法 DELIMITER $$ DROP PROCEDURE IF EXISTS `array`$$ CREATE PROCEDURE `arra ...