解决高度塌陷的方法

作者: 奶不加糖 | 来源:发表于2020-11-19 11:47 被阅读0次

    当元素脱离文档流时,会出现什么问题呢?我们先看看下面这个例子

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8>"
            <title></title>
            <style type="text/css">
                .box1{
                    border:10px red solid;/*为box1设置一个边框*/
                }
                .box2{
                    width: 100px;
                    height: 100px;
                    background-color:blue;
                }
            </style>
        </head>
        <body>
            <div class="box1">
                <div class="box2"></div>
            </div>
        </body>
    </html>
    

    我们可以看到,在文档流中,父元素的高度默认是被子元素撑开的。但是如果我们给box2设置一个浮动,会出现什么情况呢?



    当我们给子元素设置浮动后,子元素完全脱离文档流,此时会导致子元素无法撑起父元素的高度。这也是我们接下来要讨论的问题——高度塌陷。

    由于父元素的高度塌陷,则父元素下的所有元素都会向上移动,这样会导致页面布局混乱。如果我们给父元素设置一个和子元素一样的高度,从效果来看似乎避免了高度塌陷问题。但是如果子元素的高度改变了,我们会发现这个问题并没有实质性的解决。父元素并不能自动适应子元素高度,因此不建议使用这种方法。

    根据W3C的标准,在页面中元素都有一个隐含的属性叫做Block Formatting Context,简称BFC。该属性可以设置打开或者关闭(默认关闭)。当开启元素的BFC后,元素将会具有如下特征:
    1、父元素的垂直外边距不会和子元素重叠
    2、开启BFC的元素不会被浮动元素所覆盖
    3、开启BFC的元素可以包含浮动的子元素

    如何开启元素的BFC
    1、设置元素浮动
    2、设置元素绝对定位
    3、设置元素为inline-block
    4、将元素的overflow设置为一个非visible的值

    前面两种方法虽然可以撑开父元素,但是会导致父元素宽度丢失,并且下边的元素也会上移,不能解决问题。第三种可以解决问题,但是会导致宽度丢失。第四种方法可以达到我们想要的效果,是副作用最小的BFC开启方式。

    overflow:auto;/*overflow:hidden;也可以,但是在IE6及以下浏览器中不支持BFC*/
    

    在IE6中有一个类似于BFC的隐含属性hasLayout,可以通过将元素的zoom设置为1开启。

    如果我们定义了多个div,若有div使用了浮动,将会对下面的元素产生影响,我们可以使用clear来清除其它浮动元素对当前元素的影响。清除浮动后,元素回到其它元素浮动前的位置。

    clear可选值:none,默认值,不清除浮动;left,清除左侧浮动元素对当前元素的影响;right,清除右侧浮动元素对当前元素的影响;both,清除两侧浮动元素对当前元素的影响。

    clear只能对兄弟块起作用,那如何解决父子块元素之间产生的高度塌陷问题呢?

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style type="text/css">
                .box1{
                    border:1px solid red;
                }
                .box2{
                    width: 100px;
                    height: 100px;
                    background-color: blue;
                    float:left;
                }
                .box3{
                    clear:both;
                }
            </style>
        </head>
        <body>
            <div class="box1">
                <div class="box2"></div>
                <div class="box3"></div>
            </div>
        </body>
    </html>
    

    我们可以在高度塌陷的父元素最后添加一个空白的div,对其进行清除浮动,这样可以通过空白的div来撑开父元素的高度。这种方式虽然可以解决问题,但是会在页面添加多余的结构。我们可以通过after伪类,选中box1的后边来清除浮动,这样就不会在页面添加多余的div。

    .clearfix::after{
                    content:"";/*添加一个内容*/
                    display:block;/*转换为一个块元素*/
                    clear:both;/*清除两侧浮动*/
                }
    

    相关文章

      网友评论

        本文标题:解决高度塌陷的方法

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