何为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)的区别(转载)的更多相关文章

  1. 在网页布局中合理使用inline formating context(IFC)

    引子:给大家出一个小小的考题,如何使用css来实现类似下面的在指定区域内,内容自适应的垂直居中.

  2. CSS布局秘籍(1)-任督二脉BFC/IFC

    01.CSS布局 1.1.正常布局流(Normal flow) 正常布局流 就是不做任何布局控制,按照HTML的顺序(从左到右,从上而下)进行布局排列.网页基于盒子模型进行正常的布局,主要特点: 盒子 ...

  3. CSS规范之BFC & IFC

    元素是文档结构的基础,在CSS中,每个元素生成了一个包含了元素内容的框(box,也译为"盒子").但是不同的元素显示的方式会有所不同,例如<div>和<span& ...

  4. css3中的BFC,IFC,GFC和FFC(转载)

    作者原文网址:http://www.cnblogs.com/dingyufenglian/p/4845477.html   What‘s FC? 一定不是KFC,FC的全称是:Formatting C ...

  5. CSS 中的 BFC,IFC,GFC和FFC

    原文网址:http://www.cnblogs.com/dingyufenglian/p/4845477.html What‘s FC? 一定不是KFC,FC的全称是:Formatting Conte ...

  6. css3中的BFC,IFC,GFC和FFC

    出处:https://www.jianshu.com/p/e75f351e11f8 表格比较: 名称 英文全称 含义 BFC Block Formatting Contexts 块级格式化上下文 IF ...

  7. BFC,IFC,GFC,FFC

    FC的全称是:Formatting Contexts,是W3C CSS2.1规范中的一个概念.它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用. ...

  8. 跟着9张思维导图学习Javascript js 关键字和保留字 css3中的BFC,IFC,GFC和FFC

    跟着9张思维导图学习Javascript   学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将 po 出我收集的 9 张 javascript 相关的思维导图(非原创). 思维导图小ti ...

  9. css中margin重叠和一些相关概念(包含块containing block、块级格式化上下文BFC、不可替换元素 non-replaced element、匿名盒Anonymous boxes )

    平时在工作中,总是有一些元素之间的边距与设定的边距好像不一致的情况,一直没明白为什么,最近仔细研究了一下,发现里面有学问:垂直元素之间的margin有有互相重叠的情况:新建一个BFC后,会阻止元素与外 ...

随机推荐

  1. mysql_connect() 不支持 请检查 mysql 模块是否正确加载

    php的扩展 没有配置好! 打开php.ini文件: 搜索pdo_mysql和curl ;extension=php_curl.dll ;extension=pdo_mysql.dll 然后把2者前面 ...

  2. Teradata在大数据管理与分析领域连续18年评测排名第一

    Gartner 魔力象限介绍 Gartner(高德纳)全球最具权威的IT市场研究与顾问咨询公司,他总是不停地推出IT行业的各种报告以及著名的Gartner魔力象限. Gartner魔力象限通常从两个方 ...

  3. 路飞学城Python-Day107

    88-Ajax简介 Ajax是前端的JS技术,目前向服务器发送请求是通过1.向浏览器的地址栏发送请求的方式:2.form表单的请求方式是两种get和post方式:3.a标签的href属性对接地址 是一 ...

  4. 发现被坑了,从来没看到说java的Date一旦实例化时间就不会变了

    java中使用Date对象获取系统当前时间,然而我就没看到哪篇教程告诉我说Date创建对象之后其中的时间是不会变的!!! 一开始我写了类似于下边这样的代码,希望每隔一段时间显示一次时间 Date d= ...

  5. NGUI学习随笔

    一.NGUI的直接用法 1.      Attach a Collider:表示为NGUI的某些物体添加碰撞器,如果界面是用NGUI做的,只能这样添加.(注:用Component添加无效). 2.  ...

  6. node中exports和module.exports的关系及使用

    在node中,需要记住,在使用exports和module.exports的时候,实际输出的是module.exports. exports指向module.exports,是module.expor ...

  7. BZOJ 3774 最优选择 (最小割+二分图)

    题面传送门 题目大意:给你一个网格图,每个格子都有$a_{ij}$的代价和$b_{ij}$的回报,对于格子$ij$,想获得$b_{ij}$的回报,要么付出$a_{ij}$的代价,要么$ij$周围四联通 ...

  8. [LUOGU2730] 魔板

    搜索水题.因为只有8个数,排列一共有40320种,直接bfs,判重就行了. 但是判重的时候直接用8进制表示的话要88的bool数组.这种操作太low了,于是我们可以用康托展开,降成8!. 康托展开其实 ...

  9. F - Truck History

    F - Truck History #include<cstdio> #include<cstring> #include<iostream> #include&l ...

  10. JavaScript 中对变量和函数声明提前的演示样例

    如题所看到的,看以下的演示样例(能够使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发人员工具,进入控制台console输入)(使用技巧: 控制台输入时Shift+Enter能够中途代码 ...