在初学前端的时候,我们会经常碰到各种各样的布局问题,尤其当使用浮动的时候,然而学习了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的更多相关文章

  1. 浅谈BFC

    Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由很多个 Box 组成的.元素的类型和 display属性,决定了这个 Box 的类型. 不同类型的 Box, 会参与不同的 Fo ...

  2. 深入理解BFC

    定义 在解释BFC之前,先说一下文档流.我们常说的文档流其实分为定位流.浮动流和普通流三种.而普通流其实就是指BFC中的FC.FC是formatting context的首字母缩写,直译过来是格式化上 ...

  3. “fixed+relative==absolute”——对BFC的再次思考

    好久没写博客了,刚好今天跨年夜没约到什么妹子,在家宅着不如写点东西好了. 需求 昨天晚上,给公司年会做一个移动端的投票页面,遇到一个UI优化的问题: · 正文内容少于一屏时,投票提交按钮固定显示在页面 ...

  4. 关于CSS inline-block、BFC以及外边距合并的几个小问题

    CSS inline-block和BCF对于初学者来说,总是弄不太明白,下面记录下我在学习这块知识的过程中遇到的几个问题,供大家参考,有不足的地方,欢迎大家批评指正. 一.在什么场景下会出现外边距合并 ...

  5. 我对BFC的理解

    最初这篇文章打算回答寒冬大神的第一问,谈谈CSS布局.本来呢我以为布局主要涉及float跟display相关属性,以及他们的包含框.静态位置等等.后来看了大神的一片面试文章,嗯?这里怎么还有个BFC, ...

  6. CSS3与页面布局学习总结(三)——BFC、定位、浮动、7种垂直居中方法

    一.BFC与IFC 1.1.BFC与IFC概要 BFC(Block Formatting Context)即“块级格式化上下文”, IFC(Inline Formatting Context)即行内格 ...

  7. 前端精选文摘:BFC 神奇背后的原理

    BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...

  8. BFC的形成条件和特性分析

    初学CSS时,我们学到很多有意思的CSS规则,比如外边距塌陷,还有浮动元素的一些特性等,其实这些规则背后都是BFC这个东西在控制,下面我们来看下BFC到底是什么. 什么是BFC BFC(Block f ...

  9. BFC布局

    这几天都没有写博客,自己的懒惰又要跑出来了,发觉不能再这样下去了,不然就什么都不想干了,然后将之前已经写得差不多的博客重新检视了一遍.这篇博客已经写得挺久的了,但是一直没有发布,现在补充了一些,也让自 ...

随机推荐

  1. [转]Spring IOC详解

    Spring框架的Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大 ...

  2. postman 中 form-data、x-www-form-urlencoded、raw、binary的区别

    区别 form-data: 就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件.当上传的字段是文件 ...

  3. C# 解析 json Newtonsoft果然强大,代码写的真好

    C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...

  4. HA 高可用mysql集群

    注意问题: 1.保持mysql用户和组的ID号是一致的: 2.filesystem 共享存储必须要有写入权限: 3.删除资源必须先删除约束,在删除资源: 1.安装数据库,这里使用maridb数据库: ...

  5. NB-IOT/LoRa/Zigbee无线组网方案对比

    物联网设备节点组网存在2种组网方式, 无线组网和有线组网. 无线组网我们常见到的有Zigbee,LoRa, NB-IOT等,其中Lora/NB-IOT属于LPWAN技术,LPWAN技术有覆盖广.连接多 ...

  6. 2018-2019 Exp2 后门原理与实践

    2018-2019 Exp2 后门原理与实践 目录 一.实验内容说明及基础问题回答 二.工具准备 查看WindowsIP和LinuxIP Windows获得Linuxshell Linux 获得Win ...

  7. Unity3D 中判断点与多边形的关系

    由点发出的射线与多边形边的交点个数,如果是偶数个说明在多边形的外面,交点个数为奇数个在多边形的内部,下面是代码: public bool IsPointInPolygon(Vector2 point, ...

  8. 【转载】Vmware Vconverter从物理机迁移系统到虚拟机P2V

    本文完整记录了如何从物理服务器,保持所有环境配置信息,纹丝不动的迁移到虚拟机上,俗称 P2V .采用的工具是VMware公司的 VMware vcenter vconverter standalone ...

  9. 1117 Eddington Number (25 分)

    1117 Eddington Number (25 分) British astronomer Eddington liked to ride a bike. It is said that in o ...

  10. mysql存储过程中遍历数组字符串的两种方式

    第一种:多次使用substring_index()的方法 DELIMITER $$ DROP PROCEDURE IF EXISTS `array`$$ CREATE  PROCEDURE `arra ...