MDN 对 BFC 的描述:

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

 

往下接着看看:

下列方式会创建块格式化上下文:

  • 根元素或包含根元素的元素
  • 浮动元素(元素的 float 不是 none)
  • 绝对定位元素(元素的 position 为 absolute 或 fixed)
  • 行内块元素 (元素的 display 为 inline-block)
  • 表格单元格(元素的 display 为 table-caption)
  • 具有overflow 且值不是 visible 的块元素,
  • display: flow-root
  • column-span: all 应当总是会创建一个新的格式化上下文,即便具有 column-span: all 的元素并不被包裹在一个多列容器中。

好像有那么点意思,就是说如果符合以上情况,就会创建 BFC 咯?
先不管那么多,写个demo试试看:

 
 

上面代码,当我们给子元素一个高度时,父元素会将子元素包裹住。

 
 

但是,当我们给子元素一个左浮动后,子元素脱离文档流就跑出去了。

 

上面代码,当我们也给父元素加上一个左浮动后(满足 float 不为 none),触发了 BFC,成功创建了块格式化上下文,父元素重新包裹住了子元素。

 

上面代码,当我们让父元素绝对定位后也触发了 BFC。

 

上面代码满足元素的 display 为 inline-block的条件,所以触发了 BFC。

再结合 MDN 的描述:

创建了块格式化上下文的元素中的所有内容都会被包含到该BFC中。

 

这下就清楚多了,BFC 可以用来包住浮动元素(不是清除浮动哟)。就算子元素再怎么折腾,也不会影响外部元素了。

话说回来,虽然我可以通过给父元素加 float 等条件触发 BFC,但是给父元素加 float 这个行为本身会不会影响别的元素呢?我可不想拆东墙补西墙。。。

于是,一个新的属性display: flow-root诞生了!!!
这个属性的功能就一个:触发 BFC

 

只需给元素加上display: flow-root就能触发 BFC。

既然说 BFC 能够包住浮动元素,那么我是不是可以利用这一点进行布局呢?

 

上面代码,当slide-bar左浮时,会脱离文档流,和main发生重叠。你也许会说,给main也加个左浮吧,看代码:

 

没错,由于没有宽度,我的main被挤扁了。。。那为什么不加个宽度呢?
这样我的main就不能自适应了呀(敲黑板!)
BFC 完美的解决了这个问题:

 

上面代码,利用 BFC 使两个兄弟元素互不干涉,实现了左右自适应布局。

总的来说,你可以这样理解 BFC:
功能一:爸爸管儿子
功能二:兄弟之间划清界限

参考资料:
块格式化上下文
CSS深入理解流体特性和BFC特性下多栏自适应布局

最新文章

  1. hdu 1005 1021 递归超限 找规律 // 只要看题中n较大都是有规律的
  2. iOS UIApplicatin和它的delegate
  3. 谈谈 JavaScript 中的 this 指向问题
  4. HBase总结(十二)Java API 与HBase交互实例
  5. Ubuntu 16.04 LTS 正式发布:系统将持续更新5年
  6. android 数据存储之SharePreference 的几种方式
  7. php Mysql 和Mysqli数据库函数整合
  8. Javascript 进阶 面向对象编程 继承的一个样例
  9. tomcat启动批处理——catalina.bat
  10. deque中的细节问题,以及reverse和max_element的使用
  11. hdu 5051 找规律?+大trick
  12. 使用Puppeteer进行数据抓取(四)——图片下载
  13. 获取客户机的ip和mac地址
  14. java string.getBytes(“UTF-8”) javascript equivalent
  15. ArcGIS Desktop Python add-ins 插件类型
  16. Android Service不能再详细的教程
  17. 不用的代码,存一份--用tornado实现的websocket
  18. video视频内容填充整个播放空间方法
  19. 第1章 部署虚拟环境安装linux系统
  20. if __name__ == '__main__'的作用和原理

热门文章

  1. 将文件File转换成byte数组
  2. Chrome:不受信任的证书----openssl签发带Subject Alternative Name的证书
  3. 使用SpringEL功能来动态化模板数据
  4. SearchLookupEdit 选择后联动
  5. HDFS修改副本数,并生效。
  6. bladex-boot推送harbor出错
  7. Python - Django - auth 模块
  8. Redis面试大全
  9. RabbitMQ中文文档PHP版本(三)--工作队列
  10. javascript之this、new、apply和call详解