html怎么做折叠遮挡背景,HTML 外边距折叠,以及消除的办法

本文深入探讨了HTML和CSS中元素外边距折叠的现象,特别是父子元素之间的外边距处理。通过实例展示了当设置margin-top时,外边距如何超出预期,以及如何通过创建BFC(块格式化上下文)来避免外边距折叠。解决方案包括使用overflow: hidden等属性,确保元素的外边距按预期与父元素对齐。此外,文章还概述了W3C规范中关于外边距折叠的条件和规则。
摘要由CSDN通过智能技术生成

有如下的HTML

以及如下的csshtml,body{  padding: 0px;  margin: 0px; width: 100%;  height: 100%;  }

html{  background: aliceblue;  }

body{  background:antiquewhite;  }

.page {  width: 600px; height: 300px;  background: mediumaquamarine;}

.mains { width: 300px; height: 200px;background: yellow;}

.content{ width: 200px; height: 100px;background:mistyrose;}

在常规流中显示的效果如下(图1)

66c5caf2d640ceadf5f0ab71cc548753.png

此时,为.content添加以下样式.content{width: 200px; height: 100px;background:mistyrose; margin-top: 10px; }

显示效果(图2)

55c5058018075ebc0f17b9b77782e3ae.png

这里可能会出乎很多人的意料,按我们正常的理解,.content外部有.mains的包围,那.content应该是顶部距离.mains 10px才是,可实际情况他们并没有分开,甚至最终的结果感觉是body顶部距离html顶部10px(至于这感觉对不对呢?也许不完全如此).这就是“外边距折叠”

接下来我们再给.mains加上margin-top样式.mains {width: 300px;height: 200px;background: yellow;margin-top: 10px;}

其显示效果与“图2”一样,那么我们修改.mians的margin-top的值.mains {width: 300px;height: 200px;background: yellow;margin-top: 20px;}

显示效果如下(图3)

2eca6d245ec93782a8335797611c8319.png

此时的效果并不是相距30px,而是取了两则中最大的值20px.

接着给.page加上“margin-top: 20px;”效果不变,给body加上也是一样的效果。但如果给html加上该样式html{

background: aliceblue;

margin-top: 20px;

}

显示效果(图4)

f23b98f3f934cd8fec99b3cbf5cf8ba3.png

从以上结果可得知,在常规流中,html里面的元素(包括body)的外边距都是针对html元素的边缘来确定的。而html元素的外边距是针对浏览器顶部决定的。从其得知,html元素其实生成了BFC.

那么问题来了,如果这样,那设置的html的背景色真的是html元素的吗?(因为设置html的margin-top: 20px;后背景色用的仍是对html元素设置的样式值)会不会其实是浏览器的背景色?

对于“图2”和“图3”,其实我们绝大多数情况要的不是这样的效果,要的其实是针对父元素的margin-top.  对于这种上下级元素而言,他们的margin是针对最近的BFC块来定位的,所以,我们只要能让其父元素生产BFC就可以实现我们想要的效果。例如我对.mains添加以下的样式:overflow: hidden;

那么我们想要的效果也就出来了,如下所示:

d82c1fcfea55e36eadb6c497d48a3f04.png

如果我们不在.mains上添加,而是在.page上添加,那结果将会如下所示

53b97cf64213d39cfa479f2453d3a642.png

将.mains和.page同时加上overflow: hidden; 其结果如下:

3dc63f3ce8efbdc27d4d33f0194a9d0d.png

这不就是我们想要达到的效果吗~~

以上是针对“父子关系”的元素外边距折叠以及解决的办法,至于兄弟元素的折叠问题就相对简单多了。当然解决的办法也是一样。

推荐该链接供大家学习:

根据w3c规范,两个margin是邻接的必须满足以下条件:必须是处于常规文档流(非float和绝对定位)的块级盒子,并且处于同一个BFC当中。

没有线盒,没有空隙(clearance,下面会讲到),没有padding和border将他们分隔开

都属于垂直方向上相邻的外边距,可以是下面任意一种情况元素的margin-top与其第一个常规文档流的子元素的margin-top

元素的margin-bottom与其下一个常规文档流的兄弟元素的margin-top

height为auto的元素的margin-bottom与其最后一个常规文档流的子元素的margin-bottom

高度为0并且最小高度也为0,不包含常规文档流的子元素,并且自身没有建立新的BFC的元素的margin-top和margin-bottom

以上的条件意味着下列的规则:创建了新的BFC的元素(例如浮动元素或者'overflow'值为'visible'以外的元素)与它的子元素的外边距不会折叠

浮动元素不与任何元素的外边距产生折叠(包括其父元素和子元素)

绝对定位元素不与任何元素的外边距产生折叠

inline-block元素不与任何元素的外边距产生折叠

一个常规文档流元素的margin-bottom与它下一个常规文档流的兄弟元素的margin-top会产生折叠,除非它们之间存在间隙(clearance)。

一个常规文档流元素的margin-top 与其第一个常规文档流的子元素的margin-top产生折叠,条件为父元素不包含 padding 和 border ,子元素不包含 clearance。

一个 'height' 为 'auto' 并且 'min-height' 为 '0'的常规文档流元素的 margin-bottom 会与其最后一个常规文档流子元素的 margin-bottom 折叠,条件为父元素不包含 padding 和 border ,子元素的 margin-bottom 不与包含 clearance 的 margin-top 折叠。

一个不包含border-top、border-bottom、padding-top、padding-bottom的常规文档流元素,并且其 'height' 为 0 或 'auto', 'min-height' 为 '0',其里面也不包含行盒(line box),其自身的 margin-top 和 margin-bottom 会折叠。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值