码迷,mamicode.com
首页 > 其他好文 > 详细

关于BFC以及IFC

时间:2015-11-09 20:59:42      阅读:382      评论:0      收藏:0      [点我收藏+]

标签:

BFC就是用来格式化块级盒子,同样管理inline类型的盒子还有IFC,以及其他的FC

1. 首先我们要知道什么是FC

Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。最常见的 Formatting context 有 Block fomatting context (简称BFC)Inline formatting context (简称IFC)

 CSS2.1 中只有 BFC 和 IFCCSS3 中还增加了 GFC 和 FFC。

2.什么是BFC

 

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

  Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由很多个 Box 组成的。元素的类型和 display 属性,决定了这个 Box 的类型。 不同类型的 Box, 会参与  不同的 Formatting Context(一个决定如何渲染文档的容器),因此Box内的元素会以不同的方式渲染。让我们看看有哪些盒子:

  • block-level box:display 属性为 block, list-item, table 的元素,会生成 block-level box。并且参与 block fomatting context
  • inline-level box:display 属性为 inline, inline-block, inline-table 的元素,会生成 inline-level box。并且参与 inline formatting context
  • run-in box: css3 中才有, 这儿先不讲了。

3.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

4.BFC的约束规则

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

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

 BFC布局规则(什么情况产生BFC):

  1. 内部的Box会在垂直方向,一个接一个地放置。
 1 <style>
 2         .bigbox{
 3             width:200px;
 4             height:300px;
 5             background-color: #fcc;
overflow:hidden;/*解决方案1*/
border:1px solid transparent/*解决方案2*/
6 } 7 .smallbox{ 8 width:100px; 9 height:100px; 10 background-color: #f00; 11 margin-top: 30px;; 12 } 13 </style> 14 </head> 15 <body> 16 <div class="bigbox"> 17 <div class="smallbox">内部box</div> 18 <div class="smallbox">内部box</div> 19 </div> 20 </body>

 技术分享 

解决方案:

 1.父容器设置padding-top:1px solid #f00; 高度减1。

 2.父容器设置overflow-hidden;

 3.父容器和子元素设置浮动

 4.父容器设置  border:1px solid transparent

 5.父容器或者子元素设置绝对定位  (解决办法大家自己去尝试哈 可以释放注释部分)

 

     2.Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠      

 1 <style>
 2         .bigbox{
 3             width:200px;
 4             height:300px;
 5             background-color: #fcc;
 6             border:1px solid transparent;
 7         }
 8         .smallbox{
 9             width:100px;
10             height:100px;
11             background-color: #f00;
12             margin-top: 30px; /*  注意这里,第二个smallbox应该可以产生50px 因为BFC,然而并没有*/
13             margin-bottom: 20px;
14         }
15     </style>
16 </head>
17 <body>
18         <div class="bigbox">
19             <div class="smallbox"></div>
20             <div class="smallbox"></div>
21         </div>
22 </body>

 

 

 

         

  1. 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  2. BFC的区域不会与float box重叠。
  3. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  4. 计算BFC的高度时,浮动元素也参与计算

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

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

 

关于BFC以及IFC

标签:

原文地址:http://www.cnblogs.com/nanshannan/p/4950933.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!