浅谈CSS 高度塌陷问题

作者: 老王420 | 来源:发表于2018-12-30 17:35 被阅读4次

    表现

    例如:

    HTML:

    <div class="first">
        <div class="first-child1">first-child1</div>
        <div class="first-child2">first-child2</div>
    </div>
    <div class="second">
        second
    </div>
    <div class="third">
        third
    </div>
    

    CSS:

    .first{
        width: 300px;
        background-color: pink;
    }
    .first .first-child1,.first .first-child2{
        float: left;
        width: 100px;
        height: 100px;
    }
    .first .first-child1{
        background-color: purple;
        margin-right: 10px;
    }
    .first .first-child2{
        background-color: red;  
    }
    .second{
        width: 200px;
        height: 150px;
        background-color: blue;
    }
    .third{
        width: 100px;
        height: 150px;
        background-color: green;
    }
    

    表现为:


    产生的原因

    由上面的例子可以看出,first盒子没有设置高度,由子元素撑开,但是由于子盒子设置了浮动,脱离了标准流,所以导致first盒子没有高度,表现为second和third盒子向上移动了。

    可以得出产生高度塌陷的原因:

    在文档流中,父元素的高度默认是被子元素撑开的,也就是子元素多高,父元素就多高。但是当为子元素设置浮动以后,子元素会完全脱离文档流,此时将会导致子元素无法撑起父元素的高度,导致父元素的高度塌陷。由于父元素的高度塌陷了,则父元素下的所有元素都会向上移动,这样将会导致页面布局混乱。

    高度塌陷的解决办法:

    1、给父元素设置固定高度。但是使用这种方式后,父元素的高度就不能根据子元素自动撑高了,可以根据自己页面的特点,如果可以固定高度,可以使用这种方式,否则,不推荐这种方式。

    2、额外标签法,这是w3c推荐的解决方案,但是不推荐,因为html的原则是写出语义化的标签,这种方式会额外增加无意义的标签。

    <div class="first">
        <div class="first-child1">first-child1</div>
        <div class="first-child2">first-child2</div>
        <div style="clear: both;"></div>
    </div>
    

    3、父元素的overflow属性(开启元素的BFC):

    .clearfix{
        overflow: hidden;
    }
    

    使用这种方式,属性值可以是非visible(hidden/auto/scroll)中任意,但是建议用hidden。

    这种方式副作用较小,这种方式在ie6中不支持,可以外加zoom: 1;

    .clearfix::after{
        content: "";/*伪元素内容为空*/
        display: block;/*非默认的就行,也可以是table等等*/
        height: 0;/*伪元素高度为0,不影响其他元素*/
        clear: both;/*清除浮动*/
        visibility: hidden;/*不可见*/
    }
    .clearfix{
        zoom: 1;/*ie6元素没有BFC模式,但是这句代码会开启ie6中的hasLayout模式,只在ie中支持*/
    }
    

    4、单伪元素after清除浮动(开启元素的BFC):

    .clearfix::after{
        content: "";/*伪元素内容为空*/
        display: block;/*非默认的就行,也可以是table等等*/
        height: 0;/*伪元素高度为0,不影响其他元素*/
        clear: both;/*清除浮动*/
        visibility: hidden;/*不可见*/
    }
    .clearfix{
        zoom: 1;/*ie6元素没有BFC模式,但是这句代码会开启ie6中的hasLayout模式,只在ie中支持*/
    }
    

    这种方式现在使用比较广泛,很多大网站都是使用这种方式,副作用较小,只需要在配合处理ie6就可以了。

    5、双伪元素清除浮动(开启元素的BFC):

    .clearfix::before,.clearfix::after{
        content: "";
        display: block;
        clear: both;
    }
    .clearfix{
        zoom: 1;/*ie6元素没有BFC模式,但是这句代码会开启ie6中的hasLayout模式,只在ie中支持*/
    }
    

    这种做法写法比较麻烦,也不推荐。

    清除浮动对父元素的影响后的效果:


    为了学习工作与休闲娱乐互不冲突,现新建圈【码农茶水铺】用于程序员生活,爱好,交友,求职招聘,吐槽等话题交流,希望各位大神工作之余到茶水铺来喝茶聊天。群号:582735936

    相关文章

      网友评论

        本文标题:浅谈CSS 高度塌陷问题

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