supce's blog

CSS学习笔记之清除浮动

这次把之前的坑填上 主要探究下浮动的清除

为什么要清除浮动


浮动是一个CSS样式中的常用属性,float属性有三个属性值,分别为 none left和right。顾名思义,none即设置对象不浮动 left设置元素向左浮动,若多个元素同时设置了该属性则呈现一个从左到右的页面布局 right设置元素向右浮动,若多个元素同时设置了该属性则呈现一个从右到左的页面布局

比如下面这个例子:
HTML:

<div class="float_left">
    <div>向左浮动元素1</div>
    <div>向左浮动元素2</div>
    <div>向左浮动元素3</div>
</div>
<div class="float_right">
    <div>向右浮动元素1</div>
    <div>向右浮动元素2</div>
    <div>向右浮动元素3</div>
</div>

CSS样式:

<style type="text/css">
    .float_left,.float_right{
        width: 100%;
        height: 150px;
        border:1px dashed #000;
        margin-bottom: 10px;
    }
    .float_left div,.float_right div{
        width: 150px;
        height: 90px;
        border: 1px solid #999;
        margin: 10px;
    }
    .float_left div{
        float: left;
        background-color: #cc3299;
    }
    .float_right div{
        float: right;
        background-color: #007FFF;
    }
</style>

效果如下:

当我们设置某个元素为浮动时,该元素脱离普通流,导致包含该元素的父元素高度塌陷。比如下面这个例子:

<style type="text/css">
    #test div{
        width: 200px;
        height: 100px;
    }
    .float_left{
        float: left;
        background-color: #cc3299;
    }
    .float_right{
        float: right;
        background-color: #007FFF;
    }
    .third{
        width: 100px;
        height: 100px;
        background-color: #666;
        color: #FFF;
    }
</style>
<div id="test">
    <div class="third">我是第三者</div>
    <div class="float_left">left</div>
    <div class="float_right">right</div>
</div>


id为test的div高度只有100px,高度塌陷了100px,这并不是我们想要的。为了减少浮动元素带来的负面影响,还原父元素应有的高度,这时候就需要闭合浮动

清除浮动的方式

使用br标签中的clear清除浮动

文本换行时会用到br标签,该标签的clear属性有三个属性值:left,right,all
修改代码如下:

<div id="test">
    <div class="third">我是第三者</div>
    <div class="float_left">left</div>
    <div class="float_right">right</div>
    <br clear="all" />
</div>

这种方法虽然代码量较少但是有违结构与表现的分离 不推荐使用

在IE6中还需要触发 hasLayout 在父元素中利用 zoom:1修正

添加额外标签

通过在浮动元素末尾添加一个空的标签例如 <div style="clear: both"></div>,其他标签br等也可以

<div id="test">
    <div class="third">我是第三者</div>
    <div class="float_left">left</div>
    <div class="float_right">right</div>
    <div style="clear: both"></div>
</div>

<style type="text/css">
    .float_left{
        width: 200px;
        height: 100px;
        float: left;
        background-color: #cc3299;
    }
    .float_right{
        width: 200px;
        height: 100px;
        float: right;
        background-color: #007FFF;
    }
    .third{
        width: 100px;
        height: 100px;
        background-color: #666;
        color: #FFF;
    }
</style>

添加无意义的空标签 不符合我们结构与表现的分离的要求,不便于后期维护

设置父元素 overflow:hidden

#test{
        overflow: hidden;
        zoom: 1; /*修正ie6中的haslayout问题*/
    }

这种方式有个缺点:可能将我们溢出的东西隐藏。

设置父元素 display:table

#test{
        display: table;
    }

刷新下页面 由于盒模型的属性发生了改变发现带来了新的问题 还是不用的好

利用伪元素 :after

HTML稍作修改:

<div id="test" class="clearFix">
    <div class="third">我是第三者</div>
    <div class="float_left">left</div>
    <div class="float_right">right</div>
</div>

增加CSS样式

.clearFix:after{
    clear: both;
    display: block;
    visibility: hidden;
    content: "";
    height: 0;
    line-height: 0;
}
.clearFix{
     zoom: 1; /*修正ie6中的haslayout问题*/
}

以上几种方式,其实可以分为两种,

  • 1、通过在浮动元素的末尾添加一个空元素,设置 clear:both属性,after伪元素其实也是通过 content 在元素的后面生成了内容为一个点的块级元素
  • 2、通过设置父元素 overflow 或者display:table 属性来闭合浮动