BFC
一、margin塌陷问题
margin塌陷 和margin 合并是一个意思。在父子元素中,通过margin让父元素有一个margin-top的value,然后第一个子元素也有margin-top,那么有的时候这两个margin就会出现重叠。这就是margin塌陷的其中一种情况。
margin塌陷的情况:
- 父元素与第一个子元素合并/父元素与最后一个元素进行合并
- 相邻兄弟元素之间的合并问题
第一种情况,可以解决的方式有很多,比如说
- 设置父元素为BFC。
- 设置父元素的border-top
- 设置父元素的padding-top来解决问题
第二种情况:相邻元素之间的重叠问题
- 将每一个元素设置为bfc就可以了。
二、如何设置为BFC的问题
- 浮动元素(float:left、right、)
-
绝对定位元素(position:absolute fixed) -
Display: inline-block flex inline-flex -
Overflow :hidden scroll auto
================================>下面内容是于2021年10月15日更新的对于BFC这个问题的新的内容
一、常见的定位方案
在讲解BFC之前呢,我们先来了解一下常见的定位方案,定位方案是控制元素的布局,有三种常见的方案。
-
普通流
在普通流中,元素按照其在HTML中的先后位置至上而下布局,在这个过程中,行内元素排列,直到当前行被占满然后换行,块级元素则会被渲染为完整的新行,除非另外只当,否则所有元素默认都是普通流定位,可以说,普通流中元素的位置由该元素在HTML文档中的位置决定。
-
浮动(float)
在浮动布局中,元素首先会整体脱离普通流,然后根据浮动的方向尽可能的向左或者右边偏移,其效果于印刷排版中的文字环绕很是相似。
-
绝对定位(absulute position)
在绝对定位布局中,元素会整体脱离普通流,因此绝对定位元素不会对其兄弟元素造成影响,而元素的具体的位置由绝对定位的坐标决定。
二、BFC概念
Block Formatting Context ,它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。
那么到底什么是BFC呢?BFC叫做块级格式化上下文,它属于上述定位方案中的普通流。
具有BFC特征的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且BFC具有普通所没有的一些特征。通俗来说就是,BFC是一个封闭的大箱子,箱子内部的元素如何翻江倒海,都不会影响到箱子外面的内容。
三、触发BFC
主要元素满足下面任何一条就可以触发 BFC 特征
- body 根元素
- 浮动元素:float 除了 none 以外的值
- 绝对定位元素:position(absolute,fixed)
- display为inline-block、table-cells、flex
- overflow除了visible 以外的值(hidden、auto、scroll)
四、BFC特性及应用
1.同一个BFC下外边距会发生折叠
<style>
div{
width:100px;
height:100px;
background:lightblue;
margin:100px;
}
</style>
<body>
<div></div>
<div></div>
</body>
这样的话,两个div之间的间隔是100px,然而每一个都有100px的margin,他们应该有200px的间隔。事实上他们之间发生了折叠,导致他们之间只有100px的距离。这不是CSS的bug,我们可以理解为一种规范,如果想要避免外边距的重叠,可以将其放在不同的BFC容器中。
<style>
.container{
overflow:hidden
}
p{
width:100px;
height:100px;
background:lightblue;
margin:100px;
}
</style>
<div class = "container">
<p></p>
</div>
<div class = "container">
<p></p>
</div>
这样两个div之间就不会相互影响了,他们之间就不会发生margin的折叠了,这样他们之间就会有200px的距离了。
2.BFC可以包含浮动元素,这样就可以解决因为元素浮动而造成的高度塌陷问题。
<style>
.root{
border:5px solid blue;
width:300px;
}
.child{
border:5px solid red;
float:left;
width:100px;
height:100px;
}
</style>
<body>
<div class="root">
<div class="child child1"></div>
<div class="child child2"></div>
</div>
</body>
这样的情况下,root div的高度就是0,然后内部的每一个float元素都浮动到元素之外,造成高度高度塌陷问题。然后我们可以将root div设置为一个BFC,然后就可以将float元素包裹在内部了。
.root{
overflow:hidden;
}
3.BFC元素可以阻止元素被浮动元素覆盖
<div style="height: 100px;width: 100px;float: left;background: lightblue">我是一个左浮动的元素</div>
<div style="width: 200px; height: 200px;background: #eee">我是一个没有设置浮动,
也没有触发 BFC 元素, width: 200px; height:200px; background: #eee;</div>
这是一个文字环绕效果:
这时候其实第二个元素有部分浮动被浮动元素所覆盖,(但是文本信息不会被浮动元素所覆盖)如果想要避免元素被覆盖的话,可以出发第二个元素的BFC特性,在第二个元素的BFC中加入 overflow:hidden,就会变成
这个方法很适合去实现两列自适应布局。这个时候左侧宽度固定,右边的内容自适应宽度。