先看下面这个例子:
<div class="parent">
<div class="child"></div>
</div>
.parent{
background: bisque;
min-height: 20px;
border: 10px solid red;
}
.child{
width: 500px;
height: 300px;
padding: 3px;
background: blueviolet;
}
运行结果如下,子元素把父元素撑开,被父元素包裹在内部。

假设给子元素一个float,

可以看到子元素脱离了文档流,但我们仍然希望父元素包裹住子元素怎么办?
让父元素产生一个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 context;
- inline-level box:display 属性为 inline, inline-block, inline-table 的元素,会生成 inline-level box。并且参与 inline formatting context;
- run-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?
- 根元素自带隐藏BFC属性
- float属性不为none
- position为absolute或fixed
- display为inline-block, table-cell, table-caption, flex, inline-flex
BFC 特性(功能)
- 使 BFC 内部浮动元素不会到处乱跑;
- 和浮动元素产生边界。
BFC可以解决的问题:
1.(BFC与margin)同一个父级块框下,兄弟元素和父子元素的margin会发生重叠问题
2.(BFC与float)父元素高度塌陷问题、兄弟元素覆盖问题
BFC与margin
margin重叠的解决方法:让元素处于不同的BFC属性环境下。
兄弟元素
在同一个父级块框下,兄弟元素和父子元素的margin会发生重叠,并且这种重叠会遵循一定得规则:同号取大,异号相加。具体可以看看关于margin的介绍。传送门:CSS margin
兄弟元素的margin重叠的解决方法:任一个兄弟元素的属性设置如下:
float:left|right或者position:absolute|fixed或者display:inline-block|table-cell|table-caption

父子元素
父子元素的margin重叠解决方法:父元素设置以下任意属性:overflow:hidden|auto|scroll,或者给父元素设置padding或border属性。
如果元素没有垂直border或者padding,那么父元素的高度就是它包含的子元素的顶部和底部边框边缘之间的距离。因此,包含的子元素的顶部和底部外边距就突出到容器元素的外边。因此,可以通过添加垂直border或者padding,外边距就不会叠加了,而且父元素的高度就是它包含的子元素的顶部和底部外边距边缘之间的距离。
.father {
backgrund:blue;
width:500px;
height:50px;
margin-top:15px;
overflow:hidden; //padding:1px; //border:1px solid green;
}
.child {
height:30px;
width:500px;
background:pink;
margin-top:15px;
}


BFC与浮动
兄弟元素
在两个兄弟元素a和b中,如果a元素设置了float属性,b元素的布局会受到影响,此时a元素会覆盖在b元素上,如果b元素存在文字,那么文字会环绕a元素显示。
<div class="float"></div>
<div class="clearfloat">
没有设置overflow:hidden|auto|scroll;没有设置overflow:hidden|auto|scroll;没有设置overflow:hidden|auto|scroll;
</div>

<div class="float"></div>
<div class="clearfloat">
设置overflow:hidden|auto|scroll设置overflow:hidden|auto|scroll设置overflow:hidden|auto|scroll空空空空补充内容
</div>

使其中一个兄弟元素触发BFC之后就不会被其浮动元素覆盖,使用这种float+overflow的方式可以实现一侧固定,一侧自适应的布局效果。
父子元素
BFC与浮动如果针对父子元素,当然是解决父元素高度塌陷的问题了。
在W3C中指出 'Auto' heights for block formatting context roots。
也就是BFC会根据子元素的情况自动适应高度,即使其子元素中包括浮动元素。
给父元素设置以下任意属性,触发BFC隐藏属性: overflow:hidden|auto|scroll 、 position:absolute、float:left|right、display:inline-block
父元素触发BFC隐藏属性前
父元素触发BFC隐藏属性后
本文深入探讨了BFC(块级格式化上下文)的概念及其在CSS布局中的应用,包括解决margin重叠、浮动元素引起的布局问题等。通过理解Box与Formatting Context,读者将掌握如何利用BFC进行更高效的网页设计。
4253

被折叠的 条评论
为什么被折叠?



