驰骋页面,谁主沉浮-也谈清除浮动

CSS中浮动的主要目的有两种,一是为了实现文字绕排图片的效果,而是为了创建多栏布局。不得不说浮动浮动和清除是用来组织页面布局的一柄利剑,这柄剑的剑刃就是 float 和 clear属性。稍有不慎,剑走偏锋,页面就会变得满目疮痍,只有洞悉背后的玄机,方能游刃有余。

  大家都知道浮动元素会脱离常规文档流,原来紧跟其后的元素就会在空间允许的情况下,向上提升到与浮动元素平起平坐。下面举例说明浮动布局以及清除浮动主要剑法。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>清除浮动</title>
  6. <style type="text/css">
  7. *{margin: 0;padding: 0;}
  8. #wrapper{margin:10px;border:3px solid;}
  9. p{border:1px solid red;}
  10. /*img{float: left;}*/
  11. </style>
  12. </head>
  13. <body>
  14. <div id="wrapper">
  15. <p>工欲善其事必先利其器,首先你会要用豆瓣,那里可以找到很多装逼者,共同学习,共同进步,豆瓣是个好东西,装逼必备啊。</p>
  16. <img src="test1.jpg" />
  17. <p>世界上总是有那么群爱装b的人,所以才有这篇不完全装b手册,为什么不完全呢?因为装的艺术是要表现在你生活的方方面面的.</p>
  18. <p>唐代非著名诗人章碣曾很感慨地说“刘项原来不读书”,如果能做到刘邦、项羽这么牛b的人,是不需要靠读书来装的,但一个社会同时只能容纳一个这种牛人,不可能实现大家共同装b的愿望,不利于和谐社会的建立,所以这里不推荐。</p>
  19. </div>
  20. </body>
  21. </html>

原始的页面如下图所示,页面由三个段落和一个img构成,为了方便查看,这里给父包围元素和段落添加了一个边框,由于p是块状元素,所以段落显示在图片下方。

现在将图片设置为向左浮动

  1. img{float: left;}

可以看到图片下方的段落文字环绕图片排列。这里还可以得出一个结论,浮动的元素对其前面的同胞元素是没有影响的,不像绝对定位那样,如果left和top值设置的不合适会遮蔽前面的元素。现在如果我们不想让最后一段文字环绕图片,该怎么做呢?这时就要用到clear属性了。clear取值为下面三种

  1. clear:left | right | both

为了清除图片的左浮动对后面同胞元素的影像,需要在受影响的后面的同胞元素上添加clear样式。

  1. #wrapper p:last-of-type{clear: left;}//仅作演示用,未考虑老旧浏览器的兼容性

当然这里clear取值为both也能清除左浮动的影响。



 现在我们看到最后的段落不再环绕图片了而是显示在图片下方。目前为止,上文已经介绍了float可clear的用法。所以是不是已经讲完了,该下班了!

Hold on,高潮才刚刚开始,现在我们做一个小测试,把最后一段文字的p标签移出来放在外包围div标签的下方,并且别忘了把前面清除浮动的css语句删除还原。html代码变成下面这样:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>清除浮动</title>
  6. <style type="text/css">
  7. *{margin: 0;padding: 0;}
  8. #wrapper{margin:10px;border:3px solid;}
  9. p{border:1px solid red;}
  10. img{float: left;}
  11. </style>
  12. </head>
  13. <body>
  14. <div id="wrapper">
  15. <p>工欲善其事必先利其器,首先你会要用豆瓣,那里可以找到很多装逼者,共同学习,共同进步,豆瓣是个好东西,装逼必备啊。</p>
  16. <img src="test1.jpg" />
  17. <p>世界上总是有那么群爱装b的人,所以才有这篇不完全装b手册,为什么不完全呢?因为装的艺术是要表现在你生活的方方面面的.</p>
  18. </div>
  19. <p>唐代非著名诗人章碣曾很感慨地说“刘项原来不读书”,如果能做到刘邦、项羽这么牛b的人,是不需要靠读书来装的,但一个社会同时只能容纳一个这种牛人,不可能实现大家共同装b的愿望,不利于和谐社会的建立,所以这里不推荐。</p>
  20. </body>
  21. </html>



 完成操作以后,页面变成上面的挫样,仔细观察会发现,外包围的div元素没能包裹住图片元素,这种情况也被一些人叫做父元素高度塌陷。原因是浮动元素脱离了文档流,其父元素也看不到它了,因而也不会包围它。这种情况一般并不是我们想要的,下面向大家传授几种让父包裹元素重新包围住子元素的剑法。

  •  方法一:设置父包裹元素overflow:hidden
  1. <style type="text/css">
  2. *{margin: 0;padding: 0;}
  3. #wrapper{margin:10px;border:3px solid; overflow: hidden;}
  4. p{border:1px solid red;}
  5. img{float: left;}
  6. </style>

现在我们看到最后一段文字已经跑到上一个div的后面了,实际上,overflow:hidden 声明的真正用途是防止包含元素被超大内容撑大。应用overflow:hidden 之后,包含元素依然保持其设定的宽度,而超大的子内容则会被容器剪切掉。除此之外,overflow:hidden 还有另一个作用,即它能可靠地迫使父元素包含其浮动的子元素。至于这种用法为什么会起到这种作用,是因为该设置触发了元素的Block formatting contexts(块级格式化上下文),简称 BFC,这个机制比较复杂,感兴趣的朋友可以找资料研究研究。

  • 方法二:同时浮动父元素

第二种促使父元素包围其浮动子元素的方法,是也让父元素浮动起来。

  1. #wrapper{margin:10px;border:3px solid;float: left;}

结果和上图一致,可自行校验。

  • 方法三:添加非浮动的清除元素

3第三种强制父元素包含其浮动子元素的方法,就是给父元素的最后添加一个非浮动的子元素,然后清除该子元素。由于包含元素一定会包围非浮动的子元素,而且清除会让这个子元素位于(清除一侧)浮动元素的下方,因此包含元素一定会包含这个子元素——以及前面的浮动元素。在包含元素最后添加子元素作为清除元素的方式有两种。

(1)第一种方式不太理想,也就是简单地在 HTML 标记中添加一个子元素,并给它应用clear 属性。由于没有默认的样式,不会引入多余空间,div 元素很适合这个目的。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>清除浮动</title>
  6. <style type="text/css">
  7. *{margin: 0;padding: 0;}
  8. #wrapper{margin:10px;border:3px solid;}
  9. p{border:1px solid red;}
  10. img{float: left;}
  11. .clear_me{clear: left;}
  12. </style>
  13. </head>
  14. <body>
  15. <div id="wrapper">
  16. <p>工欲善其事必先利其器,首先你会要用豆瓣,那里可以找到很多装逼者,共同学习,共同进步,豆瓣是个好东西,装逼必备啊。</p>
  17. <img src="test1.jpg" />
  18. <p>世界上总是有那么群爱装b的人,所以才有这篇不完全装b手册,为什么不完全呢?因为装的艺术是要表现在你生活的方方面面的.</p>
  19. <div class="clear_me"></div>
  20. </div>
  21. <p>唐代非著名诗人章碣曾很感慨地说“刘项原来不读书”,如果能做到刘邦、项羽这么牛b的人,是不需要靠读书来装的,但一个社会同时只能容纳一个这种牛人,不可能实现大家共同装b的愿望,不利于和谐社会的建立,所以这里不推荐。</p>
  22. </body>
  23. </html>

(2)给父包裹元素添加:after 伪元素

这里不妨给父包裹元素添加一个clearfix的class属性

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

它只添加了一个清除的包含句点作为非浮动元素(必须得有内容,而句点是最小的内容)。规则中的其他声明是为了确保这个伪元素没有高度,而且在页面上不可见。由于IE6-7不支持:after,使用 zoom:1触发 hasLayout。这个方法是目前最被推荐的一种方法了。需要注意的是after 会在元素内容后面而不是元素后面插入一个伪元素。

这里在延伸一下,如果这里没有父包裹元素

这三种方法的使用要因地制宜。比如,不能在下拉菜单的顶级元素上应用overflow:hidden,否则作为其子元素的下拉菜单就不会显示了。因为下拉菜单会显示在其父元素区域的外部,而这恰恰是 overflow:hidden 所要阻止的。再比如,不能对已经靠自动外边距居中的元素使用“浮动父元素”技术,否则它就不会再居中,而是根据浮动值浮动到左边或右边了。总之,掌握了这三种技术之后,再碰到需要包围浮动元素的情况,你就能够游刃有余了。

没有父元素时如何清除
有时候,在清除某些浮动元素时,不一定正好有那么个父元素可以作为容器来强行包围它们。此时,最简单的办法就是给一个浮动元素应用 clear:both,强迫它定位在前一个浮动元素下方。然而,在空间足以容纳多个元素向上浮动时,这个简单的办法未必奏效,我们还得另辟蹊径。为了演示这种情况,我们在最后一个段落前面再增加一个img。这个页面布局是通过浮动图片实现的,因此在标记中跟在图片后面的文本会向上走,停靠在浮动图片的右侧。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>清除浮动</title>
  6. <style type="text/css">
  7. *{margin: 0;padding: 0;}
  8. #wrapper{margin:10px;border:3px solid;}
  9. p{border:1px solid red;}
  10. img{float: left;}
  11. </style>
  12. </head>
  13. <body>
  14. <p>工欲善其事必先利其器,首先你会要用豆瓣,那里可以找到很多装逼者,共同学习,共同进步,豆瓣是个好东西,装逼必备啊。</p>
  15. <img src="test1.jpg" />
  16. <p>世界上总是有那么群爱装b的人,所以才有这篇不完全装b手册,为什么不完全呢?因为装的艺术是要表现在你生活的方方面面的.</p>
  17. <img src="test1.jpg">
  18. <p>唐代非著名诗人章碣曾很感慨地说“刘项原来不读书”,如果能做到刘邦、项羽这么牛b的人,是不需要靠读书来装的,但一个社会同时只能容纳一个这种牛人,不可能实现大家共同装b的愿望,不利于和谐社会的建立,所以这里不推荐。</p>
  19. </body>
  20. </html>



 由于第二段文字下方有空间,所以第二张图片及说明文字会上浮到第二张图片右侧,这不是我们想要的结果。我们的目标是让每段文字停靠在相应的图片旁边。然而,第二段文字太短了,都没有够到第二张浮动图片的下沿。这就给下一对儿图片/段落向上浮动留出了空间。由于每一对儿图片/段落都没有包含元素,在此就无法使用前面讨论的“强制父元素包围”的战术。不过,照样可以使用 clearfix 规则!只不过这次是将clearfix类加在段落上

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>清除浮动</title>
  6. <style type="text/css">
  7. *{margin: 0;padding: 0;}
  8. #wrapper{margin:10px;border:3px solid;}
  9. p{border:1px solid red;}
  10. img{float: left;}
  11. .clearfix:after{
  12. content: ".";
  13. display: block;
  14. height: 0;
  15. visibility: hidden;
  16. clear: both;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <p>工欲善其事必先利其器,首先你会要用豆瓣,那里可以找到很多装逼者,共同学习,共同进步,豆瓣是个好东西,装逼必备啊。</p>
  22. <img src="test1.jpg" />
  23. <p class="clearfix">世界上总是有那么群爱装b的人,所以才有这篇不完全装b手册,为什么不完全呢?因为装的艺术是要表现在你生活的方方面面的.</p>
  24. <img src="test1.jpg">
  25. <p class="clearfix">唐代非著名诗人章碣曾很感慨地说“刘项原来不读书”,如果能做到刘邦、项羽这么牛b的人,是不需要靠读书来装的,但一个社会同时只能容纳一个这种牛人,不可能实现大家共同装b的愿望,不利于和谐社会的建立,所以这里不推荐。</p>
  26. </body>
  27. </html>



 在每个段落内容的最后添加了“清除子元素”,我们想要的布局效果实现了。因为第三对儿图片和段落前面增加了一个清除元素,所以它们就不能再往上走了。注意,我没有只给第二个段落添加 clearfix 类,而是每个段落都加上了一个。如果是真正的网站开发,就得这么做啊。这样,无论将来哪个段落的文本高度低于图片了,页面布局都不会被破坏。

清除浮动问题,还有一些其他的方法,但是最常用的就是这三种,如果读者想掌握更多的方法,可以参考文献。

参考:

《CSS设计指南-第三版》

那些年我们一起清除过的浮动

来自为知笔记(Wiz)

时间: 2024-09-29 23:54:08

驰骋页面,谁主沉浮-也谈清除浮动的相关文章

CSS那些事儿-阅读随笔3(清除浮动)

浮动主要是由浮动(float)属性导致的页面错位现象,清除浮动不仅能解决页面错位的现象,还可以解决子元素浮动导致父元素背景无法自适应子元素高度的问题.在CSS样式中,主要利用clear属性中的both.left和right 3个属性值清除由浮动产生的左.右浮动效果. 一.浮动现象例子 下面举一个很简单的浮动的例子,假设一个float_box(背景色为#aff)中包含两个div,且一个是左浮动(float:left),另一个是右浮动(float:right).在float_box外再添加一个没有浮

浮动与清除浮动

float 先来了解一下block元素和inline元素在文档流中的排列方式. block元素通常被现实为独立的一块,独占一行,多个block元素会各自新起一行,默认block元素宽度自动填满其父元素宽度.block元素可以设置width.height.margin.padding属性: inline元素不会独占一行,多个相邻的行内元素会排列在同一行里,直到一行排列不下,才会新换一行,其宽度随元素的内容而变化.inline元素设置width.height属性无效 常见的块级元素有 div.for

web前端入门到实战:css浮动的特性,与浮动带来的影响以及如何清除浮动

块元素在文档流中默认垂直排列,所以多个div从上至下依次排开 如果希望块元素在页面中水平排列,可以使用float来使元素浮动,从而脱离文档流,元素脱离文档流以后,它下边的元素会立即向上移动 css浮动的特性 1.浮动的元素不会盖住文字,文字会自动环绕在浮动元素的周围 2.元素浮动以后,会尽量向页面的左上或这是右上漂浮,直到遇到父元素的边框或者其他的浮动元素 3.如果浮动元素上边是一个没有浮动的块元素,则浮动元素不会超过块元素 4.浮动的元素永远不会超过他上边的兄弟元素,最多一边挤 5.块元素脱离

页面布局中常用的清除浮动的方法

我们在页面布局时,基本上都避免不了使用float,但由此也会引发一些问题,尤其是在容器高度不固定时,此时它的高度完全是由内部的元素撑开的.如果内部元素还是浮动的,那么由于内部的元素脱离了文档流,父容器就不能被撑开了.如果父容器设置的有背景或者边框的话,此时就不能正常显示了,另外,父容器下边的其他容器或内容也会跟着向上"浮", 占据上面的子容器应该占据的位置.那么,这时就需要清除浮动了. 这里总结的几种的方法主要就是针对类似于上面的问题的,但也不仅限于以上问题.主要有以下几种方法: 1.

【转】浅谈 CSS 清除浮动的 6 种方法

转载:浅谈 CSS 清除浮动的 6 种方法 在开发网页的时候经常需要用到各种浮动,此时便需要及时的清除浮动,否则将会导致布局出现问题 引出问题: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> .outer{ border: 1px solid black;

利用伪对象选择器E:after实现清除浮动效果

利用伪对象选择器E:after实现清除浮动效果:关于清除浮动已经是老生畅谈的问题,文章实在是太多了,几乎已经被谈烂了.这当然是因为浮动是不居中必须要用到的技巧,那么清除浮动自然也是必须的,但是本章节还是要啰嗦一下,再次介绍一下清除浮动的方法的一种,因为它会用到之前比较少见的伪对象选择器,希望能够引起大家的注意.先看一段代码实例: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> &

关于浮动与清除浮动

页面布局方式,主要包含:文档流.浮动层.float属性. ?html页面的标准文档流(默认布局)是:从上到下,从左到右,遇块(块级元素)换行. ?浮动层:给元素的float属性赋值后,就是脱离文档流,进行左右浮动,紧贴着父元素(默认为body文本区域)的左右边框.而此浮动元素在文档流空出的位置,由后续的(非浮动)元素填充上去:块级元素直接填充上去,若跟浮动元素的范围发生重叠,浮动元素覆盖块级元素.内联元素:有空隙就插入. ?float属性包括left(元素向左浮动).right(元素向右浮动).

css清除浮动的方法总结

在各种浏览器中显示效果也有可能不相同,这样让清除浮动更难了,下面总结8种清除浮动的方法,测试已通过 ie chrome firefox opera,需要的朋友可以参考下 清除浮动是每一个 web前台设计师必须掌握的机能.css清除浮动大全,共8种方法. 浮动会使当前标签产生向上浮的效果,同时会影响到前后标签.父级标签的位置及 width height 属性.而且同样的代码,在各种浏览器中显示效果也有可能不相同,这样让清除浮动更难了.解决浮动引起的问题有多种方法,但有些方法在浏览器兼容性方面还有问

css浮动(folat),清除浮动(clear)

css浮动(float) float是css样式,用于设置标签的居左浮动和居右浮动,浮动后的元素不属于html文档流,需要用清除浮动把文档拽回到文档流中 浮动值: left:向左浮动 right:向右浮动 html文档流:自窗体自上而下分成一行一行,并在没行中从左到右的顺序排放元素. 通过例子来解释浮动 1.页面上有两个块元素,每个块元素独占一行 2.我们希望他们能并排显示,这是就可以使用float,我们先给红色的div加float:left,发现两个是在一行了,但是他们重叠在了一起. 3.这是