CSS两个经典BUG--margin塌陷与margin合并

margin塌陷问题

现象

先上示例代码

<div class="warpper">
			<div class="box"></div>
</div>
* {
	padding: 0;
	margin: 0;
}

.warpper {
	height: 200px;
	width: 200px;
	background-color: gray;
}

.box {
	height: 100px;
	width:100px;
	background-color: green;
}

两个嵌套的盒子如下所示
在这里插入图片描述
给嵌套在里面的子元素盒子摄设置一个margin-top值,我们的设想是子元素会相对于父元素向下移动,但是效果与我们想的却不太一样。
在这里插入图片描述
我们看到子元素是相对于浏览器的顶端向下移动了,仿佛父元素没有顶一样,这种现象我们就称之为margin塌陷。

解决方案

  1. 给父元素设置border。这种方法可以解决问题,但是在实际开发中不推荐,因为这样会破坏页面的样式;
  2. 使用bfc来解决。触发bfc有以下几种方式:
    float的值不为none
    overflow的值不为visible
    display的值为table-cell、tabble-caption和inline-block之一
    position的值不为static或者releative中的任何一个
    根据业务需求任选一种方式设置到父元素中,就可以解决margin塌陷问题;根据业务需求任选一种方式设置到父元素中,就可以解决margin塌陷问题;
  3. 给父元素加一个padding。这种方式也不推荐,道理和第一条一样。

修改后的代码如下:

* {
	padding: 0;
	margin: 0;
}

.warpper {
	height: 200px;
	width: 200px;
	background-color: gray;
	overflow: hidden;
}

.box {
	margin-top: 100px;
	height: 100px;
	width:100px;
	background-color: green;
}

margin合并问题

margin塌陷问题是父子级元素之间的bug,现在来看另一个经典的bug–margin合并问题。与margin塌陷不同,margin合并是兄弟级元素之间的bug。
先上代码

<body>        
        <div class="demo1">1</div>
        <div class="demo2">2</div>
</body>
-----------------------------------------------------------------------
* {
	padding: 0;
	margin: 0;
}

.demo1 {
	background-color: gray;
}

.demo2 {
	background-color: red;
}

效果如图所示:
在这里插入图片描述
我们给上面的div加一个下边距100px,给下面的div加一个上边距200px,根据设想,此时两个div的间距应该是300px。但是经过实验后我们发现两个div之间的距离还是只有200px。

* {
	padding: 0;
	margin: 0;
}

.demo1 {
	background-color: gray;
	margin-bottom: 200px;
}

.demo2 {
	background-color: red;
	margin-top: 100px;
}

这就是margin合并问题。即所谓的外边距合并就是,当两个垂直外边距相遇时,它们将形成一个外边距。合并的外边距的高度等于两个发生合并的外边距的高度中的较大者。

解决方法有两种,第一种是直接改变其中一个外边距的值,使之达到想要的效果(推荐使用);另外一种解决方式是将兄弟元素分别作为子元素放在块级元素内,然后将其父级元素的渲染规则该为BFC。(不推荐使用,会破坏HTML文档结构)。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值