Block formatting context & Inline formatting context(BFC&IFC)的区别(转载)
何为BFC与IFC
bfc与ifc是针对页面正常流的两种环境,块级元素处于bfc环境中,行内元素处于ifc环境中。
元素是块级元素or行内元素由其display属性决定:
- block, table, flex, grid, list-item 为块级
- inline, inline-block, inline-table, inline-flex, inline-grid 为行内级
bfc与nfc就是块级元素与行内元素和外界的’隔离区域’
值得注意的是行内元素是不能直接放进bfc中的,每个bfc中的行内元素都会在其外部生成匿名块级元素来产生ifc环境
BFC与IFC的特性
先说bfc,在bfc中,元素排列特性为:
- 元素纵向排列,由顶向下
- 元素垂直间距取决于垂直方向margin,同一个bfc下的元素垂直方向margin会产生重叠
- bfc内元素会与产生bfc的元素左对齐,即使存在浮动,如果从左往右的格式化则相反(因而会产生与浮动元素层叠问题)
而对于产生bfc的元素,又有以下特性:
- bfc不会与float box叠加
- 计算bfc高度时,其子元素中的float元素也参与计算
- bfc是隔离区,其子元素不会对外界产生影响
再谈ifc,再ifc中的元素有以下特性:
- 元素水平排布,横向的padding,margin,borders好使
- ifc内元素垂直方向有多种对对齐方式,元素高度小于ifc高度时使用 ‘vertical-align’ 来决定垂直对齐方式,一行对齐完成后的方框叫做line box
- 当多个行内元素横向排列超过line box宽度时(即一行放不下),他们会折行,形成多个line box,line box垂直并排不可分离或重叠,像p多行就是分离的。
- 当同行内元素宽度和小于line box的宽度,横向对齐方式由text-align决定
而产生ifc的元素则有以下特性(其实ifc被分割为多个line box来看待,而整个ifc对外通常表现为bfc中的一个元素):
- 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垂直排列。
bfc与ifc的产生条件
bfc产生条件比较复杂,通常元素位于一个大的bfc环境下,要产生独立的bfc需要以下条件:
- 元素float为none以外的值
- overflow除了visible 以外的值(hidden,auto,scroll )
- display为table-cell,table-caption,inline-block, flex, inline-flex
- position为absolute,fixed
- fieldset元素
ifc的产生则是在行内元素出现情况则会出现,通常为行内元素外的匿名块
bfc与ifc的运用场景
bfc的运用比较普遍了,主要有以下几种:
- 消除浮动:浮动元素参与bfc的高度计算,所以将元素设置为独立bfc可以防止元素塌陷
- 两行布局:bfc不会与float box叠加,所以可以用于两行布局
- 解决margin叠加:竖直方向的独立bfc不会出现margin叠加,相反同个bfc下的元素则会产生margin叠加
ifc的运用主要再水平与垂直对齐上
- 水平居中:当一个块要在位置环境下水平对齐时,设置其为inline-block则会在外层产生ifc,通过text-align则可以使其水平居中,这个可以好理解
- 垂直居中: 创建一个ifc,用一个元素撑开垂直距离,其他行内元素则可以在此距离下通过设置vertical-align垂直居中,撑开元素可以用:after定义一个高度为容器100%的inline-block,来把该行line box‘撑开’
<div id='ifc1'>
<div id='middle-block'>形成了一个bfc,外界与其隔绝,同时此div又处于ifc环境</div>
</div>
<style> #ifc1 {background-color:#f2f2f2; height:200px; text-align:center;}
#middle-block { vertical-align:middle; display:inline-block;}
#ifc1:after{content:'';height:100%;width:0;display:inline-block;margin-left:-5px;font-size:0;vertical-align:middle;}
</style>
一个特殊的display属性: inline-block
根据bfc的定义,display为inline-block的元素是会产生bfc的,但值得注意的是,inline-block的元素又具有行内元素的特质,那它所在的环境是否参与ifc呢,让我们进行以下简单的测试:
- 将inline-block放入一个标准的ifc环境中:可以看出inline-block的元素遵循ifc的从左到右排布的原则
<div id='ifc'>this is another inline element
<span id='element1'>this is in ifc</span>
<div id='inline-block'>inline-block</div>
<a id='element3'>ifc-end</a>
</div>
<style>
#ifc { background-color:#f2f2f2;margin-top:50px;}
#inline-block{display:inline-block;background:#FF495F;}
</style>
- 然而奇怪的是inline-block并不遵循ifc的高度由元素真是高度决定的原则:span并没有撑开形成ifc环境块的高度,而inline-block则撑开了,当浏览器缩放到文字超过2行时,会发现inline-block撑开的其实是line box
<div id='ifc'>
this is another inline element,if you turn window short u will find inline-block resize the line box
<span id='element1'>this is in ifc</span>
<div id='inline-block'>inline-block</div>
<a id='element3'>ifc-end</a>
</div>
<style>
#ifc { background-color:#f2f2f2;margin-top:50px;}
#inline-block{display:inline-block;padding-top:20px;background:#FF495F;color:white;}
#element1{padding-top:40px;background:#4679BD;color:white;}
</style>
另外一个与inline-block相近的属性为inline-flex,都是以行内元素的方式排布但会撑开ifc。
Block formatting context & Inline formatting context(BFC&IFC)的区别(转载)的更多相关文章
- 在网页布局中合理使用inline formating context(IFC)
引子:给大家出一个小小的考题,如何使用css来实现类似下面的在指定区域内,内容自适应的垂直居中.
- CSS布局秘籍(1)-任督二脉BFC/IFC
01.CSS布局 1.1.正常布局流(Normal flow) 正常布局流 就是不做任何布局控制,按照HTML的顺序(从左到右,从上而下)进行布局排列.网页基于盒子模型进行正常的布局,主要特点: 盒子 ...
- CSS规范之BFC & IFC
元素是文档结构的基础,在CSS中,每个元素生成了一个包含了元素内容的框(box,也译为"盒子").但是不同的元素显示的方式会有所不同,例如<div>和<span& ...
- css3中的BFC,IFC,GFC和FFC(转载)
作者原文网址:http://www.cnblogs.com/dingyufenglian/p/4845477.html What‘s FC? 一定不是KFC,FC的全称是:Formatting C ...
- CSS 中的 BFC,IFC,GFC和FFC
原文网址:http://www.cnblogs.com/dingyufenglian/p/4845477.html What‘s FC? 一定不是KFC,FC的全称是:Formatting Conte ...
- css3中的BFC,IFC,GFC和FFC
出处:https://www.jianshu.com/p/e75f351e11f8 表格比较: 名称 英文全称 含义 BFC Block Formatting Contexts 块级格式化上下文 IF ...
- BFC,IFC,GFC,FFC
FC的全称是:Formatting Contexts,是W3C CSS2.1规范中的一个概念.它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用. ...
- 跟着9张思维导图学习Javascript js 关键字和保留字 css3中的BFC,IFC,GFC和FFC
跟着9张思维导图学习Javascript 学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将 po 出我收集的 9 张 javascript 相关的思维导图(非原创). 思维导图小ti ...
- css中margin重叠和一些相关概念(包含块containing block、块级格式化上下文BFC、不可替换元素 non-replaced element、匿名盒Anonymous boxes )
平时在工作中,总是有一些元素之间的边距与设定的边距好像不一致的情况,一直没明白为什么,最近仔细研究了一下,发现里面有学问:垂直元素之间的margin有有互相重叠的情况:新建一个BFC后,会阻止元素与外 ...
随机推荐
- mysql_connect() 不支持 请检查 mysql 模块是否正确加载
php的扩展 没有配置好! 打开php.ini文件: 搜索pdo_mysql和curl ;extension=php_curl.dll ;extension=pdo_mysql.dll 然后把2者前面 ...
- Teradata在大数据管理与分析领域连续18年评测排名第一
Gartner 魔力象限介绍 Gartner(高德纳)全球最具权威的IT市场研究与顾问咨询公司,他总是不停地推出IT行业的各种报告以及著名的Gartner魔力象限. Gartner魔力象限通常从两个方 ...
- 路飞学城Python-Day107
88-Ajax简介 Ajax是前端的JS技术,目前向服务器发送请求是通过1.向浏览器的地址栏发送请求的方式:2.form表单的请求方式是两种get和post方式:3.a标签的href属性对接地址 是一 ...
- 发现被坑了,从来没看到说java的Date一旦实例化时间就不会变了
java中使用Date对象获取系统当前时间,然而我就没看到哪篇教程告诉我说Date创建对象之后其中的时间是不会变的!!! 一开始我写了类似于下边这样的代码,希望每隔一段时间显示一次时间 Date d= ...
- NGUI学习随笔
一.NGUI的直接用法 1. Attach a Collider:表示为NGUI的某些物体添加碰撞器,如果界面是用NGUI做的,只能这样添加.(注:用Component添加无效). 2. ...
- node中exports和module.exports的关系及使用
在node中,需要记住,在使用exports和module.exports的时候,实际输出的是module.exports. exports指向module.exports,是module.expor ...
- BZOJ 3774 最优选择 (最小割+二分图)
题面传送门 题目大意:给你一个网格图,每个格子都有$a_{ij}$的代价和$b_{ij}$的回报,对于格子$ij$,想获得$b_{ij}$的回报,要么付出$a_{ij}$的代价,要么$ij$周围四联通 ...
- [LUOGU2730] 魔板
搜索水题.因为只有8个数,排列一共有40320种,直接bfs,判重就行了. 但是判重的时候直接用8进制表示的话要88的bool数组.这种操作太low了,于是我们可以用康托展开,降成8!. 康托展开其实 ...
- F - Truck History
F - Truck History #include<cstdio> #include<cstring> #include<iostream> #include&l ...
- JavaScript 中对变量和函数声明提前的演示样例
如题所看到的,看以下的演示样例(能够使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发人员工具,进入控制台console输入)(使用技巧: 控制台输入时Shift+Enter能够中途代码 ...