float引起的高度塌陷问题

一、float布局

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>float</title>
    <style>
        /*
            设置float会使元素脱离文档流 

             脱离文档流的特点:
                 块元素:
                   1、块元素不再独占页面的一行
                   2、脱离文档流以后,块元素的宽度和高度默认都被内容撑开
                 行内元素:
                   行内元素脱离文档流以后变成块元素,特点和块元素一样
                 即,元素的性质发生了改变

                 脱离文档流以后,不需要区分块和行内了                            
        */
        .box1, .box2{
            width: 50px;
            height: 50px;
        }

        .box1, .box2{
            float: left; 
        } 

        .box1{
            background-color: orange;
        }

        .box2{
            background-color: green;
        }

        .box3{
            width: 100px;
            height: 100px;
            background-color: skyblue;
        }
    </style>
</head>
<body>
    <div class="box1">1</div>
    <div class="box2">2</div>
    <div class="box3">3</div>
</body>
</html>      

 二、高度塌陷

高度塌陷是指父元素不设置高度(默认是被子元素撑开)的情况下,子元素发生浮动(脱离文档流),会出现高度塌陷的问题。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>float引起的高度塌陷</title>
    <style>
        .boxes{
            border: 2px solid red;
        }

        .box1, .box2{
            width: 50px;
            height: 50px;
            float: left;
        }

       .box1{
            background-color: orange;
        }

        .box2{
            background-color: green;
        }

        .box3{
            width: 200px;
            height: 200px;
            background-color: skyblue;
        }
    </style>
</head>
<body>
    <div class="boxes">
        <div class="box1">1</div>
        <div class="box2">2</div>
    </div>
    <div class="box3"></div>
</body>
</html>  

 三、float引起的高度塌陷解决方案

3.1 父元素设置高度(不建议)

3.2 开启BFC模式

BFC(Block Formatting Context)块级格式化环境

- BFC是CSS中的一个隐含的属性,可以为

    开启BFC后,该元素会变成一个独立的布局区域

- 元素开启BFC后的特点:

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

2.开启BFC的元素:子元素和父元素外边距不会重叠

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

 

可以通过一些特殊方式来开启元素的BFC:

1.设置元素的浮动(不推荐)

2.将元素设置为行内元素(不推荐)

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

- overflow: auto;

- overflow: hidden;(建议使用)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>float引起的高度塌陷的解决方案一:开启BFC</title>
    <style>
        .boxes{
            border: 2px solid red;
            /* float: left; */
            /* overflow: auto; */
            overflow: hidden;
        }

        .box1, .box2{
            width: 50px;
            height: 50px;
            float: left;
        }

       .box1{
            background-color: orange;
        }

        .box2{
            background-color: green;
        }

        .box3{
            width: 200px;
            height: 200px;
            background-color: skyblue;
        }
    </style>
</head>
<body>
    <div class="boxes">
        <div class="box1">1</div>
        <div class="box2">2</div>
    </div>
    <div class="box3"></div>
</body>
</html>  

效果图:

 

 3.3 设置clear属性 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>float引起的高度塌陷的解决方案二:设置clear属性</title>
    <style>
        /*
            clear
                - 作用:清除浮动元素对当前元素所产生的影响
                - 可选值:
                        left:清除左侧浮动元素对当前元素的影响
                        right:清除右侧浮动元素对当前元素的影响
                        both:清除两侧中最大影响的那侧

                        原理:
                            设置清除浮动以后,浏览器会自动为元素添加一个上外边距,以使其位置不受其他元素的影响
        */
        .box1{
            width: 100px;
            height: 50px;
            float: left;
            background-color: orange;
        }

        .box2{
            width: 100px;
            height: 100px;
            float: right;
            background-color: green;
        }

        .box3{
            width: 200px;
            height: 200px;
            background-color: skyblue;

            /* clear: left; */     
            /* clear: right; */           
            clear: both;
        }
    </style>
</head>
<body>
    <div class="box1">1</div>
    <div class="box2">2</div>
    <div class="box3"></div>
</body>
</html>

 但是里面存在一个问题,若给box1和box2一个外盒子,盒子并没有被撑开,如图:

 3.4 最终解决——使用伪元素和clear属性进行

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>float引起的高度塌陷的最终解决方案</title>
    <style>
       .box1{
            border: 2px solid red;
        }

        .box2{
            width: 100px;
            height: 100px;
            float: left;
            background-color: green;
        }

       /*  .box3{    
            clear: both;
        } */
        
        .box1::after{    
            content: '';
            display: block;
            clear: both;
        }
    </style>
</head>
<body>
    <div class="box1">
        <div class="box2"></div>
        <!-- <div class="box3">3333</div> -->
        <!-- 去除box3的话,浮动没有得到清除;但由于需求中并不需要box3,所以使用伪元素进行清除 --> 
   </div> </body> </html>

 3.5 clearfix

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>clearfix</title>
    <style>
       .box1{
            width: 200px;
            height: 200px;
            background-color: #bfa;
        }

       .box1::before{
            content: '';
            display: table;
        }

        .box2{
            width: 100px;
            height: 100px;
            background-color: orange;
            margin-top: 100px;
        }

        /* clearfix:可以同时解决高度塌陷和外边距重叠问题 */
        .clearfix::before, 
        .clearfix::ater {
            content: '';
            display: table;
            clear: both;
        }
    </style>
</head>
<body>
    <div class="box1">
        <div class="box2"></div>
    </div>
</body>
</html> 

 

效果如图:

posted @ 2020-10-29 12:59  娜豆  阅读(310)  评论(0编辑  收藏  举报