CSS 清除浮动

在 CSS 中,使用浮动布局可能会影响周围元素,并且还会引发很多预想不到的问题,比如父元素高度塌陷等。为了解决这个问题,在使用浮动布局之后,一般还需要清除浮动才行。

CSS 清除浮动,常用的方式有以下 3 种。

  • 使用 clear 属性。
  • 使用 overflow 属性。
  • 使用自定义的 clearfix。

使用 clear 属性清除浮动

在 CSS 中,我们可以使用 clear 属性来清除浮动带来的影响。

语法:

clear: 关键字;

说明:

clear 属性取值有 3 种,如下表所示。

clear 属性取值
属性值 说明
left 清除左浮动
right 清除右浮动
both 同时清除左浮动和右浮动

提示: 在实际开发中,我们很少会单独使用 clear: left; 或 clear: right; 来清除左浮动或右浮动,往往都是直截了当地使用 clear: both; 来把所有浮动清除,简单粗暴又省事!也就是说,我们只需要记住 clear: both; 就可以了。

示例 1:没有清除浮动的情况

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style>
        #father {
            width: 300px;
            background-color:teal;
            border: 1px solid silver;
        }
        #son1, #son2{
            padding: 10px;
            margin: 20px;
        }
        #son1 {
            background-color: hotpink;
            float: left;
        }
        #son2 {
            background-color: orange;
            float: right;
        }
    </style>
</head>
<body>
    <div id="father">
        <div id="son1">box1</div>
        <div id="son2">box2</div>
    </div>
</body>
</html>

页面效果如下图所示。

没有清除浮动的情况

分析:

上面是使用了 float 属性之后,没有清除浮动的效果,此时可以看到父元素出现高度塌陷的问题。

示例 2:使用 clear 属性清除浮动

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style>
        #father {
            width: 300px;
            background-color:teal;
            border: 1px solid silver;
        }
        #son1, #son2{
            padding: 10px;
            margin: 20px;
        }
        #son1 {
            background-color: hotpink;
            float: left;
        }
        #son2 {
            background-color: orange;
            float: right;
        }
        /* 关键代码,清除浮动 */
        .clear { clear: both; }
    </style>
</head>
<body>
    <div id="father">
        <div id="son1">box1</div>
        <div id="son2">box2</div>
        <div class="clear"></div>
    </div>
</body>
</html>

页面效果如下图所示。

使用 clear 属性清除浮动

分析:

我们一般都是在浮动元素后面再增加一个空元素,然后为这个空元素定义 clear: both 来清除浮动。说白了,前面小弟干了太多坏事,后面得大哥出面才能解决。

在实际开发中,凡是用了浮动之后发现有什么不对劲的地方,首先应该检查的是有没有清除浮动。

注意: clear 属性不是应用于浮动元素本身,而是应用于浮动元素后面的空元素。

使用 overflow 属性清除浮动

在 CSS 中,我们还可以使用 overflow 属性来清除浮动。

语法:

overflow: hidden;

说明:

overflow 属性有很多取值,而我们是使用 overflow: hidden; 来清除浮动。

示例 3:overflow: hidden; 清除浮动

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style>
        #father {
            overflow: hidden;       /* 关键代码,清除浮动 */
            width: 300px;
            background-color:teal;
            border: 1px solid silver;
            
        }
        #son1, #son2 {
            padding: 10px;
            margin: 20px;
        }
        #son1 {
            background-color: hotpink;
            float: left;
        }
        #son2 {
            background-color: orange;
            float: right;
        }
    </style>
</head>
<body>
    <div id="father">
        <div id="son1">box1</div>
        <div id="son2">box2</div>
    </div>
</body>
</html>

页面效果如下图所示。

overflow:hidden 清除浮动

分析:

overflow: hidden 相对 clear: both 来说,可以避免添加多余的标签,并且还不会破坏 HTML 的语义结构。但 overflow: hidden 其实是个 “小炸弹”,它会隐藏超出父元素的内容部分,有时候这并不是我们预期的效果。

注意: overflow: hidden; 应用于浮动元素的父元素,而不是当前的浮动元素。

使用自定义的 clearfix 清除浮动

在 CSS 中,使用 clear: both; 和 overflow: hidden; 来清除浮动都有明显的弊端。在实际开发中,最好的解决方案是自定义一个名为 clearfix 的 class,然后使用 ::after 伪元素结合 clear: both; 来实现。

语法:

.clearfix::after {
    content: "";
    clear: both;
    display: block;
    height: 0;
    visibility: hidden;
}

说明:

::after 伪元素结合 clear: both 来清除浮动的方式,我们推荐定义成公共 class(如类名为 clearfix),然后进行全局引用,以便减少 CSS 代码。

其中,::after 是一个伪元素,在 CSS3 动画效果中使用比较多。::before 和 ::after 都是常用的 CSS 伪元素。

示例 4:clearfix 清除浮动

<!DOCTYPE html> 
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <style type="text/css">
        .clearfix::after
        {
            clear:both;
            content:"";
            display:block;
            height:0;
            visibility:hidden;
        }
        #parent
        {
            width:300px;
            border:1px solid black;
        }
        #first,#second
        {
            width:100px;
            height:40px;
            border:1px solid red;
        }
        #first{float:left;}
        #second{float:right;}
    </style>
</head>
<body>
    <div id="parent" class="clearfix">
        <div id="first"></div>
        <div id="second"></div>
    </div>
</body>
</html>

页面效果如下图所示。

clearfix 清除浮动

分析:

clear: both 清除浮动会增加多余标签,overflow: hidden 清除浮动会使得超出父元素部分隐藏。使用 ::after 伪元素来清除浮动,则不会有这些缺点。在实际开发中,我们也更倾向于使用这种方法。

实际上,清除浮动的原理是这样的:当父元素中的子元素都设置了浮动后,这些浮动元素会脱离正常的文档流,导致父元素的高度计算不包括这些浮动元素,从而使父元素的高度塌陷为零。而清除浮动的本质就是让父元素能够感知到子元素浮动后的高度,从而正确地包裹住子元素。

上一篇: CSS 浮动

下一篇: CSS 定位

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号