前几天看到kejun‘s blog里面的一篇文章:“近期面试感受”, 里面提到面试时的一道题的不同的解决方案,比较它们之间的优缺点,其中出现了一个概念:Block Formatting Contexts(块级格式化上下文),而我一点印象都没有,所以就找了一些相关的文章学习一下,看到一篇很好的文章,所以就翻译出来和大家共享一下。原 文是:Block Formatting Contexts

一个块级格式化上下文是满足以下条件中至少一条的盒模型:

  • float的值不为空
  • overflow的值不为visible
  • display的值是table-cell、table-caption或者inline-block之一
  • position的值不为static或者relative

当谈到视觉格式模型(visual formatting model,针对可视化媒体,用户代理如何处理DOM树),块级格式化上下文发挥着巨大的作用。所以对于CSS编程人员来说,深刻的理解块级格式化上下文和flow、float、clear、margin的关系至关重要。

先看一下有关BFC的规则或者定义

块级格式化上下文如何浮动

块级格式化上下文的定位方案(positioning scheme)属于普通流(normal flow)。块级格式化上下文中的块是通过页面流中的块级元素、行内元素的行内格式化、块级元素或者行内元素的相对定位以及将元素定位为run-in来定位的。简言之,块级格式化上下文就是页面流的一部分。

怎样触发块级格式化上下文

以下方法可以创建新的块级格式化上下文:

  • floats
  • 元素的绝对定位
  • inline-blocks
  • table-cells
  • table-captions
  • 给元素添加overflow样式,并且值不为visible

但是根据CSS3标准,当以下条件符合的时候就会创建块级格式化上下文:

position的值不是static或者relative(见【CSS3POS】)

这个定义意味着当position为fixed的时候也会创建新的块级格式化上下文。参照标准,一个绝对定位的元素就暗示着这个元素的position属性值为absolute或者fixed。

请注意display:table本身不会创建块级格式化上下文。但是由于它可以产生匿名盒(anonymous boxes),而匿名盒中的display:table-cell可以创建新的块级格式化上下文。换句话说,触发块级格式化上下文的是匿名盒,而不是 display:table。编程人员需要铭记于心的是,虽然这两种样式都能够创建新的块级格式化上下文(间接的或者直接的),但是 display:table的clear却和display:table-cell的clear效果不一样。

最后一个触发块级格式化上下文的是fieldset元素。奇怪的是,www.w3.org里没有任何有关这个触发行为的信息,直到HTML5标准里才出现。有些浏览器bugs(Webkit,Mozilla)提到过这个触发行为,但是没有任何官方声明。实际上,即使fieldset在大多数的浏览器上都能创建新的块级格式化上下文,开发者也不应该把这当做理所当然的:

CSS 2.1没有定义哪种属性适用于表单控件和相框,也没有定义如何使用CSS来给它 们添加样式。用户代理可能会给这些属性应用CSS属性,建议开发者们把这种支撑 当做实验性的。更高版本的CSS可能会进一步规定这个。

块级格式化上下文都做些什么

由于块级格式化上下文的流动方式,所以它包含了浮动,这样可以阻止外边距叠加和浮动重叠:

在块级格式化上下文中,盒(boxes)都是从一个包含块的顶部开始,垂直的一个接一个排列着。两个兄弟元素之间的垂直距离由margin属性来决定的。在块级格式化上下文中,相邻的块元素之间的垂直外边距会产生叠加。

在块级格式化上下文中,每个框(box)的左外边缘挨着包含块的左边(如果是从右往左格式化,情况正好相反)。哪怕存在浮动也会如此,除非这个框(box)创建了一个新的块级格式化上下文(这种情况下,这个框会由于浮动而变窄)。

说了这么多规则之后,在现实世界中这意味着什么?

块级格式化上下文或多或少有点像其他的块框(block box),除了下面这些例外:

块级格式化上下文会阻止外边距叠加

仅当两个相邻的块框在同一个块级格式化上下文中时,它们之间垂直方向的外边距才会叠加。换句话说,如果这两个相邻的块框不属于同一个块级格式化上下文,那么它们的外边距就不会叠加。

例如:

This is a paragraph inside a DIV with a blue background, styled with margin:20px

This is a paragraph inside a DIV with a blue background, styled with margin:20px.

This is a paragraph inside a DIV with a blue background, it is styled with margin:20px, The parent DIV is styled with overflow:hidden;zoom:1.

在上面的前两个框中,第一个框的底部外边距和第二个框的顶部外边距叠加在了一起(它们之间的间距是20px而不是40px),但是由于最后一个 DIV创建了一个新的块级格式化上下文,第三段的外边距并没有叠加,因此外边距没有超出段落所在的容器,而是成为了这个块框的一部分。

注意:在IE6中,如果没有明确的margin值,DIV将无法附上margin属性。

当谈到外边距叠加时,创建一个新的块级格式化上下文的作用是和给这个元素添加border或者padding属性是一样的。

块级格式化上下文包含浮动

我相信你应该听过这句话:“ a float always contains floats”,或者可能听过FNE方法。但是,这个方法的基础则是浮动是块级格式化上下文,所以用一种比较好的方式来表达这个就是“块级格式化上下文通常包含浮动”。

例如:

This paragraph is a float inside a DIV with a blue background, it is styled with margin:20px.

This paragraph is a float inside a DIV with a blue background, it is styled with margin:20px. The parent DIV is styled with overflow:hidden;zoom:1.

第一个段落是个浮动的段落,所以它从流中移除了并且它所在的容器叠加在了一起,所以它所在的容器背景并没有显示出来。

第二个段落也是一个浮动的段落,但是它的内部包含了一个可以创建新的块级格式化上下文的DIV,因此这个容器附上了它子节点的margin属性。你 应该注意到,和第一个段落不一样的是,没有必要来清除前一个框的浮动。通常把这个称作“自我清除”(self-clearing),考虑到块级格式化上下 文是普通流的一部分,self-clearing将非常有意思。

注意clear仅仅清除同一个块级格式化上下文里的浮动。

块级格式化上下文不会重叠浮动元素

这个是我最喜欢的。根据规定,一个块级格式化上下文的边框不能和它里 面的元素的外边距重叠。这就意味着浏览器将会给块级格式化上下文创建隐式的外边距来阻止它和浮动元素的外边距叠加。由于这个原因,当给一个挨着浮动的块级 格式化上下文添加负的外边距时将会不起作用(Webkit和IE6在这点上有一个问题——可以看这个测试用例)。

例如:

.sideBar { background: skyBlue; float: left; width: 180px; }
.sideBar { background: yellow; float: right; width: 180px; }
#main { background: pink; overflow: hidden; zoom: 1; border: 5px solid teal; }

由于这个行为依附于有边框的框(border box)而不是有外边距的框,为了创建粉红色框和它兄弟框的间距(例如一个20px的间距),编程人员需要做下面两件事情中的任何一个:

  • 给浮动元素设置一个20px的外边距
  • 将粉红色框的外边距设置的比浮动元素的宽度大一点(例如:margin:0 220px)

是的,你会使用220px而不是20px。因为是有边框的框要试着处在两个浮动元素之间而不是有外边距的框。上句中的“试着”是因为如果这两个浮动元素之间没有足够的空间,那么这个容器就要下沉。

换句话说,如果粉红色的框设置了一个400px的宽度,那么当它的父容器小于770px(180px+180px+400px+10px)时,这个 框就会下沉。在少数情况下,在Firefox(至少在v.3.5.9中)中,这种行为将会被打破(例如,当上面的这个结构是body元素的第一个子节点时 —看测试用例)。

注意:在IE6中,粉红色框和两个浮动元素之间的显示的空间是由于IE中的3像素文本偏移的bug。

hasLayout和BFC

正如你已经注意到的,前面的所有的例子都用了样式:overflow:hidden;zoom:1。第一个声明是为了在现代浏览器中创建一个块级格式化上下文,而第二个声明则是为了触发IE(IE5.5/6/7)的hasLayout。这是因为那些渲染都很相近(CSS规则的相似处)。就像块级格式化上下文一样,给元素一个布局似乎可以防止外边距叠加,也可以包含浮动和防止叠加浮动。

可以给元素添加布局的属性或者声明

下面的清单显示了创建一个新的块级格式化上下文的同时也触发hasLayout的属性,至少这些属性会被浏览器支持,除了IE6或更低版本不支持overflow。

在IE5和6中:

  • position:absolute
  • position:fixed
  • float:除了none的任何值
  • display:inline-block
  • width:除了outo之外的任何值
  • height:除了auto之外的任何值
  • zoom:除了normal之外的任何值
  • writing-mode:tb-rl
  • -ms-writing-mode:tb-rl

在IE7中:

  • min-width:任何值
  • min-height:任何值
  • max-width:除了none之外的任何值
  • max-height:除了none之外的任何值
  • 添加了overflow样式的元素,并且overflow的值不为visible
  • overflow-x、overflow-y:除了visible之外的任何值

需要考虑的事:

  • zoom和writing-mode是IE专有的属性,并且无法通过验证。
  • IE5.0不支持zoom
  • 仅当width和height属性应用到行内元素时才会触发hasLayout(例如在IE6怪异模式下)
  • overflow-x和overflow-y是CSS盒模型模块的一部分
  • 当布局流和父布局流不同时也会触发hasLayout

在怪异模式和IE7模式中

  • 当overflow设置的值不为visible时,table-cell元素不会创建新的块级格式化上下文
  • 当overflow的值为visible时,table-cell元素会创建一个新的块级格式化上下文。

HTML元素通常都会有布局:

在IE中,下面的元素默认情况下会有一个布局:

  • <body>(就像严格模式里的<html>一样)
  • <table>,<tr>,<th>,<td>
  • <img>
  • <hr>
  • <input>,<button>,<select>,<textarea>,<fieldset>,<legend>
  • <iframe>,<embed>,<object>,<applet>
  • <marquee>

总结

为了减少现代浏览器和IE(<8)之间的问题,编程人员可以给框(box)一个布局来创建新的块级格式化上下文。在这种情况下,流式相同的, 元素也是通过相同的方式清除浮动,clear也是清除相同的浮动,外边距也像预期的那样叠加。同时,编程人员在通过触发hasLayout的方式来给框添 加样式时必须留意因为这种添加样式的方法可能使那个元素变成新的块级格式化上下文。

转载自:http://jeehon.info/log/2011/11/11/block-formatting-contexts%E5%9D%97%E7%BA%A7%E6%A0%BC%E5%BC%8F%E5%8C%96%E4%B8%8A%E4%B8%8B%E6%96%87/

转载于:https://www.cnblogs.com/ginowang42/archive/2011/12/06/2278003.html

Block Formatting Contexts(块级格式化上下文)相关推荐

  1. 点击箭头 切图 html,项目切图规范 css精灵图 css小箭头代码 BFC (Block Formatting Context) 块级格式化上下文...

    项目切图规范 PS常用工具 移动工具 移动工具主要负责图层.选区.等的移动.复制操作. 快捷键:v 抓手工具 快捷键:h 空格 + 鼠标左键拖动,空格键可临时转换为抓手工具. 放大镜工具 放大镜工具可 ...

  2. 常规流之块级格式化上下文(Block Formatting Contexts)

    在css2.1中,常规流包括块框(block boxes)的块格式化(block formatting),行内框(inline boxes)的行内格式化(inline formatting),块级框( ...

  3. 块级格式化上下文(Block Formatting Context)

    前言 在 CSS 2.1 中,有三种定位方案--普通流 (Normal Flow) .浮动 (Floats) 和绝对定位 (Absolute Positioning) ,下面分别对这三种布局简略说明一 ...

  4. 对 BFC 规范(块级格式化上下文:block formatting context)的理解?

    相关知识点: 块格式化上下文(Block Formatting Context,BFC)是Web页面的可视化CSS渲染的一部分,是布局过程中生成块级盒 子的区域,也是浮动元素与其他元素的交互限定区域. ...

  5. CSS中块级格式化上下文(BFC)的特性与应用

    一.何为BFC 块级格式化上下文(Block Formatting Context)是网页CSS视觉渲染的一部分,并用于决定盒子的布局.在定位体系中属于常规流(Normal Flow)(另外两种定位体 ...

  6. CSS进阶(2)- 块级格式化上下文

    本系列笔记是基于[渡一教育]袁进老师的html+css基础课程而记录,仅作为个人记录以及阅读使用. 文章目录 块级格式化上下文 常规流块盒的布局的一些规则 BFC渲染区域 BFC的独立性 BFC的具体 ...

  7. 关于对CSS中BFC (块级格式化上下文) 的理解

    转自: https://www.thinktxt.com/web-front/2017/02/18/css-bfc-layout-model.html 也许你已经掌握了HTML.CSS的基本布局技能, ...

  8. 一个div 上下两行_web前端工程师如何理解 CSS 布局和块级格式化上下文

    CSS是web前端中的重要内容,很多初学者在学习CSS时都会遇到各种各样的问题,今天就给大家分享web前端开发如何理解CSS不惧和块级格式化上下文.也许你从未听说过这个术语,但是如果你曾经用 CSS ...

  9. BFC(块级格式化上下文)【面试】

    BFC(块级格式化上下文) 块级格式化上下⽂,是⼀个独⽴的渲染区域,让处于 BFC 内部的元素与外部 的元素相互隔离,使内外元素的定位不会相互影响. IE下为 Layout ,可通过 zoom:1 触 ...

最新文章

  1. 基于网络监听方式的电子邮件实现基础
  2. 推荐系统(1)--splitting approaches for context-aware recommendation
  3. json格式输出数组隐藏键值方法
  4. struts2类型转换+校验
  5. 清除ASP.Net缓存
  6. Spring集成activeMQ
  7. Linux 数据处理
  8. 同样是程序员,为什么别人比你更优秀?
  9. Java的Redis连接池代码
  10. DTD与XML的关系。。说的不错,拿来看看,学习了
  11. 【竞赛篇-国创(大创)申报书撰写(三大类别七千字总结建议)】国家级大学生创新创业训练计划申报书撰写经验分享
  12. 多组两两比较用什么检验方法_SPSS教程:多个组比较(Fisher精确检验)及组间两两比较...
  13. Makefile 速成
  14. Mysql 临时表详解(temporary table)
  15. 我的世界中国版服务器家园系统,《我的世界》中国版“暑期更新”上线 家园系统休闲玩法亮点...
  16. C++20协程初探!
  17. Swift - 设置UILabel、UITextView的文字行间距
  18. 2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 Apare_xzc
  19. 做wish用多大的虚拟服务器,虚拟海外仓适应于wish,ebay,速卖通,自营平台
  20. npm安装webpack时,报错npm WARN ajv-keywords@3.1.0 requires a peer of ajv@^6.0.0 but none is installed.

热门文章

  1. sample语言词法分析_Go 译文之词法分析与解析 Part Three
  2. 遇到一个valgrind自身的bug
  3. 拉起支付宝个人转账填备注_支付宝转错钱给别人,我居然要回来了!
  4. 【Flink】FLink 通讯组件 Akka与Actor 模型
  5. 【Kafka】Kafka使用代码设置offset值
  6. 10-10-010-简介-重要概念背诵
  7. 05-不是内部或外部命令,也不是可运行的程序或批处理文件
  8. 【git】git如何添加本地不是git的项目到Git库中
  9. List、Map、Set 三个接口,存取元素时的特点
  10. 手写一个HTTP图片资源服务器,太容易了叭!