当前位置: 首页 > 图文教程 > 网页制作 > CSS样式表 > CSS:闭合元素和浮动元素的差别

CSS样式表
CSS网页设计 IE8和IE7共存
CSS2 打印属性让打印HTML文档不出问题
制作网页中设计段落缩进的方法
CSS border 属性使用说明
CSS border-style 属性使用方法
CSS border-color 属性使用方法
CSS border-width 属性使用教程
CSS padding属性定义边内补白
CSS margin 属性定义边外补白
网页布局教程 掌握CSS网页布局属性
css 背景样式属性说明
span margin 设置生效
html 滚动条在IE6和IE7中兼容性问题
IE6 两个div有间隙的问题(IE 3px bug)
CSS 数字和字母将容器撑大问题解决
换个角度看页面重构中的语义化
DIY属于个人开发使用的CSS Reset
CSS 空格引起网页布局间距问题
CSS 网页制作时遇到问题的快速参考技巧
css li 去掉点的样式写法

CSS样式表 中的 CSS:闭合元素和浮动元素的差别


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-09   浏览: 132 ::
收藏到网摘: n/a

提示:本文不是教程,而是对闭合浮动元素的方法在某个特定情况下的现象的讨论,涉及float、clear、overflow、:after等知识,新手勿入。


float属性在页面排版上非常有用,但是也带来很多问题。最常见的就是浮动元素的闭合问题。
如果一个没有设定高度的不浮动元素的子元素浮动,则该元素的高度不会包括浮动子元素的高度,而只会包含其内部不浮动元素的高度,因为浮动元素不属于常规流向,它脱离了文档流。因此如果要元素能够自动包含浮动子元素,则需要闭合浮动元素。
目前比较常用的有3种方法:

  • 利用浮动子元素后的元素清除浮动(包括添加1个空的元素以清除浮动)。
  • 使用:after伪元素,在元素最后插入清除。
  • 为元素设定overflow属性除“visible”之外的值。


还有1个方法可以使元素自适应高度:

  • 浮动元素,浮动的元素会包含浮动的后代元素。

下列代码,其显示如图1所示。

提示:所列代码只是关键代码,完整代码请查看示例页面。


CSS:

p,
div 
{
margin
: 5px;
}

.wrap 
{
width
: 440px;
margin
: 10px;
clear
: both;
}

.div1,
.div2p 
{
float
: left;
width
: 80px;
margin
: 8px;
+display
: inline;
}


XHTML:
<div class="wrap">
  
<div class="div1">div1,浮动</div>
  
<div class="div2">
    
<class="div2p">div2内p1</p>
   
<class="div2p">div2内p2</p>
    
<class="div2p3">div2内p3,不浮动</p>
  
</div>
  
<div class="div3">div3,不浮动</div>
</div>

提示:截图是Firefox 2.0(以下简称FF)中的效果,如无特殊声明,则表示在Windows IE7.0(以下简称IE)、Opera 9.2(以下简称Op)、Safari 3.0(以下简称Sa)中效果相同。

图1:浮动元素与子元素浮动的元素
/web/css/format/clearFloat/clearFloat_01.gif

如果对.div2p增加CSS:
.div2p {
......
clear
:left;
}

由于“clear:left”含义为:不允许本元素左边有浮动框,而div1也是浮动元素,因此,p1和p2下移到了div1的下面,如图2所示。

图2:不浮动的元素内的浮动子元素设定“clear:left”后的效果
/web/css/format/clearFloat/clearFloat_02.gif


而在IE中,整个div2都将下移到div1下,如图3所示。
图3:不浮动的元素内的浮动子元素设定“clear:left”后IE的显示
/web/css/format/clearFloat/clearFloat_03.gif


由图3可以发现,虽然在图1中IE正确地显示了溢出的元素,但是,对于出发了layout的wrap,IE仍旧会扩展最外层的高度,以容纳浮动元素。


闭合浮动元素方法1

此时,div2的高度只包括其内未浮动元素的高度,因此使用第1种方法闭合浮动元素,为浮动元素后面的元素p3设定clear属性:
.div2p3 {
clear
:left;
}

此时显示如图4所示,在IE中如图5所示。

图4:p3清除浮动后的效果
/web/css/format/clearFloat/clearFloat_04.gif


图5:p3清除浮动后IE内的效果
/web/css/format/clearFloat/clearFloat_05.gif

(啊!伟大的IE,居然多出来与div2的margin一样多的间隙。= =b)

此时如果为div2增加左边距(原设定为margin:5px):
.div2 {
......
margin-left
: 120px;
}

则显示如图6所示,在IE中如图7所示。

图6:增加左边距后的效果
/web/css/format/clearFloat/clearFloat_06.gif

图7:p增加左边距后IE内的效果
/web/css/format/clearFloat/clearFloat_07.gif


至此的效果,是左右2栏布局常用的方法,左栏固定宽度,右栏不设定宽度以求能自适应。


闭合浮动元素方法2

尝试方法2,利用:after清除浮动:
.div2:after {
content
: "."; 
display
: block;
height
: 0; 
clear
: both; 
visibility
: hidden;
}

显示效果如图8所示。(IE不支持,不用试了。= =b)
图8:使用:after清除浮动
/web/css/format/clearFloat/clearFloat_08.gif

可以看到div2内的p3没有清除浮动,位置仍在div2的顶端。

增加div2的左边距,显示如图9所示。
.div2 {
margin-left
:120px;
}

图9:增加div2的左边距
/web/css/format/clearFloat/clearFloat_09.gif

由此可见使用:after清除浮动,不适合于浮动元素后面还有不浮动元素的情况。

闭合浮动元素方法3

尝试方法3,使用overflow属性:
.div2 {
overflow
:auto;
+height
:100%; /* 针对ie6 */
}

此时,最热闹的情况出现了:

图10:FF的效果
/web/css/format/clearFloat/clearFloat_10.gif

图11:Op和Sa的效果
/web/css/format/clearFloat/clearFloat_11.gif

图12:IE的效果(注:如果用IE 6,效果也不一样,= =|||)
/web/css/format/clearFloat/clearFloat_12.gif

首先,div2的宽度收缩到div1的右边了,也许这正好是期望的结果?
更热闹的在后面,增加div2的margin-left:
.div2 {
margin-left
:120px;
}

图13:FF的效果
/web/css/format/clearFloat/clearFloat_13.gif

图14:Op和Sa的效果
/web/css/format/clearFloat/clearFloat_14.gif

图15:IE的效果(注:如果用IE 6,效果也不一样,= =|||)
/web/css/format/clearFloat/clearFloat_15.gif

都是margin-left惹的祸,去掉margin-left:
.div2 {
margin-left
: 0;
}

终于接近统一了。

图16:去掉margin-left的效果
/web/css/format/clearFloat/clearFloat_16.gif

图17:去掉margin-left在IE内的效果
/web/css/format/clearFloat/clearFloat_17.gif

由此可见,overflow还是有很大局限性的。
但是造成FF、Op和Sa的显示结果的原因又是什么呢?

浮动

div2浮动,浮动元素的高度会包含其内部的浮动元素。
这种方法的局限性就是,div2浮动后宽度会被压缩,因此必须给它一个宽度值,但是这样就无法自适应宽度。
.div2 {
float
: left;
}

.div3 
{
clear
: both;
}

效果如图18所示。

图18:浮动div2
/web/css/format/clearFloat/clearFloat_18.gif

div2的浮动,还会造成wrap的高度问题,因此需要div3清除浮动。
由这个例子可以发现,由于div2的浮动,其内的p元素清除浮动,并没有受到div1的影响,因此,解决由于前2种方法中p1和p2下降到div1的高度之下的方法之一,可以将p1和p2外面套1个浮动的div,当然这可能影响到结构,还需要结合具体情况来决定。