6.浮动——高度塌陷(BFC)

问题 

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>解决高度塌陷问题————BFC</title>
    <style>
        /* box1没有指定高度,其高度由内部子元素的高度撑开 */
        .box1{
            
            border: 10px red solid;
        }
        .box1>.box2{
            width: 200px;
            height: 200px;
            background-color: #bfa;
            text-align: center;
            line-height: 200px;
        }
        .box3{
            width: 300px;
            height: 200px;
            background-color: orange;
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="box1">
        <div class="box2">box2</div>
    </div>
    <div class="box3">box3
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Nesciunt consectetur unde nihil earum blanditiis, praesentium facere quo officiis ea repellat magnam. Doloremque voluptatem veritatis eveniet consequuntur excepturi animi officiis. Labore.
    </div>
</body>
</html>

box1没有指定宽高,由于其是文档流中的块元素,所以宽度默认是父元素的全部,即<body></body>的全部,其高度由内部子元素的高度决定,所以box1内部的box2多高,就决定了box1多高。

但是,当box2设置浮动之后,box2脱离文档流,导致box1内部高度降低,所有元素上移补位,这就导致了我们在利用浮动进行布局时,会产生一些高度塌陷的情况,导致布局变得混乱。

解决方法:

        1. 直接将其包含块的内容指定高度,这样一来,包含块的高度写死之后,其高度就无法根据子元素的高度变化而变化。

     /* box1没有指定高度,其高度由内部子元素的高度撑开 */
        .box1{
            width: 300px;
            height: 300px;
            border: 10px red solid;
        }
        .box2{
            float: left;
            width: 200px;
            height: 200px;
            background-color: #bfa;
            text-align: center;
            line-height: 200px;
        }
        .box3{
            width: 200px;
            height: 200px;
            background-color: orange;
            text-align: center;
        }

        2.BFC(块级格式化环境)

可以将BFC可以理解为一个隐藏的属性,开闭BFC之后,元素便会具备一下属性:

  1. 子元素的垂直外边距,不会传递给父元素(解决了外边距折叠的问题)。
  2. 元素不会被浮动所覆盖。
  3. 元素可以包含浮动元素。

开启BFC的方法:(任何开启bfc的方法都有其副作用)

  • 浮动会开启元素的bfc(让父元素跟着子元素一起浮动)
        .box1{
            float: left;
            border: 10px red solid;
        }
        .box2{
            float: left;
            width: 200px;
            height: 200px;
            background-color: #bfa;
            text-align: center;
            line-height: 200px;
        }
        .box3{
            width: 300px;
            height: 200px;
            background-color: orange;
            text-align: center;
        }

 通过包含块也浮动,可以使得包含块的高度由浮动的子元素的高度决定。

但是我们发现,这里虽然box1的高度可以有box2的高度变化而变化,但是box1,box2都浮动,后续不浮动的box3自动补位上移,也会影响之后不浮动的元素。

  • 将包含块的overflow属性设置为一个非visible的值,一般是hidden最佳。
        /* box1没有指定高度,其高度由内部子元素的高度撑开 */
        .box1{
            overflow: hidden;
            border: 10px red solid;
        }
        .box2{
            float: left;
            width: 200px;
            height: 200px;
            background-color: #bfa;
            text-align: center;
            line-height: 200px;
        }
        .box3{
            width: 300px;
            height: 200px;
            background-color: orange;
            text-align: center;
        }

  • 将包含块通过display设置为flow-root。(副作用最小)
        /* box1没有指定高度,其高度由内部子元素的高度撑开 */
        .box1{
            display: flow-root;
            border: 10px red solid;
        }
        .box2{
            float: left;
            width: 200px;
            height: 200px;
            background-color: #bfa;
            text-align: center;
            line-height: 200px;
        }
        .box3{
            width: 300px;
            height: 200px;
            background-color: orange;
            text-align: center;
        }

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>BFC</title>
<style>
    /* ------------------------开启BFC之后,子元素的垂直外边距不会传递给父元素。------------------------ */
    /*
         为什么给box1加上边框之后,外边距也不会折叠?
            因为给box1加上边框之后,子元素的外边距和父元素的外边距就不是同一个外边距,两个之间差一个父元素的边框,就不会发生重叠。
    */
    .box1{
        width: 400px;
        height: 400px;
        background-color: #bfa;
        display: flow-root; /* 开启元素的BFC */
    }
    .box2{
        width: 200px;
        height: 200px;
        background-color: brown;
        margin-top: 50px;
    }
    /* -------------------------开启BFC之后,元素不会被浮动元素所覆盖。----------------------------------- */
    .box3{
        width: 200px;
        height: 200px;
        background-color: chartreuse;
        margin-bottom: 100px;
        float: left;/* 浮动之后,元素脱离文档流,在其元素会向包含块内的内容区左侧或右侧移动 */
    }
    .box4{
        width: 200px;
        height: 200px;
        background-color: deepskyblue;
        margin-top: 100px;
        display: flow-root;/* 开启bfc之后,box3浮动,box4没浮动,但是box4自动上移到box3的左边,并不会是直接上移被覆盖 */
    }
    /* ---------------------------------开启BFC之后,元素可以包含浮动的子元素。------------------------------------- */
    .box5{
        width: auto;
        height: auto;
        background-color: crimson;
        display: flow-root;/* 开启bfc之后,box5不会再因子元素浮动,丧失内容而高度消失 */ 
    }
    .box6{
        width: 200px;
        height: 200px;
        background-color: darkorchid;
        float: left;
    }

</style>
</head>
<body>
    <!-- 
        1.开启BFC之后,子元素的垂直外边距不会传递给父元素。
        2.开启BFC之后,元素不会被浮动元素所覆盖。
        3.开启BFC之后,元素可以包含浮动的子元素。

    -->
    <div class="box1">
        <div class="box2"></div>
    </div>
    <hr>
    <div class="box3"></div>
    <div class="box4"></div>
    <hr>
    <div class="box5">
        <div class="box6"></div>
    </div>
</body>
</html>

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
绝对定位盒子不会导致高度塌陷高度塌陷是指当一个父元素包含了浮动元素时,父元素的高度会塌陷为0,不包含子元素的高度。这种情况下,可以通过以下方法解决高度塌陷的问题: 1. 设置父元素的高度:给父元素设置一个固定的高度,可以通过设置具体的像素值或百分比来确定高度。这样父元素的高度不会受到子元素浮动的影响。 2. 开启父元素的BFC属性:BFC(Block Formatting Context)是一个独立的渲染区域,可以避免浮动元素对父元素的影响。可以通过给父元素设置以下样式来开启BFC属性: ``` overflow: auto; ``` 或 ``` display: flow-root; ``` 3. 添加一个空白的块元素:在父元素的最后一个子元素后面添加一个空白的块元素,并给它设置以下样式: ``` clear: both; ``` 这样可以清除浮动元素对父元素高度的影响。 绝对定位盒子不会对父元素的高度造成影响,因为绝对定位的元素脱离了文档流,不会对其他元素的布局产生影响。所以绝对定位的盒子不会导致高度塌陷的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [CSS盒子塌陷及解决方法](https://blog.csdn.net/m0_46612221/article/details/121295507)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [解决高度塌陷的方法](https://blog.csdn.net/m0_72975897/article/details/126268027)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值