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

2016-02-19 23:25 13 1 收藏

在这个颜值当道,屌丝闪边的时代,拼不过颜值拼内涵,只有知识丰富才能提升一个人的内在气质和修养,所谓人丑就要多学习,今天图老师给大家分享CSS:闭合元素和浮动元素的差别,希望可以对大家能有小小的帮助。

【 tulaoshi.com - Web开发 】

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)提示:本文不是教程,而是对闭合浮动元素的方法在某个特定情况下的现象的讨论,涉及float、clear、overflow、:after等知识,新手勿入。


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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)利用浮动子元素后的元素清除浮动(包括添加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"
    p class="div2p"div2内p1/p
    p class="div2p"div2内p2/p
     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,当然这可能影响到结构,还需要结合具体情况来决定。 

来源:http://www.tulaoshi.com/n/20160219/1629894.html

延伸阅读
标签: Web开发
按照CSS规范,浮动元素(floats)会被移出文档流,不会影响到块状盒子的布局而只会影响内联盒子(通常是文本)的排列。因此当其高度超出包含容器时,一般父容器不会自动伸长以闭合浮动元素。但是有时我们却需要这种自动闭合行为,具体如何处理呢? 有一种做法就是在父容器内再插入一个额外的标签,并令其清除浮动(clear)以撑大父容...
标签: Web开发
关于闭合浮动元素(clearing float)的方法现在已经很多了,个人认为简单实用的方法就是使用:after伪类动态的嵌入一个用于清除浮动的元素,可惜代码量太大了,看上去不够简洁。 这一方面的原理是,外围元素之所以不能很好的延伸,问题出在了overflow上,因为overflow不可见(见W3C的解释)。现在只要将给外围元素添加一个overflow:aut...
标签: Web开发
一、float 闭合(清除浮动) 将以下代码加入Global CSS 中,给需要闭合的div加上 class="clearfix" 即可,屡试不爽. style .clearfix:after { content:"."; display:block; height:0; clear:both; visibility:hidden; } .clearfix { display:inline-block; } .clearfix {display:bl...
标签: Web开发
IE捉迷藏bug(peek-a-boo),之所以起这个名称是因为在某些条件下文本看起来消失了,只有在重新装载页面时才再度出现。出现这个bug的条件是:一个浮动元素后而跟着一些非浮动元素,然后是一个清理元素,所有这些元素都包含在一个设置了背景颜色或图像的你元素中。如果清理元素砬到了浮动元素,那么中间的非浮支元素看起来消失了,隐到了父...
标签: Web开发
当元素设置浮动(float)后会被移出文档流,相信大家都会经常遇到这样的问题。 这问题的解决办法有N种之多,因为每种浏览器对CSS的解析各异,所以在不同浏览器使用清除浮动的元素也会有所不同。 我认为目前还没有最好的清除浮动元素或组合,而是根据情况分析而选择,最好的清除浮动元素或组合。 为了兼容不同浏览器,可能要使用不同的清除...

经验教程

930

收藏

79
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部