欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

margin边距合并问题

程序员文章站 2022-06-14 14:55:26
...

问题重述

margin是外边距属性,它的定义是边框和边框之间的距离,但是有些时候这些边距是合并的,你知道这是怎么回事吗?

代码演示

1.垂直边距合并

css

.box1{
	width: 100px;
	height: 100px;
	margin-bottom: 25px;
	background-color: #00FFFF;
}
.box2{
	width: 100px;
	height: 100px;
	margin-top: 30px;
	background-color: #7CFC00;
}

html

<div class="box1"></div>
<div class="box2"></div>

显示效果:
margin边距合并问题

我们发现这两个色块之间的间距好像有点小,我这里对蓝色色块设置了下边距25px,对绿色色块设置了上边距30px。可是我们却发现最终的距离却是30px这是怎么回事呢?

这就是边距的合并,在垂直方向上的边距会发生合并,合并的规则是取距离的最大值,30>25所以合并的结果是取绿色色块的上边距30为最终的边距

2.父子元素,边距冒泡

css

.father{
	width: 200px;
	height: 200px;
	background-color: red;
}
.child{
	width: 100px;
	height: 100px;
	background-color: aqua;
	margin-top: 50px;
}

html

<div class="father">
	<div class="child"></div>
</div>

效果:
margin边距合并问题

我们发现他们整体相对于上面产生了一个边距,和我们的预期是不一样的,我们仅仅是想子元素相对于父元素产生一个边距而已

外边距合并一共就这两种情况了,那么接下来我们就研究如何解决这个问题

问题的解决

1.垂直边距合并

我们重新看下这种情况的代码

css

.box1{
	width: 100px;
	height: 100px;
	margin-bottom: 25px;
	background-color: #00FFFF;
}
.box2{
	width: 100px;
	height: 100px;
	margin-top: 30px;
	background-color: #7CFC00;
}

html

<div class="box1"></div>
<div class="box2"></div>

问题产生的原因是,垂直外边距会发生合并,而且会取得最大值作为最终的外边距

解决方案:

1.使用padding来代替margin
2.使用绝对定位和相对定位

使用padding代替

.box1{
	width: 100px;
	height: 100px;
	padding-bottom: 25px;
	background-color: #00FFFF;
}
.box2{
	width: 100px;
	height: 100px;
	padding-top: 30px;
	background-color: #7CFC00;
}

注意:使用padding会造成背景颜色/图片位置的拉伸,不过它的确可以解决内容区间隔的问题

使用定位**

.box1{
	position:relative;
	width: 100px;
	height: 100px;
	margin-bottom: 25px;
	background-color: #00FFFF;
}
.box2{
	position:absolute;
	width: 100px;
	height: 100px;
	margin-top: 30px;
	background-color: #7CFC00;
}

实现效果:
margin边距合并问题

2.父子元素,边距冒泡

我们回顾下这段代码

css

.father{
	width: 200px;
	height: 200px;
	background-color: red;
}
.child{
	width: 100px;
	height: 100px;
	background-color: aqua;
	margin-top: 50px;
}

html

<div class="father">
	<div class="child"></div>
</div>

产生冒泡的原因是,当父元素没有设置边框时候,css会认为子元素的边框和父元素的边框是一个边框.
margin的定义是设置边框与边框之间的距离,所以你对子元素设置margin,而且css认为没有设置边框的父元素和子元素是共用一个上顶边框的
所以就会使得整个外边距加在父元素和子元素共同的上边框上,与上顶形成一段距离

我们知道原因了,主要原因是css认为父元素和子元素共用一个上顶边框,那好我们的解决方案也就出炉了

解决方案

1.我们给父元素设置一个透明边框

.father{
	width: 200px;
	height: 200px;
	border: 1px solid transparent;
	background-color: red;
}

效果:
margin边距合并问题

这就是我们期望的效果,而且这会父元素有边框了,css就不会认为父元素和子元素共用一个边框了

2.使用overflow:hidden或者浮动

使用overflow

css

.father{
	width: 200px;
	height: 200px;
	overflow: hidden;
	background-color: red;
}
.child{
	width: 100px;
	height: 100px;
	background-color: aqua;
	margin-top: 50px;
}

使用float(浮动)

.father{
	width: 200px;
	height: 200px;
	float: left;
	background-color: red;
}

效果
margin边距合并问题

为什么这么做可以?

overflow:hidden(溢出)
它不仅可以解决溢出,它还能触发bfc(box format control)从而格式化父元素内的所有子元素,然后一些边距合并一些bug就被格式化掉了
float(浮动)
它也是一样会触发那个格式化

边距合并的意义

为什么CSS让垂直边距合并呢?这是CSS的bug嘛,当然不是的,最初设置CSS的时候,作者考虑到很多东西。

比如现在有一个排版,里面有一些盒子,为了增加外边距使得布局更加美观,如果没有边距合并的话会怎么样呢?

margin边距合并问题

我们设置了子块margin:10,但是由于没有垂直边距合并,垂直方向的gap竟然是20,好不美观呀

于是为了解决这个排版问题,CSS的作者就增加了垂直外边距合并的概念了

margin边距合并问题

这就是margin外边距合并的所有内容,分享和开源是程序员的没得,点赞和关注更是一种美德,感谢大家支持!!