高度塌陷

版权声明:
本文作者: dear_mr      https://blog.csdn.net/dear_mr/article/details/71325719




一、什么是高度塌陷?

简单来说,就是包含含有浮动的元素的上一级的高度变为0了,下面的元素会上去

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css">
        .par {
            border: 1px solid green;
        } 
        .sub {
            width: 20%;
            height: 50px;
            float: left;
            border: 1px solid red;
        }
        .only {
            width: 30%;
            height: 60px;
            background: #999;
        }
    </style>
</head>
<body>
    <div class="par">
        <div class="sub div1"></div>
        <div class="sub div2"></div>
        <div class="sub div3"></div>
    </div>
    <div class="only"></div>
</body>
</html>
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

上面的这个例子,可以看出来class为par的div的内部是含有三个子div的,当子div没有设置浮动的时候,表现出来大的效果是下面这样的,可以看出class="only"这个div的显示是在class="par"的后面的,而class="par"的高度等于里面的div(此时是按照块元素方式进行排列的)撑起来的高度

这里写图片描述

当sub这个类选择器设置了float: left的时候,结果如下面所示,可以看出来,好像它们都挤到一块去了,而class="par"的这个外部div的height很明显是等于0的,它里面的div是浮动排列的,而class="only"的这个div可以看出来是“跑到”它上面的元素的位置去的,就好像它上面的元素都并不存在似的,这个也就是我今天要说的“高度塌陷”这个问题了 【float 之后,有float属性的div就漂浮起来,与普通div 不在一个平面上。上一级”par”div的高度 就撑不起来,变成原大小了】
这里写图片描述

二、解决办法

首先从上面的例子中可以很容易看到,导致问题出现的原因就是因为设置了浮动,当子元素设置了浮动的时候,子元素就会完全脱离文档流,此时会导致子元素无法撑起父元素的高度,导致父元素高度塌陷

那么浮动是什么呢?

float是css的定位属性,通过使用float这个属性可以实现元素的浮动

描述
left元素向左浮动
right元素向右浮动
none默认值,元素不浮动,并会显示在其文本中出现的位置
inherit规定应该从父元素继承float属性

下面就来说一下解决(清除浮动)的办法

1. 父元素结束之前,添加一个标签

<div style="clear: both;"></div>
  
  
  • 1

优点:简单,易于实现

缺点:添加了没有意义的空标签

2. 父元素设置overflow: auto或者浮动元素设置overflow: hidden

.par {
  border: 1px solid green;
  overflow: auto;
} 
.sub {
  width: 20%;
  height: 50px;
  float: left;
  border: 1px solid red;
  overflow: hidden;
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

缺点:overflow: auto如果超出范围会自动生成一个滚动条,而overflow: hidden可能会导致超出部分直接隐藏且不占用文档流的空间

3. 让父元素本身也浮动

.par {
  border: 1px solid green;
  float: left;
} 
  
  
  • 1
  • 2
  • 3
  • 4

缺点:使得跟父元素相邻的元素的布局受到影响,不推荐使用

4. 使用CSS的after伪元素

.clearfix:after {
  content: ".";         /*生成内容作为最后一个元素,至于content里面是什么没有影响*/
  display: block;       /*使得生成的元素以块级元素显示,占满剩余空间*/
  height: 0;            /*避免生成的内容破坏原有空间的高度*/
  clear: both;          /*闭合浮动*/
  visibility: hidden;   /*使得生成内容不可见,并允许可能生成内容盖住的内容进行点击和交互*/
}
.clearfix {
  zoom : 1;             /*触发IE6/7的haslayout*/
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

三、BFC(Block formating context)

BFC块级格式化上下文,它是一个独立的渲染区域,一句摘自别人博客的话“BFC元素特征表现原则就是,内部元素再怎么翻江倒海,翻云覆雨都不会影响外部的元素”(http://www.zhangxinxu.com/wordpress/2015/02/css-deep-understand-flow-bfc-column-two-auto-layout/

触发BFC的情况:

  • float的值不为none的时候
  • overflow的值为auto,scroll或者hidden
  • display的值为table-cell,table-caption,inline-block
  • position的值不是relative和static

看到这里是不是发现,这个和上面列举的方式有点关系了,对的,我们也不难看出,触发了BFC就可以消除(闭合)浮动

关于这个问题就先写到这里了,希望对你有帮助 ^_^

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值