CSS 解决高度塌陷的简单理解

2,551 阅读3分钟

为什么会高度塌陷

  • 当父元素不设置‘height’属性时,向其中添加子元素,父元素会拥有子元素的高度

  • 但是当其中的子元素添加’float‘属性时,子元素会脱离文档流,父元素会失去支撑其的高度,也就是所谓的 ‘高度塌陷’

    <style>
        #a{
            width:100px;
            height:100px;
            background-color: aqua;
            float:left;
        }
    </style>
    <div style='border:1px solid red;margin:100px;'>
        <div id="a"></div>
    </div>

如何解决高度塌陷

设置父元素高度

  • 这种方式比较简单直接,但是需要确定父元素准确的高度,并且后期不会更改

设置clear属性

为什么要用clear:both

  • clear有四个主属性值:‘none(默认无)’,‘left(左侧无浮动)’,‘right(右侧无浮动)’,‘both(两侧无浮动)’
  • ’clear‘有一个规则,那就是只作用于当前元素的前一个兄弟元素,而前一个元素只会存在于当前元素的左边或者右边,无论那一边,’clear:both‘都能完美的替代

如何使用

  • 我们可以创建一个标签,赋予‘clear:both;’属性
   <style>
        #a{
            width:100px;
            height:100px;
            background-color: aqua;
            float:left;
        }
        p{
            clear:both;
        }
    </style>
    <div style='border:1px solid red;margin:100px;'>
        <div id="a"></div>
        <p></p>
    </div>

优化

  • 如上图所示,新建一个标签的却可以解决这个问题,但每次都要新建一个标签非常的消耗资源,那能不能优化一下呢?
  • 我们可以使用:after伪元素和content属性来模拟新建一个盒子,然后给予他clear:both;属性,如下图
        <style>
        #a{
            width:100px;
            height:100px;
            background-color: aqua;
            float:left;
        }
        .clearfix:after{
            display:block;
            content:"";
            clear:both;
        }
    </style>
    <div class='clearfix' style='border:1px solid red;margin:100px;'>
        <div id="a" ></div>
    </div>

注:不能给子元素本身添加,:after伪元素会添加到标签内的最后

开启BFC模式

什么是BFC

  • BFC全称为’Block formatting context‘直译为’块级格式化上下文‘,我个人将它理解为一种开关,通过某种方式打开后来解决某些问题,这里我主要用来解决高度塌陷的问题
  • 开启后,父元素高度不受子元素脱离文档流的影响
    注:IE7以下不支持BFC模式,但同样含有一个隐藏属性 --- ‘haslayout’,可以通过‘zoom:1;’来开启

如何开启BFC

  • overflow设为hidden、scroll、auto
  • float值不为none
  • display设为inline-block、tabole-cell、table-caption
  • position不为relative、static

个人比较推荐修改‘overflow’属性的方法,因为相比于起来方式来说,‘overflow’对页面的影响更小

    <div style='overflow: hidden;border:1px solid red;margin:100px;'>
        <div id="a" ></div>
    </div>

借鉴:《CSS世界》 + 网上查找 + 自己的理解
如有错误,希望提出

希望大家都能早日拿到心仪的offer,加油,共勉