什么是BFC、IFC、GFC和FFC以及其布局规则和⽤处
什么是 BFC、IFC、GFC 和 FFC 以及其布局规则和⽤处
Box 和 FC(即 formatting context)
Box
⼀个页⾯是由很多个 Box 组成的,元素的类型和 display 属性决定了这个 Box 的类型。不同类型的 Box,会参与不同的 Formatting Context。
Block level的box会参与形成BFC,⽐如display值为block,list-item,table的元素。
Inline level的box会参与形成IFC,⽐如display值为inline,inline-table,inline-block的元素。
FC(Formatting Context)
它是W3C CSS2.1规范中的⼀个概念,定义的是页⾯中的⼀块渲染区域,并且有⼀套渲染规则,它决定了其⼦元素将如何定位,以及和其他元素的关系和相互作⽤。
常见的Formatting Context 有:Block Formatting Context(BFC | 块级格式化上下⽂) 和 Inline Formatt
ing Context(IFC |⾏内格式化上下⽂)。
CSS2.1中只有BFC和IFC, CSS3中才有GFC和FFC。
单位同意报考证明
BFC布局规则
BFC(Block Formatting Contexts)直译为"块级格式化上下⽂"。Block Formatting Contexts就是页⾯上的⼀个隔离的渲染区域,容器⾥⾯的⼦元素不会在布局上影响到外⾯的元素,反之也是如此。
BFC的布局规则如下:
1. 内部的Box会在垂直⽅向,⼀个接⼀个地放置。
2. Box垂直⽅向的距离由margin决定。属于同⼀个BFC的两个相邻Box的margin会发⽣重叠。
3. 每个元素的左外边缘(margin-left), 与包含块的左边(contain box left)相接触(对于从左往右的格式化,否则相反)。即使存在浮
动也是如此。除⾮这个元素⾃⼰形成了⼀个新的BFC。
嘴唇起皮是什么原因4. BFC的区域不会与float box重叠。
5. BFC就是页⾯上的⼀个隔离的独⽴容器,容器⾥⾯的⼦元素不会影响到外⾯的元素。反之也如此。
6. 计算BFC的⾼度时,浮动元素也参与计算。
那么如何触发 BFC呢?只要元素满⾜下⾯任⼀条件即可触发 BFC 特性:
一个人孤独的生活1. body 根元素或其它包含它的元素
抽油烟机安装2. 浮动 (元素的 float 不是 none)
3. 绝对定位的元素 (元素具有 position 为 absolute 或 fixed)
4. ⾮块级元素具有 display: inline-block,table-cell, table-caption, flex, inline-flex
5. 块级元素具有overflow ,且值不是 visible(hidden、auto、scroll)
BFC⽤处:
1. 清除浮动
<div class="wrap">
<ction>1</ction>
<ction>2</ction>
</div>
.wrap {
border:2px solid yellow;
width:250px;
}
ction {谢昊轩
background-color: pink;
float: left;
width:100px;
height:100px;
}
可以看到,由于⼦元素都是浮动的,受浮动影响,边框为黄⾊的⽗元素的⾼度塌陷了。
解决⽅案:为 .wrap 加上 overflow: hidden;使其形成BFC,根据BFC规则第六条,计算⾼度时就会计算float的元素的⾼度,达到清除浮动影响的效果。
2. 布局:⾃适应两栏布局
<div>
<aside></aside>
<main>我是好多好多⽂字会换⾏的那种蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤</main>
</div>
div {width:200px;}
aside {
background-color: yellow;
float: left;
width:100px;
height:50px;
}
空调自动启动main {
background-color: pink;
}
可以看到右侧元素的⼀部分跑到了左侧元素下⽅。
解决⽅案:为main设置 overflow: hidden; 触发main元素的BFC,根据规则第3、4、5条,BFC的区域是独⽴的,不会与页⾯其他元素相互影响,且不会与float元素重叠,因此就可以形成两列⾃适应布局
3. 防⽌垂直margin合并
<ction class="top">1</ction>
<ction class="bottom">2</ction>
ction {
background-color: pink;
margin-bottom:100px;
width:100px;
height:100px;
}
.bottom {
margin-top:100px;
蒲公英的旅行}
可以看到,明明.top和.bottom中间加起来有200px的margin值,但是我们只能看到100px。这是因为他们的外边距相遇发⽣了合并。之所以发⽣外边距折叠,是因为他们 同属于 body这个根元素,所以我们需要让 它们 不属于同⼀个BFC,就能避免外边距折叠:
怎样解决:为其中⼀个元素的外⾯包裹⼀层元素。并为这个外层元素设置 overflow: hidden;,使其形成BFC。因为BFC内部是⼀个独⽴的容器,所以不会与外部相互影响,可以防⽌margin合并。
<ction class="top">1</ction>
<div class="wrap">
<ction class="bottom">2</ction>
</div>
.wrap {
overflow: hidden;
}
IFC布局规则
IFC(Inline Formatting Contexts)直译为"内联格式化上下⽂",IFC的line box(线框)⾼度由其包含⾏内元素中最⾼的实际⾼度计算⽽来(不受到竖直⽅向的padding/margin影响) IFC中的line box⼀般左右都贴紧整个IFC,但是会因为float元素⽽扰乱。float元素会位于IFC 与与line box之间,使得line box宽度缩短。 同个ifc下的多个line box⾼度会不同。
IFC中时不可能有块级元素的,当插⼊块级元素时(如p中插⼊div)会产⽣两个匿名块与div分隔开,即产⽣两个IFC,每个IFC对外表现为块级元素,与div垂直排列。
那么IFC⼀般有什么⽤呢?
⽔平居中:当⼀个块要在环境中⽔平居中时,设置其为inline-block则会在外层产⽣IFC,通过text-align则可以使其⽔平居中。厚嘴唇的男人性格特点
垂直居中:创建⼀个IFC,⽤其中⼀个元素撑开⽗元素的⾼度,然后设置其vertical-align:middle,其他⾏内元素则可以在此⽗元素下垂直居中。
GFC布局规则
GFC(GridLayout Formatting Contexts)直译为"⽹格布局格式化上下⽂",当为⼀个元素设置display值为grid的时候,此元素将会获得⼀个独⽴的渲染区域,我们可以通过在⽹格容器(grid container)上定义⽹格定义⾏(grid definition rows)和⽹格定义列(grid definition columns)属性各在⽹格项⽬(grid item)上定义⽹格⾏(grid row)和⽹格列(grid columns)为每⼀个⽹格项⽬(grid item)定义位置和空间。
那么GFC有什么⽤呢,和table⼜有什么区别呢?
⾸先同样是⼀个⼆维的表格,但GridLayout会有更加丰富的属性来控制⾏列,控制对齐以及更为精细的渲染语义和控制。
FFC布局规则
FFC(Flex Formatting Contexts)直译为"⾃适应格式化上下⽂",display值为flex或者inline-flex的元素将会⽣成⾃适应容器(flex container),可惜这个⽜逼的属性只有⾕歌和⽕狐⽀持,不过在移动端也⾜够了,⾄少safari和chrome还是OK的,毕竟这俩在移动端才是王道。
Flex Box 由伸缩容器和伸缩项⽬组成。通过设置元素的 display 属性为 flex 或 inline-flex 可以得到⼀个伸缩容器。设置为 flex 的容器被渲染为⼀个块级元素,⽽设置为 inline-flex 的容器则渲染为⼀个⾏内元素。 伸缩容器中的每⼀个⼦元素都是⼀个伸缩项⽬。
伸缩项⽬可以是任意数量的。伸缩容器外和伸缩项⽬内的⼀切元素都不受影响。简单地说,Flexbox 定义了伸缩容器内伸缩项⽬该如何布局。