马轩

个人主页

欢迎来到我的个人站~


BFC

BFC

一、margin塌陷问题

margin塌陷 和margin 合并是一个意思。在父子元素中,通过margin让父元素有一个margin-top的value,然后第一个子元素也有margin-top,那么有的时候这两个margin就会出现重叠。这就是margin塌陷的其中一种情况。

margin塌陷的情况:

  1. 父元素与第一个子元素合并/父元素与最后一个元素进行合并
  2. 相邻兄弟元素之间的合并问题

第一种情况,可以解决的方式有很多,比如说

  1. 设置父元素为BFC。
  2. 设置父元素的border-top
  3. 设置父元素的padding-top来解决问题

第二种情况:相邻元素之间的重叠问题

  1. 将每一个元素设置为bfc就可以了。

二、如何设置为BFC的问题

  1. 浮动元素(float:left、right、)
  2. 绝对定位元素(position:absolute fixed)
  3. Display: inline-block flex inline-flex
  4. 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>

image-20211015142411846

这样的话,两个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>

image-20211015143236240

这样两个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>

image-20211015144148387

这样的情况下,root div的高度就是0,然后内部的每一个float元素都浮动到元素之外,造成高度高度塌陷问题。然后我们可以将root div设置为一个BFC,然后就可以将float元素包裹在内部了。

.root{
	overflow:hidden;
}

image-20211015144556994

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>

这是一个文字环绕效果:

image-20211015144932324

这时候其实第二个元素有部分浮动被浮动元素所覆盖,(但是文本信息不会被浮动元素所覆盖)如果想要避免元素被覆盖的话,可以出发第二个元素的BFC特性,在第二个元素的BFC中加入 overflow:hidden,就会变成

image-20211015145207078

这个方法很适合去实现两列自适应布局。这个时候左侧宽度固定,右边的内容自适应宽度。

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦