CSS高度塌陷问题和外边距重叠的解决方案(clear方法)

高度塌陷问题

什么是高度塌陷问题?高度塌陷问题是使用浮动属性的时候会经常遇到的问题。我们可以利用浮动属性来实现高效的水平布局,但是如果你写下面的代码,就会发现box1的高度出现问题,因为box1的高度是靠子元素box2撑起来的,现在box2变成了浮动元素,box1就没有了高度,这就造成了高度塌陷问题。
要解决这个问题有很多种自欺欺人的做法,比如强行写死高度等。这些解决方法都非常的无聊,并且问题特别多,本篇文章直接讲最完美的解决办法

  <style>
    .box1{
    
    
      background-color: lightgreen;
      border: lightsalmon 10px solid;

    }
    .box2{
    
    
      height: 200px;
      width: 200px;
      background-color: lightblue;
        float: left;
    }
  </style>
<div class="box1">
  <div class="box2"></div>
</div>

在这里插入图片描述

clear属性

解决高度塌陷问题的一个比较完美的方案就是利用clear属性。
我们先看一下问题现象:在设置了float后,div2占据了div1的位置,但他的文字却环绕在下面。这明显是不合适的,而且非常的影响布局。我们可以用clear属性实现让div2不受float属性的影响,只对他自身无效。

.box1{
    
    
      width: 200px;
      height: 200px;
      background-color: lightblue;
      float: left;
    }
.box2{
    
    
      width: 200px;
      height: 200px;
      background-color: lightgreen;
}
<div class="box1">1</div>
<div class="box2">2</div>

在这里插入图片描述
使用clear属性: 使用也非常的简单,如下:
因为float设置是left,所以给clear设置一个left值这样,div2就不受float的影响了。这样即使div1设置了float属性,div2也不受影响了。

 .box2{
    
    
      width: 200px;
      height: 200px;
      background-color: lightgreen;
      clear: left;
 }

在这里插入图片描述
现在看一个新的现象:
有三个div,div1和div2分别设置左浮动和右浮动,div3添加clear:left属性,就会出现下面的效果。因为添加的是clear:left属性,所以右浮动对div3来说是透明的,直接占用他的空间。但div1对他来说不是透明的,会被顶住。

<style>
    .box1{
    
    
      width: 200px;
      height: 200px;
      background-color: lightblue;
      float: left;
    }
    .box2{
    
    
      width: 300px;
      height: 300px;
      background-color: lightgreen;
      float: right;
    }

    .box3{
    
    
      width: 200px;
      height: 200px;
      background-color: lightsalmon;
      clear: left;
    }
  </style>
<div class="box1">1</div>
<div class="box2">2</div>
<div class="box3">3</div>

在这里插入图片描述
如果设置为clear:right将会变成下面的效果:
虽然div3是可以占用div1的空间的,但是被div2顶住了。
还要一个属性是clear:both。效果是一样的,相当于同时设置了clear:right和clear:left,因为div2的高度更大,所以会取clear:right。
在这里插入图片描述

利用clear解决高度塌陷问题

我们先分析一下怎么用clear来解决高度塌陷问题。如果我们在蓝色div2的下方兄弟位置添加一个div3,并且设置clear属性,那么div2将会顶住div3,那么红色的div1将会有高度,高度就是div2的高度。
在这里插入图片描述
实现代码如下:

 <style>
    .box1{
    
    
      background-color: lightgreen;
      border: lightsalmon 10px solid;

    }
    .box2{
    
    
      height: 200px;
      width: 200px;
      background-color: lightblue;
        float: left;
    }
    .box3{
    
    
        clear: both;
    }
  </style>
<div class="box1">
  <div class="box2"></div>
    <div class="box3">box3</div>
</div>

在这里插入图片描述
这里box3添加了文字,为了演示效果,去掉文字就是我们需要的效果。
这里还是存在一个问题就是我们凭空添加了一个div3,这是不太合理的。我们可以利用::after属性来实现这个功能。
我们只需要给.box1的::after设置下面三个属性就可以完美的解决高度塌陷问题。
我们必须设置display为block,因为默认情况下::after伪元素是行内元素。content必须有内容,哪怕是空字符串。

    .box1::after{
    
    
        content: "";
        display: block;
        clear: both;
    }

这样就可以解决高度塌陷问题了。
在这里插入图片描述

外边距重叠问题

下面的效果是给子元素div2加了margin-top,设置者的目的是想div2相对div1撑开50px,但div1自身也撑开了50px,这就是外边距重叠问题。

可以通过调整父子的padding来投机取巧的实现这样的功能,但比较麻烦,而前面的clear属性也可以完美的解决这个问题。

  <style>
    .div1{
    
    
      height: 200px;
      width: 200px;
      background-color: lightblue;
    }

    .div2{
    
    
      height: 100px;
      width: 100px;
      background-color: lightgreen;
      margin-top: 50px;
    }
  </style>
<div class="div1">
  <div class="div2"></div>
</div>

在这里插入图片描述

解决问题的思路:
**和高度塌陷类似,如果我们在div2上方添加一个元素给他做,margin的对象,是不是可以解决问题?答案是可以的。**我们可以给div1添加::before伪元素作为div2的上方兄弟元素。
通过下面的代码就可以直接解决这个问题。
主要就是给出问题的div添加下面的属性。
1.content和上面一样,不能没有内容,所以设置为空字符
2.display设为table
,这里不能设置伪block或者inline,或者block-inline。

  .div1::before{
    
    
        content: "";
        display: table;
    }
<div class="div1">
  <div class="div2"></div>
</div>

在这里插入图片描述

高度塌陷问题和外边距重叠的统一解决方案clearfix方法

上面的代码是对同一个div分别添加了::before和::after来解决问题的,那么我们可以把两者写到同一个方法中,分别复用。

  .clearfix::before,.clearfix::after{
    
    
        content: "";
        display: table;
        clear: both;
    }

给需要的元素添加上这个类就可以完美的解决这两个问题了。
给需要的元素添加上这个类就可以完美的解决这两个问题了。
给需要的元素添加上这个类就可以完美的解决这两个问题了。

<div class="div1  clearfix">
  <div class="div2  "></div>
</div>

这个方法是《JavaScript权威指南》作者提出的。

猜你喜欢

转载自blog.csdn.net/ScottePerk/article/details/126585520