襄阳建设21网站,爱有声小说网站捡个校花做老婆,专业番禺网站建设,wordpress助手爱奇艺BFC 已经是一个耳听熟闻的词语了#xff0c;网上有许多关于 BFC 的文章#xff0c;介绍了如何触发 BFC 以及 BFC 的一些用处#xff08;如清浮动#xff0c;防止 margin 重叠等#xff09;。虽然我知道如何利用 BFC 解决这些问题#xff0c;但当别人问我 BFC 是什么… BFC 已经是一个耳听熟闻的词语了网上有许多关于 BFC 的文章介绍了如何触发 BFC 以及 BFC 的一些用处如清浮动防止 margin 重叠等。虽然我知道如何利用 BFC 解决这些问题但当别人问我 BFC 是什么我还是不能很有底气地解释清楚。于是这两天仔细阅读了CSS2.1 spec 和许多文章来全面地理解BFC。 一、BFC是什么 在解释 BFC 是什么之前需要先介绍 Box、Formatting Context的概念。 Box: CSS布局的基本单位 Box 是 CSS 布局的对象和基本单位 直观点来说就是一个页面是由很多个 Box 组成的。元素的类型和 display 属性决定了这个 Box 的类型。 不同类型的 Box 会参与不同的 Formatting Context一个决定如何渲染文档的容器因此Box内的元素会以不同的方式渲染。让我们看看有哪些盒子 block-level box:display 属性为 block, list-item, table 的元素会生成 block-level box。并且参与 block fomatting contextinline-level box:display 属性为 inline, inline-block, inline-table 的元素会生成 inline-level box。并且参与 inline formatting contextrun-in box: css3 中才有 这儿先不讲了。 Formatting context Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域并且有一套渲染规则它决定了其子元素将如何定位以及和其他元素的关系和相互作用。最常见的 Formatting context 有 Block fomatting context (简称BFC)和 Inline formatting context (简称IFC)。 CSS2.1 中只有 BFC 和 IFC, CSS3 中还增加了 GFC 和 FFC。 BFC 定义 BFC(Block formatting context)直译为块级格式化上下文。它是一个独立的渲染区域只有Block-level box参与 它规定了内部的Block-level Box如何布局并且与这个区域外部毫不相干。 BFC布局规则 内部的Box会在垂直方向一个接一个地放置。Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠每个元素的margin box的左边 与包含块border box的左边相接触(对于从左往右的格式化否则相反)。即使存在浮动也是如此。BFC的区域不会与float box重叠。BFC就是页面上的一个隔离的独立容器容器里面的子元素不会影响到外面的元素。反之也如此。计算BFC的高度时浮动元素也参与计算二、哪些元素会生成BFC? 根元素float属性不为noneposition为absolute或fixeddisplay为inline-block, table-cell, table-caption, flex, inline-flexoverflow不为visible三、BFC的作用及原理 1. 自适应两栏布局 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 style body { width: 300px; position: relative; } .aside { width: 100px; height: 150px; float: left; background: #f66; } .main { height: 200px; background: #fcc; } /style body div classaside/div div classmain/div /body 页面 根据BFC布局规则第3条 每个元素的margin box的左边 与包含块border box的左边相接触(对于从左往右的格式化否则相反)。即使存在浮动也是如此。 因此虽然存在浮动的元素aslide但main的左边依然会与包含块的左边相接触。 根据BFC布局规则第四条 BFC的区域不会与float box重叠。 我们可以通过通过触发main生成BFC 来实现自适应两栏布局。 1 2 3 .main { overflow: hidden; } 当触发main生成BFC后这个新的BFC不会与浮动的aside重叠。因此会根据包含块的宽度和aside的宽度自动变窄。效果如下 2. 清除内部浮动 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 style .par { border: 5px solid #fcc; width: 300px; } .child { border: 5px solid #f66; width:100px; height: 100px; float: left; } /style body div classpar div classchild/div div classchild/div /div /body 页面 根据BFC布局规则第六条 计算BFC的高度时浮动元素也参与计算 为达到清除内部浮动我们可以触发par生成BFC那么par在计算高度时par内部的浮动元素child也会参与计算。 代码 1 2 3 .par { overflow: hidden; } 效果如下 ? 3. 防止垂直 margin 重叠 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 style p { color: #f55; background: #fcc; width: 200px; line-height: 100px; text-align:center; margin: 100px; } /style body pHaha/p pHehe/p /body 页面 两个p之间的距离为100px发送了margin重叠。 根据BFC布局规则第二条 Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠 我们可以在p外面包裹一层容器并触发该容器生成一个BFC。那么两个P便不属于同一个BFC就不会发生margin重叠了。 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 style .wrap { overflow: hidden; } p { color: #f55; background: #fcc; width: 200px; line-height: 100px; text-align:center; margin: 100px; } /style body pHaha/p div classwrap pHehe/p /div /body 效果如下: 总结 其实以上的几个例子都体现了BFC布局规则第五条 BFC就是页面上的一个隔离的独立容器容器里面的子元素不会影响到外面的元素。反之也如此。 因为BFC内部的元素和外部的元素绝对不会互相影响因此 当BFC外部存在浮动时它不应该影响BFC内部Box的布局BFC会通过变窄而不与浮动有重叠。同样的当BFC内部有浮动时为了不影响外部元素的布局BFC计算高度时会包括浮动的高度。避免margin 本文出处【http://www.cnblogs.com/lhb25/】 以下来源于《HTML 5 移动Web开发实战详解》 林珑 著 BFC的元素可以当做一个密闭的大箱子箱子外部的元素不与箱子内部的元素产生作用此时在这个BFC元素内的元素有如下的特征1、外边距将不再与上下文之外的元素折叠2、其内可以包含浮动元素3、可以组织浮动元素被覆盖4、框会一个接一个地被垂直放置它们的起点是一个包含快的顶部。即BFC中的文字将不会环绕邻接的浮动盒子排布而是竖直排布因为行框将会一个接一个的垂直放置如何触发BFC1、浮动元素浮动元素本身形成一个BFC2、绝对定位元素3、行内块元素(display:inline-block)4、表格单元格和标题(display:table-cell或display:table-caption)5、overflow为非visible的元素转载于:https://www.cnblogs.com/wpbars/p/5955033.html