CSS 盒子的边距塌陷
tip:为能更直观地学习,本文章已省略部分 css 样式代码。
我相信下面的情形大家在日常工作中常常碰到:在制作静态页面中,为了页面整体的协调与美观,我们想让子盒子 image-div 的上边沿距离父盒子 header-div 的上边沿有一定间距。
现页面效果:
文章图片
目标页面效果:
文章图片
为了达成上图的效果,我们首先就能想到给子盒子设置一个上外边距:
.image-div {/*子盒子*/
margin-top:25px;
}
让我们来看看结果如何呢?
文章图片
结果和我们所预料的并不相同,子盒子 image-div 并没有和父盒子 header-div 的上边沿形成一定的间距。这两个盒子竟然一起往下移动了,多出了红框区域。
而这种现象,就是 CSS 中常遇到的“边距塌陷”问题中的一种。
边距塌陷 流内块级元素的 top 与 bottom 外边距有时会合并(塌陷)为单个外边距(合并后最大的外边距),这样的现象称之为外边距塌陷(margin collapsing)。
导致边距塌陷的原因是外边距,有以下四种情况计算情况:
- 如果都是正数,则取最大值
- 如果相同,则取其中之一
- 如果有正有负,则取最大的正数加上最小的负数之和
- 如果都是负数,则取最小值。
下图是相关示例,设置div1盒子的下边距,另设置下方 div2 盒子的上边距:
#block1 {
margin-bottom: 20;
}
#block2 {
margin-top: 10;
}div1
div2
在浏览器开发者工具先看 div1 的 margin 区域(红框):
文章图片
div2 的 margin 区域(绿框区域):
文章图片
对应情况:两个盒子之间的外边距如果都是正数,则取最大值。
下方为示例 2,我们将示例 1 中的外边距改为负数:
#block1 {
margin-bottom: -20;
}
#block2 {
margin-top: -10;
}div1
div2
两个盒子的重叠距离为两个负数中最小的数“-20px”(绝对值最大 |-20px|)。
文章图片
解决方法
如果想要避免这种塌陷,可以通过下面两种方法解决:
- 只给其中一个盒子设置外边距
- 给两个盒子分别套一个父盒子,父盒子属性设置为 overflow:hidden,同时让父盒子是密闭区域,从而触发 BFC
- 块元素 的 margin-top 与 它的第一个子元素 的 margin-top 之间没有 border、padding、inline content、clearance 来分隔。
- 块元素 的 margin-bottom 与 它的最后一个子元素 的 margin-bottom 之间没有 border、padding、inline content、height、min-height、max-height 分隔。
*{
margin:0px;
padding: 0px;
}
.div1{
width:300px;
height: 200px;
background-color: cornflowerblue;
margin:0px;
}
.div2{
background-color: wheat;
margin: 30px;
}div2
父元素不设置外边距,第一个子元素设置 margin:30px,会发现父元素与子元素一起往下移动了 30px:
文章图片
解决方法
【CSS 盒子的边距塌陷】想要解决这种塌陷的核心办法是把父子盒子分隔开。我们可以给父盒子设置边框或者内边距,或者给父盒子标签添加 overflow:hidden 属性,通过触发 BFC 规则,也就是块级格式上下文,把父级渲染成一个独立区域,从而解决父子盒子之间的塌陷问题。
BFC 规则触发方式:
- float 不为 none
- overflow 不为 visible(常用 overflow:hidden)
- position 为 fixed,absolute
- display 为 flex,inline-block,table-cell
那么,在我们学习以上知识后,就能清晰地知道开头引入的问题正是父子盒子间的塌陷,我们可以通过触发 BFC 规则(仅其中一种方案)来解决:
.image-div {/*子盒子*/
margin-top:25px;
}
.header-div {/*父盒子*/
overflow:hidden;
/*触发bfc*/
}
以上就是 CSS 盒子边距常见的塌陷与解决办法,希望能够对你有所帮助。
推荐阅读 一文读懂浏览器存储与缓存机制
Python Type Hints 从入门到实践
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量