CSS:闭合元素和浮动元素的差别

互联网   发布时间:2008-10-17 19:24:30   作者:佚名   我要评论
提示:本文不是教程,而是对闭合浮动元素的方法在某个特定情况下的现象的讨论,涉及float、clear、overflow、:after等知识,新手勿入。 float属性在页面排版上非常有用,但是也带来很多问题。最常见的就是浮动元素的闭合问题。 如果一个没有设定高度的不浮动元素的子元
提示:本文不是教程,而是对闭合浮动元素的方法在某个特定情况下的现象的讨论,涉及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:
<divclass="wrap">
<divclass="div1">div1,浮动</div>
<divclass="div2">
<pclass="div2p">div2内p1</p>
<pclass="div2p">div2内p2</p>
<pclass="div2p3">div2内p3,不浮动</p>
</div>
<divclass="div3">div3,不浮动</div>
</div>
提示:截图是Firefox2.0(以下简称FF)中的效果,如无特殊声明,则表示在WindowsIE7.0(以下简称IE)、Opera9.2(以下简称Op)、Safari3.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的效果(注:如果用IE6,效果也不一样,==|||)
/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的效果(注:如果用IE6,效果也不一样,==|||)
/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,当然这可能影响到结构,还需要结合具体情况来决定。

相关文章

  • CSS盒子模型、圆角边框、盒子阴影效果实现

    盒子模型是网页布局的基础,包括边框、外边距、内边距和实际内容,通过CSS可以控制盒子之间的距离及其外观,如边框样式、边框颜色等,重要属性包括padding和margin,分别控制内
    2024-10-18
  • CSS盒子模型、圆角边框、盒子阴影效果实现

    盒子模型是网页布局的基础,包括边框、外边距、内边距和实际内容,通过CSS可以控制盒子之间的距离及其外观,如边框样式、边框颜色等,重要属性包括padding和margin,分别控制内
    2024-10-18
  • CSS使用filter和backdrop-filter实现高斯模糊效果(示例代码)

    本文详细介绍了CSS3中的两个实现高斯模糊效果的API:filter和backdrop-filter,filter可以直接在图像或背景图上添加多种效果,而backdrop-filter则用于在元素后的区域添加效
    2024-09-26
  • CSS 中的overscroll-behavior属性详解

    overscroll-behavior是CSS中用于控制元素滚动边界行为的属性,可通过设置为auto、contain或none来指定当元素滚动超出边界时的处理方式,本文给大家介绍CSS 中的overscroll-be
    2024-09-26
  • css实现四角边框效果

    本文介绍了如何通过CSS实现具有四角边框的效果,使用了linear-gradient和background属性来创建边框,并设置了背景尺寸,文章还提供了Vue中图片资源引用的示例代码,适合想要为
    2024-09-24
  • CSS的:required和:optional伪类:如何增强表单字段的视觉识别

    在网页设计中,使用CSS的:required和:optional伪类可以有效增强表单字段的视觉识别,提升用户体验和表单的可访问性,这两个伪类分别用于区分必填和非必填字段,通过添加不同的
    2024-09-18
  • css边框修饰实现代码

    本文介绍了CSS中设置边框的几种主要属性,包括边框样式(如实线、虚线等)、边框宽度(可以单独设置每个方向的宽度)、边框颜色(支持单独为每个方向设置颜色)以及圆角边框
    2024-09-18
  • 如何利用CSS实现视差滚动和抖动效果

    通过CSS3和JS,实现前端炫酷的视差滚动和抖动效果,本文详细介绍了相关CSS样式和JS脚本,通过监听滚动条位置并调整元素的top属性来达到视差效果,当到达特定位置时,利用CSS动画
    2024-09-13
  • CSS文本超出后隐藏并显示省略号及其他浏览器兼容方案(推荐)

    在CSS中,可以通过简单的样式设置实现文本超出隐藏并显示省略号的效果,这些方法主要适用于WebKit内核的浏览器,对于其他浏览器,可采用JavaScript或CSS Fallback等方案,文
    2024-09-11
  • css 自定义变量 var()案例分析

    这篇文章主要介绍了css 自定义变量 var()案例分析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,感兴趣的朋友跟随小编一起看看吧
    2024-08-28

最新评论