一、何为BFC

块级格式化上下文(Block Formatting Context)是网页CSS视觉渲染的一部分,并用于决定盒子的布局。在定位体系中属于常规流(Normal Flow)(另外两种定位体系为浮动(Floats)和绝对定位(Absolute Positioning))。

二、BFC如何形成

BFC的形成,根据W3C所言:

浮动、绝对定位元素(positionabsolutefixed)、行内块元素 display:inline-block、表格单元格display:table-cell、表格标题 display:table-caption 以及 overflow 属性值不为 visible 的元素(除了该值被传播到视点 viewport 的情况)将创建一个新的块级格式化上下文。

通俗理解的话,一个BFC元素至少满足一下条件中的一个:

1.float的值不为none

2.position的值不为static或relative

3.display的值为table-cell、table-caption、inline-block、flex或inline-flex

4.overflow的值不为visiable

满足以上条件的元素将有BFC元素的一些特性,理解并掌握这些特性可以让你在CSS布局中更加得心应手,也可以从根源上理解一些常见代码实现效果的原理,如清除浮动,自适应布局等。

三、BFC有什么特性

1.BFC中盒子对齐

W3C规范中写到:

在BFC上下文中,每个盒子的左外侧紧贴包含块的左侧(从右到左的格式里,则为盒子右外侧紧贴包含块右侧),甚至有浮动也是如此(尽管盒子里的行盒子 Line Box 可能由于浮动而变窄),除非盒子创建了一个新的BFC(在这种情况下盒子本身可能由于浮动而变窄)。

如图所示,所有BFC的盒子都会遵循左对齐的的对齐方式。

2.关于外边距折叠

大家应该知道,标准文档流的同胞元素在竖直方向上会发生外边距折叠的现象,如下图

A的下边距为100px,B的上边距为50px,发生外边距折叠后A、B竖直间距为50xp。(更多外边距折叠问题后面会有博客专题)

一个BFC盒子与它的子元素之间不会发生外边距折叠。但是同一个BFC盒子内部的子元素之间也是会发生外边距折叠的,如下图:

可如果为其中一个子元素创建一个新的BFC(不同于父元素那个BFC盒子),让这些子元素分属于不同的BFC,他们之间就不会发生外边距折叠了,如下图:

HTML为:

<div class="container"><p>Sibling 1</p><p>Sibling 2</p><div class="newBFC"><p>Sibling 3</p></div>
</div>

CSS为:

.container {background-color: red;overflow: hidden; /* creates a block formatting context */
}
p {margin: 10px 0;background-color: lightgreen;
}
.newBFC {overflow: hidden;  /* creates new block formatting context */
}

3.BFC内外元素互不影响

这条通俗来讲就是:无论BFC内部元素如何布局——浮动、绝对定位或是其他,都不会对BFC盒子外的其他盒子的布局造成影响,同时,外部元素也不会影响BFC内部元素的布局。这个特性用途很广,也解释了为何BFC可以清除浮动了。

四、如何应用BFC

BFC的特性是很多CSS规范背后的原理,掌握这些特性,反过来应用它们就可以实现很多效果:

一、使用BFC避免外边距折叠

BFC特性2中的实例就实现了这个特性的反向应用。

二、使用BFC清除浮动

由于特性3,我们只需要用BFC包含浮动块就可以达到清除浮动影响的效果,也就是让包含浮动的父元素BFC化,这就是好几种清除浮动方法的根本原理:

1.设置父元素也浮动;

2.设置父元素的display为table(不常用);

3.设置父元素overflow:hidden/auto;

都是让父元素BFC化,来清除对BFC外元素的影响。(下一篇博客将总结各种清除浮动的方法)

三、使用BFC避免文字环绕效果

大部分时候我们并不需要浮动带来的文字环绕效果(这个现象是由于特性1,详细解释可参考http://web.jobbole.com/83149/),用BFC来清除这个效果是个不错的选择。如下图:

我们将文字部分的包含块设置overflow:hidden就可以实现清除文环绕了。

四、多列布局与自适应布局

多列布局:

如果我们创建一个占满整个容器宽度的多列布局,在某些浏览器中最后一列有时候会掉到下一行。这可能是因为浏览器四舍五入了列宽从而所有列的总宽度会超出容器。但如果我们在多列布局中的最后一列里创建一个新的BFC,它将总是占据其他列先占位完毕后剩下的空间。(对于多列布局这不一定是个好办法,在实际应用中更推荐使用弹性盒子或者用最后一个盒子margin负值来解决。)

自适应布局:

类似应用三的例子中,如果设置右边浮动元素margin-right(或左边BFC元素margin-left)为一定值,就实现了左右两列的自适应布局,无论左右两部分width怎么变化,都可以保持很好的布局状况而不会乱掉,这种情况下BFC的设置方法可以是:

1.overflow:auto/hidden;   IE7+

2.display:inline-block;   IE6/IE7

3.display:table-cell;     IE8+

五、最后

本文参考了好几篇博文,原文中关于用法或原理有更详尽的解释,下面贴出地址:

张鑫旭 CSS深入理解流体特性和BFC特性下多栏自适应布局

http://www.zhangxinxu.com/wordpress/2015/02/css-deep-understand-flow-bfc-column-two-auto-layout/

理解CSS中的块级格式化上下文

http://web.jobbole.com/83149/

还是那句话,感谢前人栽阴!

转载于:https://www.cnblogs.com/adventureofraindrop/p/6123264.html

CSS中块级格式化上下文(BFC)的特性与应用相关推荐

  1. CSS进阶(2)- 块级格式化上下文

    本系列笔记是基于[渡一教育]袁进老师的html+css基础课程而记录,仅作为个人记录以及阅读使用. 文章目录 块级格式化上下文 常规流块盒的布局的一些规则 BFC渲染区域 BFC的独立性 BFC的具体 ...

  2. 关于对CSS中BFC (块级格式化上下文) 的理解

    转自: https://www.thinktxt.com/web-front/2017/02/18/css-bfc-layout-model.html 也许你已经掌握了HTML.CSS的基本布局技能, ...

  3. 点击箭头 切图 html,项目切图规范 css精灵图 css小箭头代码 BFC (Block Formatting Context) 块级格式化上下文...

    项目切图规范 PS常用工具 移动工具 移动工具主要负责图层.选区.等的移动.复制操作. 快捷键:v 抓手工具 快捷键:h 空格 + 鼠标左键拖动,空格键可临时转换为抓手工具. 放大镜工具 放大镜工具可 ...

  4. css三大特性权重计算BFC(块级格式化上下文)盒子模型

    系列文章目录 文章目录 系列文章目录 前言 一.css三大特性 1.继承性 2.层叠性 3.优先级 二.权重计算 1.引入库 2.读入数据 三.BFC(块级格式化上下文) 1.引入库 2.读入数据 总 ...

  5. 一个div 上下两行_web前端工程师如何理解 CSS 布局和块级格式化上下文

    CSS是web前端中的重要内容,很多初学者在学习CSS时都会遇到各种各样的问题,今天就给大家分享web前端开发如何理解CSS不惧和块级格式化上下文.也许你从未听说过这个术语,但是如果你曾经用 CSS ...

  6. 对 BFC 规范(块级格式化上下文:block formatting context)的理解?

    相关知识点: 块格式化上下文(Block Formatting Context,BFC)是Web页面的可视化CSS渲染的一部分,是布局过程中生成块级盒 子的区域,也是浮动元素与其他元素的交互限定区域. ...

  7. BFC(块级格式化上下文)【面试】

    BFC(块级格式化上下文) 块级格式化上下⽂,是⼀个独⽴的渲染区域,让处于 BFC 内部的元素与外部 的元素相互隔离,使内外元素的定位不会相互影响. IE下为 Layout ,可通过 zoom:1 触 ...

  8. 块级格式化上下文(Block Formatting Context)

    前言 在 CSS 2.1 中,有三种定位方案--普通流 (Normal Flow) .浮动 (Floats) 和绝对定位 (Absolute Positioning) ,下面分别对这三种布局简略说明一 ...

  9. Block Formatting Contexts(块级格式化上下文)

    前几天看到kejun's blog里面的一篇文章:"近期面试感受", 里面提到面试时的一道题的不同的解决方案,比较它们之间的优缺点,其中出现了一个概念:Block Formatti ...

最新文章

  1. FastDFS扩展开发说明
  2. CentOS查看CPU信息
  3. 福建省计算机学会 noip比赛,重磅!福州一三附学生领衔全省前九名!他们将代表福建参加全国比赛!...
  4. 哥斯拉Webshell
  5. JimuReport积木报表 — API数据源报表带参制作
  6. c语言甘勇第二版第五章答案,C语言(1) - Patata的个人页面 - OSCHINA - 中文开源技术交流社区...
  7. python检测excel是否打开_Python: 如何判断远程服务器上Excel文件是否被人打开
  8. 惠普打印机故障代码_HP激光打印机常见故障代码
  9. paperwhite3翻页_亚马逊Kindle Paperwhite 3G / Wi-Fi评论
  10. html中三角函数表示什么,三角函数的化一公式
  11. ExoPlayer之Extractor
  12. java 实现手机号码(String)校验----两种方法
  13. Fabric官方教程(release 2.2)翻译及总结——链码的生命周期管理
  14. 远程桌面仅计算机,仅允许运行使用网络级别身份验证的远程桌面计算机连接失败处理方法(远程桌面连接)...
  15. 思岚科技机器人底盘价格揭秘
  16. 博士毕业选择回老家县城大专任教!事业编、副教授待遇、外加几十万安家费......
  17. 用python制作二维码_用python做一个可视化生成二维码的工具
  18. GPU虚拟化-Intel的KVMGT、NVIDIA的vGPU、AMD的MaxGPU
  19. Camtasia Studio2021喀秋莎激活下载如何录制屏幕教程
  20. 3D视觉的学习路线都在这里了~

热门文章

  1. linux查看nginx运行状态,如何查看nginx运行状态及相关属性说明
  2. v380云存储怎么用_云智中国-百度智能云薄磊:海量无限存储,助力产业智能化升级...
  3. 在Visual Studio 2005里,用ActiveSync来同步模拟器(Windows Mobile 5.0 )
  4. 09、redis哨兵的多个核心底层原理的深入解析(包含slave选举算法)
  5. 微信小程序code 换取 session_key
  6. hdu 2842 Chinese Rings 矩阵快速幂
  7. 一篇文读懂分布式系统本质:高吞吐、高可用、可扩展
  8. gulp实现打包js/css/img/html文件,并对js/css/img文件加上版本号
  9. 如何修改dedecms专题目录默认名称special
  10. linux文件目录类常用命令