有遇到过margin重叠/塌陷问题吗?BFC?

文章介绍了CSS中margin塌陷的现象及原因,解释了BFC(块级格式化上下文)的概念及其六大特性,如何触发BFC,以及如何利用BFC解决margin塌陷和布局问题。此外,还提到了解决margin塌陷的其他方法,如使用padding、透明边框、伪元素等。
摘要由CSDN通过智能技术生成

目录

1、什么是 margin重叠/塌陷?

2、开发中常见的margin塌陷 

3、出现margin塌陷的原因 

4、什么是BFC ?

5、BFC的6个特性

6、BFC的功能总结 

7、触发BFC的CSS属性

8、解决margin塌陷的办法

① 对于父子元素

② 对于兄弟元素


1、什么是 margin重叠/塌陷?

margin重叠(又称margin塌陷):文档流内,块级元素与块级元素垂直方向上的 margin 合并(塌陷)为单个 margin,且只发生在垂直方向。


inline 元素不存在 margin 塌陷,因为inline元素不占有外边距,同样道理 float 元素也不存在margin 合并。

2、开发中常见的margin塌陷 

实际问题:

有两个盒子,上盒子外边距100px,下盒子外边距20px,那最后它们的边距是多少?

如果换成水平方向呢?它们之间的间距是多少?

答案:

垂直方向:100px;     水平方向:120px;

解析:

垂直情况,谁的”margin-方向“最大,那距离就等于谁;

垂直方向计算规则: 正正取大值,正负值相加,负负最小值

水平情况下,它们之间的距离等于它们所设置的外边距之和。

3、出现margin塌陷的原因 

出现margin塌陷的原因:很久以前是为了解决多文本段落排版的问题;

设想,当我们上下排列一系列规则的块级元素(如段落P)时,那么块元素之间因为外边距重叠的存在,段落之间就不会产生双倍的距离。

4、什么是BFC ?

文档:区块格式化上下文 - Web 开发者指南 | MDN

BFC:

BFC (Block Formatting Context)(块级格式化上下文)是一个完全独立的空间(布局环境),独立的渲染区域,让空间里的子元素不受外面布局影响

BFC 类似一个“结界”,如果一个 DOM 元素具有 BFC,那么它内部的子元素不会影响外面的元素;外面的元素也不会影响到其内部元素。

BFC是隔离了的容器,所以BFC可以用来解决margin塌陷。

5、BFC的6个特性

BFC特性:

① 属于同一个 BFC 的两个相邻容器的上下 margin 会重叠(重点)

② 计算 BFC 高度时浮动元素也参于计算(重点)

③ BFC 的区域不会与浮动容器发生重叠(重点)

④ BFC 内的容器在垂直方向依次排列

⑤ 元素的 margin-left 与其包含块的 border-left 相接触

⑥ BFC 是独立容器,容器内部元素不会影响容器外部元素

 例子:

<div style="width:60px; height:60px;">
    <div style="margin:20px; width:20px; height:20px;"></div>
</div>

以上两个盒子产生的布局效果:内部盒子并不居中,而是上边框紧贴着外部盒子。

对外部盒子采用BFC规则⑤,可以解决问题。

方法之一:在父元素上增加一个overflow:auto样式。

  <div style="width:60px; height:60px; background: red; overflow: auto">
    <div style="margin:20px; width:20px; height:20px; background: green"></div>
  </div>

更改之后:上面的两个盒子布局,由于外部是BFC元素,所以内部盒子会完全居中显示

6、BFC的功能总结 

① 可以利用BFC解决两个相邻元素的上下margin重叠问题;


② 可以利用BFC解决高度塌陷问题;


③ 可以利用BFC实现多栏布局(两栏、三栏、圣杯、双飞翼等)

7、触发BFCCSS属性

① 块级元素 overflow: 【非visible】为auto、scroll、hidden

② display: inline-block、table-cell、table-caption、table、table-row、table-row-groutable-header-group、table-footer-group、inline-table、flow-root、flex 或 inline-flex、grid 或 inline-grid

③ position: absolute、fixed

④ float:非none

⑤ 根元素(<html>)

⑥ contain 值为 layout、content 或 paint 的元素

⑦ 多列容器(column-count 或 column-width (en-US) 值不为 auto,包括 column-count 为 1)

8、解决margin塌陷的办法

① 对于父子元素

① 子元素取消margin,用父元素的padding代替

② 父元素增加透明边框 border:1px solid transparent 

// 这是基于最上面说的(其间没有任何非空内容、补白、边框)原理实现。

③ 父元素设置为BFC

④ 父元素增加一个伪元素

② 对于兄弟元素

① 父元素flex布局,触发BFC,创建隔离的容器

② 子元素浮动定位,父元素清除浮动

③ 让其中一个兄弟元素触发BFC

原理:使得原本属于同一个BFC的两个兄弟元素,变成不同的BFC

9、优秀文章

CSS中的BFC详细讲解(易懂)_css bfc-CSDN博客 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值