css:垂直方向外边距margin塌陷问题及解决

简介: css:垂直方向外边距margin塌陷问题及解决

margin塌陷现象:


在垂直方向如果有两个元素的外边距有相遇,在浏览器中加载的真正的外边距不是两个间距的加和,而是两个边距中值比较大的,边距小的塌陷到了边距值大的值内部。


统一用到的的样式

* {
  margin: 0;
  padding: 0;
}
.box {
  width: 100px;
  height: 100px;
  text-align: center;
  line-height: 100px;
}

一、水平方向margin不会塌陷

横向排列(水平方向)边距不会被合并

<style type="text/css">
.box-8 {
  margin-right: 10px;
  background-color: green;
}
.box-9 {
  margin-left: 20px;
  background-color: gray;
}
</style>
<div style="display: flex;">
  <div class="box box-8">box-8</div>
  <div class="box box-9">box-9</div>
</div>

image.png

二、垂直方向margin出现塌陷

1、上下外边距合并

<style type="text/css">
.box-1 {
  /*底部margin 10px被box-2合并了*/
  margin-bottom: 10px;
  background-color: green;
}
.box-2 {
  margin-top: 20px;
  background-color: gray;
}
</style>
<div class="box box-1">box-1</div>
<div class="box box-2">box-2</div>

两个垂直元素的margin取了最大值20px

12.png

2、内外边距合并

<style type="text/css">
.box-3 {
  margin-top: 10px;
  background-color: green;
}
.box-4 {
  margin-top: 20px;
  width: 50px;
  height: 50px;
  line-height: 50px;
  background-color: gray;
}
</style>
<div class="box box-3">
  <div class="box box-4">box-4</div>
</div>

上边距只保留了20px

13.png

3、多个子元素内外边距合并

<style type="text/css">
.box-5 {
  background-color: green;
}
.box-6 {
  margin-top: 10px;
  background-color: blue;
}
.box-7 {
  margin-top: 20px;
  width: 80px;
  height: 80px;
  line-height: 80px;
  background-color: gray;
}
</style>
<div class="box box-5">
  <div class="box-6"></div>
  <div class="box box-7">box-7</div>
</div>

box-6和box-7只保留了两者中最大值20px

14.png

三、垂直方向margin塌陷解决方法

1、同级元素: 只设置一个元素的margin

<style type="text/css">
.box-10 {
  background-color: green;
}
.box-11 {
  margin-top: 30px;
  background-color: gray;
}
</style>
<div class="box box-10">box-10</div>
<div class="box box-11">box-11</div>

两个垂直元素上下边距和有了30px

15.png

2、父子元素: 子元素不设置margin,父元素设置padding

<style type="text/css">
.box-12 {
  margin-top: 10px;
  background-color: green;
  padding-top: 20px;
}
.box-13 {
  /* margin-top: 20px; */
  width: 50px;
  height: 50px;
  line-height: 50px;
  background-color: gray;
}
</style>
<div class="box box-12">
  <div class="box box-13">box-13</div>
</div>

外层上边距10px,内层上边距有20px,没有被合并

16.png


参考

  1. margin塌陷问题及解决
  2. CSS外边距合并(塌陷/margin越界)
  3. CSS margin塌陷问题及解决方案
相关文章
Element Plus 日期选择器 获取选中的日期的格式(当前日期/时间戳格式)
Element Plus 日期选择器 获取选中的日期的格式(当前日期/时间戳格式)
1372 0
|
9月前
|
前端开发 JavaScript
【Javascript系列】Terser除了压缩代码之外,还有优化代码的功能
Terser 是一款广泛应用于前端开发的 JavaScript 解析器和压缩工具,常被视为 Uglify-es 的替代品。它不仅能高效压缩代码体积,还能优化代码逻辑,提升可靠性。例如,在调试中发现,Terser 压缩后的代码对删除功能确认框逻辑进行了优化。常用参数包括 `compress`(启用压缩)、`mangle`(变量名混淆)和 `output`(输出配置)。更多高级用法可参考官方文档。
678 11
|
JavaScript
vue中使用echarts绘制双Y轴图表时,刻度没有对齐的两种解决方法
vue中使用echarts绘制双Y轴图表时,刻度没有对齐的两种解决方法
3728 0
|
JavaScript API 索引
js中的reduce()方法 讲解 和实现
`reduce()` 方法对数组元素依次应用一个回调函数,将结果累计并最终返回单一值。语法为 `reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)`。参数包括累计器(初次为初始值或首元素)、当前元素值、索引及数组自身。此方法需返回值供下一轮迭代使用。常见应用场景包括计算数组总和与平均值、统计元素频率、过滤与转换数组内容及去除重复项等。例如,可通过 `reduce()` 快速计算 `[1, 2, 3, 4, 5]` 的总和或对对象属性值求和。此外,还可自定义实现 `reduce()` 方法
5892 1
|
JavaScript
【更多小知识】【JS】Number(null)输出的结果是0
【更多小知识】【JS】Number(null)输出的结果是0
1645 0
【更多小知识】【JS】Number(null)输出的结果是0
|
JavaScript
[webpack-cli] Error: Cannot find module ‘vue/compiler-sfc‘
[webpack-cli] Error: Cannot find module ‘vue/compiler-sfc‘
1738 0
|
4天前
|
数据采集 人工智能 安全
|
13天前
|
云安全 监控 安全