老师,我想问

老师,我想问

请问下什么时候会发生父元素高度塌陷的问题呢?

是不是当父元素position fixed 或 absolute, 其子元素又设置了margin-top,这样会发生呢?

可是如果是这样,那下面这种情况:

.sub-menu {

width: 730px;

height: 458px;

/* 子菜单定位在主菜单的右边,相对于main定位 */

position: absolute;

left: 244px;

top: 0;

background: #fff;

z-index: 3;

border: 1px solid #d9dde1;

box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.1);

}


.sub-menu>.inner-submenu {

/* 跟父盒子sub-menu一样大 */

width: 100%;

height: 100%;

background: url('../img/fe.png') no-repeat;

}


.inner-submenu>.submenu-content {

width: 652px;

margin-left: 40px;

/* 这个元素设置overflow: hidden;不是为了隐藏内容,而是为了解决外边距塌陷。 */

/* 父元素在没有设置padding-top或者border的时候,也会跟随子元素一起跑下来。 */

overflow: hidden;

}


.submenu-content>.title {

font-size: 16px;

color: #f01414;

line-height: 16px;

font-weight: bold;

/* 这里设置了margin-top,这个元素的父元素在没有设置padding-top或者border的时候,也会跟随子元素一起跑下来。 */

/* 有了padding-top或者border-top,其父亲.submenu-content就可以不用overflow: hidden; */

/* padding-top:20px; */

/* 上右下左 */

margin: 28px 0 30px 0;

}

.title的父亲没有定位,为什么title设置了margin-top之后会造成它的父亲高度塌陷呢?是因为.title的祖先元素(好几代之前的.sub-menu)设置了定位吗?麻烦老师了,谢谢

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
好帮手慕久久 2020-10-12 17:55:09

同学你好,问题解答如下:

  1. margin传递和高度塌陷的结果不一样。margin传递,可以简单理解成子元素会把父元素拽下来,父元素位置变化了。以上一位老师给你举得例子为例,效果如下:

    http://img1.sycdn.imooc.com//climg/5f8425d009ab6d8a05240384.jpg

    而高度塌陷是指父元素高度没被子元素撑开,如下:

    http://img1.sycdn.imooc.com//climg/5f8426320929a1a905460567.jpg

    http://img1.sycdn.imooc.com//climg/5f84264609e6c73305430565.jpg

2. 即使二者的解决方案,有相同的部分,但是也不能将其说成是一样。比如设置边框可以解决margin传递,但是无法解决高度塌陷问题,如下:

解决margin传递:

http://img1.sycdn.imooc.com//climg/5f8426b909ce1e5704320348.jpg

http://img1.sycdn.imooc.com//climg/5f8426dc09c8593007940729.jpg

无法解决高度塌陷:

http://img1.sycdn.imooc.com//climg/5f84271609b77ccf04770309.jpg

http://img1.sycdn.imooc.com//climg/5f8427c909bcdcd605940652.jpg

由于二者是不同的现象,所以为了严谨,建议同学分着记忆二者的解决方案。

祝学习愉快!

好帮手慕夭夭 2020-10-12 17:41:54

同学你好,虽然它们可能使用同一个方法可以解决这个问题,但是本质上是有区别的,不能说margin传递和高度塌陷是一个结果。参考如下理解:

产生的结果不一样:

高度塌陷是因为子元素设置定位或者浮动脱离文档流,父元素自己又没有设置高度,也无法让子元素撑开高度,所以高度为0(即高度塌陷)。

http://img1.sycdn.imooc.com//climg/5f8422db0977f7da03950376.jpg

产生的问题是父元素高度为0:

http://img1.sycdn.imooc.com//climg/5f8422ed09b475cf02600177.jpg

而margin传递,是说的子元素设置margin-top,本应该自己往下移动,但是父元素也跟随往下移动。和前面说的高度塌陷产生的结果不一样:

http://img1.sycdn.imooc.com//climg/5f8423c9099a15e003690191.jpg

http://img1.sycdn.imooc.com//climg/5f8423f109c26c2806800255.jpg

另外,解决方式中,会有相同的。但是并不是所有的都相同,例如设置border可以解决margin传递问题,但是不可以解决高度塌陷。这个建议同学自己多练习,通过效果总结一下哦。

祝学习愉快~

好帮手慕言 2020-10-11 18:54:29

同学你好,解答如下:

1、父元素高度塌陷,可以理解为子元素无法撑起父元素的高度,一般情况下,子元素浮动、子元素设置固定定位和绝对定位时会出现此类情况。

2、同学提到的下方描述,是不会出现高度塌陷的情况。

http://img1.sycdn.imooc.com//climg/5f82dfed0976a62706900044.jpg

3、是出现了下方的问题吗?

http://img1.sycdn.imooc.com//climg/5f82e20b09d64cbc04700712.jpg

效果:

http://img1.sycdn.imooc.com//climg/5f82e21d098385e803950684.jpg

这是发生了margin传递。也就是:在父子结构里,如果子元素设置了margin-top值,会出现一个问题,就是子元素的margin-top会作用到父级元素。遇到这种情况,有如下几种解决方法:

(1)给父元素添加border或border-top。

(2) 给父元素添加padding或padding-top。

(3)给父元素设置overflow:hidden。

(4)给父元素设置float属性

(5)给父元素设置绝对定位或者固定定位

(6)将子元素margin-top,变为padding-top。

4、同学只提供了一部分css代码,并且有些类名和源码并不一样,老师不能准确的知道同学到底遇到了什么问题,如果不是第3点描述的问题,建议同学把遇到的问题详细描述一下,并把完整的代码粘贴上来,老师帮助测试。祝学习愉快~

  • 提问者 慕村6371425 #1
    老师,谢谢,是margin传递的问题。因为发生高度塌陷的元素的子元素.title没有浮动和定位。那我还有一个问题,就是这个margin传递好像和高度塌陷是一个结果,而且解决方案也差不多。那是不是可以认为解决margin传递和高度塌陷是一样的方法?
    2020-10-12 15:01:00
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师