1.边距重叠示例
- 父子元素边距重叠
<section id="sec">
<style media="screen">
#sec{
background-color: red;
}
.child{
height: 100px;
margin-top: 10px;
background: yellow;
}
</style>
<article class="child"></article>
</section>
问题:有时当我们设置子元素的margin-top,但是却发现子元素没有出现上外边距的效果,反而是父元素出现了上外边距的效果。
原因:边距重叠,一个盒子和其子孙的边距重叠。根据规范,一个盒子如果没有添加BFC,那么它的上边距应该和其文档流中的第一个子元素的上边距重叠。
- 兄弟元素边距重叠
<section id="margin">
<style>
#margin{
background-color: pink;
overflow:hidden;
}
#margin>p{
margin: 5px auto 25px;
background-color: red;
}
</style>
<p>1</p>
<p>2</p>
<p>3</p>
</section>
此处粉色间距均为25px。
问题:某元素A下边距25px,其兄弟元素B上边距5px,则二者合并为25px(取最大值)。
原因:兄弟元素边距重叠,取重叠部分最大值。
- 与float元素内容重叠
<section id="layout">
<style>
#layout{
background-color: red;
}
#layout .left{
float:left;
width: 100px;
height: 100px;
background-color: purple;
}
#layout .right{
height: 110px;
background-color: #ccc;
}
</style>
<div class="left"></div>
<div class="right"></div>
</section>
问题:右侧元素.right
把背景色红色覆盖。
原因:右侧元素.right
与左侧浮动元素.left
的box重叠。
2.BFC解决边距重叠问题
BFC定义:
BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。
- 解决父子元素边距重叠
<!-- BFC解决父子元素边距重叠的问题 -->
<section id="sec">
<style media="screen">
#sec{
background-color: #f00;
overflow: hidden; <!--BFC-->
}
.child{
height: 100px;
margin-top: 10px;
background: yellow;
}
</style>
<article class="child"></article>
</section>
原理:BFC在页面上是一个独立的容器,父子/外部内部互不影响。
- 解决兄弟元素边距重叠
<!-- BFC解决兄弟元素边距重叠的问题 -->
<section id="margin">
<style>
#margin{
background-color: pink;
overflow:hidden;
}
#margin>p{
margin: 5px auto 25px;
background-color: red;
}
.new{
margin: 5px auto 25px;
background-color: red;
}
</style>
<p>1</p>
<!-- 解决垂直方向边距重叠,增加父元素并设置overflow属性为hidden -->
<div style="overflow:hidden">
<p class="new">2</p>
</div>
<p>3</p>
</section>
粉色边距由上至下依次为5,30,30,25。
原理:BFC垂直方向边距不会发生重叠。
- 解决与float元素内容重叠
<!-- BFC元素不与float元素的内容重叠 -->
<section id="layout">
<style>
#layout{
background-color: red;
}
#layout .left{
float:left;
width: 100px;
height: 100px;
background-color: purple;
}
#layout .right{
height: 110px;
background-color: #ccc;
overflow: auto; /* 创建BFC ,利用BFC元素不与float元素内容重叠 */
}
</style>
<div class="left"></div>
<div class="right"></div>
</section>
原理:BFC区域不会与浮动元素的box重叠。
- BFC子元素即使是float也会参与高度计算
<section id="float">
<style>
#float{
background-color: purple;
overflow:auto; /* 设置BFC清除浮动 */
/* float:left; */
}
#float .float{
float: left;
font-size:30px;
}
</style>
<div class="float">我是浮动元素</div>
</section>
原理:计算BFC高度时,浮动子元素也会参与运算。
创建BFC的方法:
-
overflow
: hidden/scroll/auto(不为visible) -
float
不为none -
position
为absolute或者fixed -
display
为inline-block、table、table-cell、table-caption、flex、inline-flex。
BFC的使用场景:
- 解决边距重叠问题;
- 清除浮动(计算BFC高度时,浮动子元素参与计算);
- 避免某元素被浮动元素覆盖(兄弟元素中有高度不一的浮动元素,不占位);
- 避免多列布局由于宽度计算四舍五入而自动换行
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。