服务时间:8:30-18:00

首页 >web前端网

css要如何清除浮动

发布时间:2022-12-05 21:41 字数:3086字 阅读:115

css要如何清除浮动?浮动会导致高度塌陷的问题,本节将讲解如何清除浮动带来的影响。

1、高度塌陷

虽然浮动属性解决了页面布局中的很多问题,但浮动布局也不是全然没有缺陷的。例如,当元素浮动时,会脱离文档流;当父级包含框的高度小于浮动框的高度时,会发生高度塌陷。

【例1】创建一个div元素,设置3px的橙色边框,在div元素中创建一个img元素作为子元素,浏览器显示效果如图2所示,div元素被子元素img撑开,div的高度等于img的高度。CSS代码如下。


.box{
   border: 3px solid #f8a978;
}
img{
    height: 300px;
}


HTML代码如下。


<body>
    <div class="box">
       <img src="img/cats.jpg" alt=""/>
    </div>
</body>


在div元素中创建一个img元素

图2 在div元素中创建一个img元素

为img添加浮动属性之后,情况发生了变化。img元素浮动之后脱离了文档流,无法撑起父级的高度,父级div的高度变为0,页面发生高度塌陷,如图3所示。CSS代码如下。


img{
   height:300px;
   float: left;
}


高度塌陷

图3 高度塌陷

2、清除浮动的方法

1. 给浮动元素的父级设置高度

给例1中浮动元素的父级设置高度,运行结果如图3所示。CSS代码如下。


.box{
   border: 3px solid #f8a978;
   height: 300px;
}
img{
   height:300px;
   float: left;
}


给浮动元素的父级设置高度

图3 给浮动元素的父级设置高度

给浮动元素的父级设置高度的缺点是:

(1)不方便,不知道子元素高度时无法操作;

(2)可扩展性差,在父元素中添加其他内容时,父元素需要的高度也会变化。

2. 给浮动元素的父级添加CSS样式float: left

给浮动元素的父级添加CSS样式float: left,为父级开启BFC,以解决高度塌陷的问题,运行结果如图4所示。CSS代码如下。


.box{
   border: 3px solid #f8a978;
   height: 300px;
}
img{
   height:300px;
   float: left;
}


给浮动元素的父级添加CSS样式float: left

图4 给浮动元素的父级添加CSS样式float: left

给浮动元素的父级添加CSS样式float: left清除浮动,这种方式看似撑开了父级的高度,但并不能解决问题,如图5所示,父级的父级同样面临高度塌陷的问题。此外,这两个元素浮动之后会脱离文档流,其他元素会顶替它们的位置,造成页面的混乱。因此,不推荐使用这种方式清除浮动。

body元素高度未撑开

图5 body元素高度未撑开

BFC是每个属性的隐藏样式。BFC是一个独立的布局环境,其中的元素布局不受外界影响。开启BFC的元素有以下特点:

(1)开启了BFC的元素与其父元素的垂直外边距不会发生重叠;

(2)开启了BFC的元素会包含其浮动的子元素;

(3)开启了BFC的元素不会被浮动元素所覆盖。

要使一个HTML元素触发BFC,满足下列任意一个条件即可:

(1)float的值不是none;

(2)position的值不是static或relative;

(3)display的值是inline-block、table-cell、flex、table-caption或inline-flex;

(4)overflow的值不是visible。

3. 给浮动元素的父级元素添加CSS样式overflow: hidden

给浮动元素的父级元素添加CSS样式overflow: hidden,为父级开启BFC,运行结果如图6所示。代码如下。


.box{
   border: 3px solid #f8a978;
   float: left;
}


给浮动元素的父级元素添加CSS样式overflow: hidden

图6 给浮动元素的父级元素添加CSS样式overflow: hidden

overflow属性规定,当内容溢出元素框时隐藏溢出的内容。给浮动元素的父级元素添加CSS样式overflow: hidden有时会影响元素的样式。

在使用这种方式解决高度塌陷的问题之前需要考虑实际需要。

3、使用伪类清除浮动在浮动

元素后(父级元素中)添加一个带有clear:both属性的没有内容的块元素(可以是div、br等元素)即可清除浮动。提示添加的元素必须是块元素,因为clear:both只作用于块元素。

方案一:在浮动元素下面创建一个div元素,设置clear:both,如图7所示,可以解决父级元素高度塌陷的问题,之后把新增div中的内容删掉即可,不影响页面的内容,但这种方法不符合W3C标准中结构、样式、行为三者分离的要求。CSS代码如下。


.box{
   border: 3px solid #f8a978;
   overflow: hidden;
}
img{
   height: 300px;
   float: left;
}


添加块元素

图7 添加块元素

HTML代码如下。


<div class="box">
    <img src="img/cats.jpg" alt=""/>
    <div class="block">
       添加的元素
    </div>
</div>


方案二:伪类清除浮动——万能清除法。为了解决方案一不符合W3C标准的缺陷,引入伪元素的概念。CSS伪元素用于向某些选择器设置特殊效果,CSS伪元素有4类,如表1所示。

表1 CSS伪元素

CSS伪元素

【例2】创建一个class名为box的div元素,内部包含一个div元素,内容为“Hi,”,使用伪元素在后面加上文本“CSS”。CSS代码如下。


body{
   color: #606266;
   font-size: 30px;
}
.box:after{
   content: "CSS";
}


HTML代码如下。


<div class="box">
    <div>
      Hi,
    </div>
</div>


在浏览器中打开开发者模式,可以看到在box内部的最后位置,添加了内容为“CSS”的伪元素,如图8所示。

使用:after添加内容

图8 使用:after添加内容

利用伪元素:after解决高度塌陷的问题。CSS代码如下。


.box{
   border: 3px solid #f8a978;
}
img{
   height:300px;
   float: left;
}
.box:after{
   content: "在浮动元素后面创建一个伪元素 ";
   display: block;
   clear: both;
}


HTML代码如下。


<div class="box clearfix">
    <img src="img/cats.jpg" alt=""/>
</div>


这种方法只是将方案一中的空标签改为用:after创建的伪元素,同样是使用clear: both清除浮动。用:after在浮动元素后面创建一个伪元素,content属性中规定这个伪元素的内容,设置display:block,将伪元素设为块元素,设置clear: both,清除伪元素的左右浮动,运行结果如图9所示。

清除伪元素的左右浮动

图9 清除伪元素的左右浮动

将内容改为空,即content: "",运行结果如图10所示。

 内容设为空字符串

图10 内容设为空字符串

这种方法遵循了W3C标准中结构、样式、行为三者分离的要求,是目前最常用的清除浮动以解决高度塌陷的方法。一个页面上往往有多个需要清除浮动的元素,所以通常将这种方法命名为clearfix,之后在使用中给需要清除浮动的元素添加clearfix类名即可。CSS代码如下。


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