美文网首页
解决高度塌陷的问题和父子元素外边距重叠问题

解决高度塌陷的问题和父子元素外边距重叠问题

作者: houxnan | 来源:发表于2020-01-13 14:22 被阅读0次

    在文档流中,父元素的高度是被子元素给撑开的,如图,一个父元素box1里有个子元素box2,当box2没有设置宽高时,html中box1高度是没有的。

    首先上答案:

    第一种解决方案:

    给父元素设置一个属性:overflow:hidden/overflow:auto.

    第二种解决方案:

    给父元素用css样式添加一个伪类,设置一个空内容然后清除浮动。

    例:box1有个子元素box2,当box2没有高度时,box1高度就只有2个border的高度,没有被子元素撑开。

    当子元素box2有高度时,box1的高度会被撑开。

    但是当给box2设置一个float脱离文档流之后,子元素便无法撑开父元素的高度,造成塌陷。

    我们可以给父元素一个高度将高度撑开,但是这样父元素高度就无法自适应子元素高度了。

    如何解决高度塌陷的问题:

    根据W3C的标准,页面中每一个元素都有BFC的属性,属性默认情况下是关闭的,如果开启BFC,元素将具有如下属性:

    1.父元素的垂直外边距不会和子元素重叠

    2.开启BFC的元素不会被浮动元素所覆盖

    3.开启BFC的元素可以包含浮动的子元素。

    如何开启BFC:

    1.设置元素浮动

    2.设置元素绝对定位

    3.设置元素inline-block

    4.将元素设置一个overflow非visible的值

    给父元素也设置浮动后的效果:

    父元素的高度被撑开,不过宽度也消失了,变得和子元素一样宽,并且box1的兄弟元素box3也会随之顶上来

    给父元素设置position:absolute后,得到的效果和设置float效果是一样的:父元素高度被撑开,宽度消失,下面的兄弟元素box3顶上来。

    给父元素设置display:inline-block后,效果如图:

    父元素高度被撑开,宽度消失,兄弟元素box3未顶上来。

    最佳解决方案:

    给父元素设置一个overflow非visible的值,如设置overflow:auto/overflow:hidden均可。

    父元素高度被撑开,宽度也正常,兄弟元素也没有顶上来。

    具体示例如下:

    还有一个解决方案,是我们可以给box2添加一个兄弟元素,让这个兄弟元素将父元素撑开

    一开始box1有个子元素box2,还有个兄弟元素box3,box2因为有浮动,所以出现了塌陷问题,如图

    现在给box2添加一个兄弟元素box4,即给box1添加一个无内容的子元素,给这个子元素设置清除浮动,父元素高度也会被撑开。

    但是这种方式有一个缺陷,会增加html中的结构,给内容增加了一个box4,我们可以改进这种方法,用css的:after伪类方法给父元素box1增加一个子元素伪类,给这个伪类设置清除浮动。

    如图:设置一个box1:after伪类,也可清除浮动,撑开父元素高度

    第二个问题:解决父子元素外边距重叠的问题:

    有box1和box2这对父子元素,当我想让子元素box2距离父元素box1有个100px的高度时,发现box1和box2一起都向下移动了100px,并没有实现让box2向下移动100px,距离box1顶部100px的目的。

    如何解决这个问题:

    当我们给box1添加一个子元素table放在box2的前面时,就可以达到让box2距离box1 100px的目的。

    但是这样会改变文档的结构,我们同样可以以css伪类的方式解决这个问题,只不过设置伪类时,要设置成display:table,设置成display:block是没有用的。如图即可:

    相关文章

      网友评论

          本文标题:解决高度塌陷的问题和父子元素外边距重叠问题

          本文链接:https://www.haomeiwen.com/subject/mrigactx.html