我对BFC的理解

news/2024/5/18 22:22:23 标签: BFC

  最初这篇文章打算回答寒冬大神的第一问,谈谈CSS布局。本来呢我以为布局主要涉及float跟display相关属性,以及他们的包含框、静态位置等等。后来看了大神的一片面试文章,嗯?这里怎么还有个BFC,这是神马东东。待我搜索一下,萨萨萨,不看不知道,越看越糊涂,这到底是个神马东东。。。经过一个周时间的查阅资料和自我思考,在此总结一下我对BFC的认识,愿与各位道友分享,欢迎拍砖!

 

  对CSS有了解的道友们肯定都知道盒式模型这个概念,对一个元素设置CSS,首先需要知道这个元素是block还是inline类型。而BFC就是用来格式化块级盒子,同样管理inline类型的盒子还有IFC,以及其他的FC。那首先我们就来看一下FC的概念。

   Formatting Context:指页面中的一个渲染区域,并且拥有一套渲染规则,他决定了其子元素如何定位,以及与其他元素的相互关系和作用。

  BFC:块级格式化上下文,它是指一个独立的块级渲染区域,只有Block-level BOX参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。

 

  BFC的生成

 

  既然上文提到BFC是一块渲染区域,那这块渲染区域到底在哪,它又是有多大,这些由生成BFC的元素决定,CSS2.1中规定满足下列CSS声明之一的元素便会生成BFC

  • 根元素
  • float的值不为none
  • overflow的值不为visible
  • display的值为inline-block、table-cell、table-caption
  • position的值为absolute或fixed

  看到有道友文章中把display:table也认为可以生成BFC,其实这里的主要原因在于Table会默认生成一个匿名的table-cell,正是这个匿名的table-ccell生成了BFC

 

  BFC的约束规则

 浏览器对于BFC这块区域的约束规则如下:

  • 生成BFC元素的子元素会一个接一个的放置。垂直方向上他们的起点是一个包含块的顶部,两个相邻子元素之间的垂直距离取决于元素的margin特性。在BFC中相邻的块级元素外边距会折叠。
  • 生成BFC元素的子元素中,每一个子元素做外边距与包含块的左边界相接触,(对于从右到左的格式化,右外边距接触右边界),即使浮动元素也是如此(尽管子元素的内容区域会由于浮动而压缩),除非这个子元素也创建了一个新的BFC(如它自身也是一个浮动元素)。

  有道友对它做了分解,我们直接拿来:

  1. 内部的Box会在垂直方向上一个接一个的放置
  2. 垂直方向上的距离由margin决定。(完整的说法是:属于同一个BFC的两个相邻Box的margin会发生重叠,与方向无关。)
  3. 每个元素的左外边距与包含块的左边界相接触(从左向右),即使浮动元素也是如此。(这说明BFC中子元素不会超出他的包含块,而position为absolute的元素可以超出他的包含块边界)
  4. BFC的区域不会与float的元素区域重叠
  5. 计算BFC的高度时,浮动子元素也参与计算
  6. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然

  看到以上的几条约束,让我想起学习css时的几条规则

  • Block元素会扩展到与父元素同宽,所以block元素会垂直排列
  • 垂直方向上的两个相邻DIV的margin会重叠,而水平方向不会(此规则并不完全正确)
  • 浮动元素会尽量接近往左上方(或右上方)
  • 为父元素设置overflow:hidden或浮动父元素,则会包含浮动元素
  • ......

  哈哈,一股恍然大悟的感觉有木有,原来这些规则的背后都有更深层的概念,冥冥之中自有定数。。。

  

  BFC在布局中的应用

  上面说了那么多,那BFC究竟有何用处,毕竟再好的东西也要为我所用才行。

  防止margin重叠:

  同一个BFC中的两个相邻Box才会发生重叠与方向无关,不过由于上文提到的第一条限制,我们甚少看到水平方向的margin重叠。这在IE中是个例外,IE可以设置write-mode。下面这个demo来自寒冬大神的博客。

  

 margin水平重叠

  可以看到水平方向的margin发生了重叠。  

  要阻止margin重叠,只要将两个元素别放在一个BFC中即可(可以用上文提到的方式让相邻元素其中一个生成BFC)。阻止两个相邻元素的margin重叠看起来没有什么意义,主要用于嵌套元素。

 margin嵌套重叠

  此时div与ul之间的垂直距离,取div、ul、li三者之间的最大外边距。

  要阻止嵌套元素的重叠,只需让ul生成BFC即可(将上例中的注释去掉),这样div、ul、li之间便不会发生重叠现象。而li位于同一BFC内所以仍然存在重叠现象。

  需要注意的是:

  • 如果将为ul使用overflow:hidden的方式,ul生成BFC不应该再发生重叠现象可是我在chrome、firefox、ie上的测试结果都有发生重叠现象。这个问题,我没找到答案,还请道友们给解答一下
  • 如果为ul设置了border或padding,那元素的margin便会被包含在父元素的盒式模型内,不会与外部div重叠。《CSS权威指南》中提到块级正常流元素的高度设置为auto,而且只有块级子元素,其默认高度将是从最高块级子元素的外边框边界到最低块级子元素外边框边界之间的距离。如果块级元素右上内边距或下内边距,或者有上边框或下边框,其高度是从其最高子元素的上外边距边界到其最低子元素的下外边距边界之间的距离。

  浮动相关问题:

  使得父元素包含子元素,常见的方式是为父元素设置overflow:hidden或浮动父元素。根本原因在于创建BFC的元素,子浮动元素也会参与其高度计算,即不会产生高度塌陷问题。实际上只要让父元素生成BFC即可,并不只有这两种方式。

 包围浮动

  

  将上例中first中任意一项注释去掉都可以得到包围浮动的效果,其中overflow:hidden方式,与正常流最接近。

     

  关于清除浮动更详尽的方式,请大家参考这篇文章此处,dolphinX道友的博客简洁明了。

  多栏布局的一种方式

  上文提到的一条规则:与浮动元素相邻的已生成BFC的元素不能与浮动元素相互覆盖。利用该特性可以作为多栏布局的一种实现方式。

 多栏布局

  这种布局的特点在于左右两栏宽度固定,中间栏可以根据浏览器宽度自适应。

  

  IE中也有与BFC类似的概念成为hasLayout,我平时工作最低也是使用IE8,并没有涉及到这部分所以还请道友们查询其他资料。

  总结

  在我第一次接触到BFC时经常有一个疑问,BFC的结构是什么样的,像DOM一样的树状结构,还是一个BFC集合。其实我们不需要关心BFC的具体结构,这要看浏览器的具体实现采用什么样的数据结构。对于BFC我们只需要知道使用一定的CSS声明可以生成BFC,浏览器对生成的BFC有一系列的渲染规则,利用这些渲染规则可以达到一定的布局效果,为了达到特定的布局效果我们让元素生成BFC

  对于CSS新手来说不建议涉猎BFC,还是应该去看看相应的CSS布局规则,像《CSS设计指南》、《CSS权威指南》这两本都很不错,达到一定积累再来看BFC,说不定会有一种豁然开朗的感觉。BFC中几乎涉及到CSS布局的所有重要属性,这也是BFC的难点和我们需要掌握BFC的意义所在。

  文章中的部分内容可能与道友看到的其他博客有所出入,毕竟每个人的工作经验、所遇问题跟测试方法不一样,差异在所难免,探讨技术的乐趣在于不断的总结积累与自我推翻,只要大方向正确细节问题可以慢慢探索。

 

原文章链接地址:http://www.cnblogs.com/dojo-lzz/p/3999013.html#undefined


http://www.niftyadmin.cn/n/951645.html

相关文章

计算机英语口语面试自我介绍,2018考研复试面试英语口语自我介绍范文6

2018考研复试交流群 120223238考研复试对考生来说是非常重要的一部分,它关系到考生是否能考研成功的关键。考研复试面试中用英语介绍自己,是考查考生综合运用能力,这部分内容是非常的重要,自我介绍是引导老师对考生个人素质的了解…

牛客网笔试题错题总结

1、关于history对象的属性和方法的描述 length 返回浏览器历史列表中的URL数量back() 加载 history 列表中的前一个URLforward() 加载 history 列表中的下一个URLgo() 加载history列表中的某个具体页面。 2、H5新增的表单元素 datalist 元素规定输入域的选项…

计算机系统结构自考知识点,2019年10月自考计算机系统结构02325真题及答案

2019年10月自考计算机系统结构02325真题及答案注意事项:1.本试卷分为两部分,第一部分为选择题,第二部分为非选择题。2.应考者必须按试题顺序在答题卡(纸)指定位置上作答,答在试卷上无效。3.涂写部分、画图部分必须使用28B铅笔,书写…

jQuery中的九大选择器

九大选择器都是用来查找元素节点的。JQuery给我提供了九中类型的选择器。 1. 基本选择器  基本选择器是JQuery最常用的选择器,也是最简单的选择器,它通过元素id、class和标签名来查找DOM元素(在网页中id只能使用一次,class允许…

3880元购买计算机配置,求推荐4000元电脑主机配置,买硬件自己组装,最好有注意事项...

i57500散——1155 主板 华硕 B250MPLUS——550 散热器 九州 玄冰智能——60 内存 威刚 DDR4 8G 2133——365 固态 闪迪 PLUS加强版 120G——395 硬盘 西数1T蓝盘——295 显卡 索泰 GTX1050TI XGAMING OC 4G(信仰灯)——1290 机箱 金河田N6 PLUS——135 电源 台达NX350——205 总…

牛客网前端面试题错题总结

1、当表单中包含文件上传控件时,需要将enctype设置为() 正确答案:B application/x-www-form-urlencoded multipart/form-data text/explain file-data 解析: enctype 属性规定在发送到服务器之前应该如何对表单数据…

CSS控制前端图片HTTP请求的各种情况示例

图片的http请求&#xff0c;有很多种情况&#xff0c;那么究竟什么情况下面不会发生请求呢&#xff1f;下面我用案例一一列举一下&#xff0c;希望对你深入了解http图片请求有所帮助。 1. 隐藏图片 XML/HTML Code复制内容到剪贴板 <img src"haorooms.jpg" styl…

计算机组成原理第三版第2章,计算机组成原理第2章.ppt

《计算机组成原理第2章.ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《计算机组成原理第2章.ppt(20页珍藏版)》请在装配图网上搜索。1、运算方法和运算器,Intel,第二章,2.3 定点乘法运算 2.3.1 原码并行乘法,1. 补码与真值的转换公式&#xff1a; 补码乘法因符号…