如何解决由浮动带来的高度塌陷?

我们总会碰到,当给子元素添加浮动后,父元素高度消失,从而引起页面布局混乱的问题。

下面是解决此问题的方法(如果有新的方法我会一一补充)(其实这些方法有一个共同点都是在给父元素找回高度)

1. 直接给父元素找回高度

2. 清除子元素的浮动

3. 伪元素清除浮动

4.触发BFC法(overflow)

何为高度塌陷

<div class="fa1_red">
        <div class="son1_green"></div>
    </div>
<div class="fa2_black"></div>

<style>
       
        .son1_green{
            width: 200px;
            height: 200px;
            background-color: green;
            float:left;
        }
        .fa2_black{
            width: 400px;
            height: 200px;
            background-color: black;
        }
        .fa1_red{
            background-color: red;
        }
<style>

如左侧代码所示由于绿色的儿子开启了浮动,而导致父元素高度丢失,从而引起页面布局混乱。

未开启浮动之前,父元素由子元素撑开,高度等于子元素高度,如下图。

开启浮动后,子元素半脱离文档流(即活动位置被父元素限制,但已经不与父元素在同一平面。)父元素没有子元素撑开,失去了高度,如下图。父元素失去高度,原有位置不在占据,父元素下方兄弟元素,占据了他的位置。子元素开启了浮动,已经不与父元素和父元素的兄弟元素在同一品面,浮在他们上方。

解决办法

1.直接给父元素设置高度

<div class="fa1_red">
        <div class="son1_green"></div>
    </div>
<div class="fa2_black"></div>

<style>
       
        .son1_green{
            width: 200px;
            height: 200px;
            background-color: green;
            float:left;
        }
        .fa2_black{
            width: 400px;
            height: 200px;
            background-color: black;
        }
        .fa1_red{
            background-color: red;
            height:200px;
        }
<style>

当给父元素设置高度后,父元素丢失的高度恢复了,因此就不会塌陷。恢复了原来的样子(给父元素设置为与子元素一样高,即找回了父元素原来的高度,也可以根据需要设置)

如下图

此方法,虽然也能够解决高度塌陷带来的问题,但存在弊端。

  1. 盒子内容的高度不能超过父盒子,若更改了内容高度就需要重新设置父元素高度。

2.清除子元素的浮动

<div class="fa1_red">
        <div class="son1_green"></div>
        <div class="son2"></div>
    </div>
<div class="fa2_black"></div>

<style>
       
        .son1_green{
            width: 200px;
            height: 200px;
            background-color: green;
            float:left;
        }
        .son2{
               clear:both;
          }
        .fa2_black{
            width: 400px;
            height: 200px;
            background-color: black;
        }
        .fa1_red{
            background-color: red;
            height:200px;
        }
<style>

当在父元素中再加一个子元素,并清除其两侧的浮动,在我理解就是,清除浮动带来的影响,即高度丢失,这样父元素就找回了原来的高度。如图所示

由于父元素高度由内容确定,所以父元素中添加的内容影响着父元素的高度,所以不再限制父元素里的内容,可以多添加几个。

但这样子的方式,多了一个子元素,也就是多了一个结点,给浏览器增加了负载。

3.伪元素清除浮动

<div class="fa1_red">
        <div class="son1_green"></div>
        <div class="son2"></div>
    </div>
<div class="fa2_black"></div>

<style>
       
        .son1_green{
            width: 200px;
            height: 200px;
            background-color: green;
            float:left;
        }
      
        .fa2_black{
            width: 400px;
            height: 200px;
            background-color: black;
        }
        .fa1_red{
            background-color: red;
            height:200px;
        }
        .fa1_red::after{
           content:"";
           display:block;
           clear:both;
         }
<style>

给父元素添加伪类元素after意思就是,在父元素最后一个元素后添加内容,然后将其设置为块状,清除周围的浮动。原理与添加一个空的子元素相同,这不过这样更加方便,他永远会找最后一个元素后添加,不用因为前后多加元素而改写。

最终清除完效果如下

4.触发BFC法

<div class="fa1_red">
        <div class="son1_green"></div>
    </div>
<div class="fa2_black"></div>

<style>
       
        .son1_green{
            width: 200px;
            height: 200px;
            background-color: green;
            float:left;
        }
        .fa2_black{
            width: 400px;
            height: 200px;
            background-color: black;
        }
        .fa1_red{
            background-color: red;
            overflow:hidden;
        }
<style>

给父元素添加overflow属性以触发BFC(即格式化上下文),父元素被格式化高度找回。

如下图:

优点:代码简洁

缺点:内容增多的时候容易造成不会自动换行导致内容被隐藏掉,无法显示要溢出的元素

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值