闭合CSS浮动元素技巧剖析

开发 前端
本文向大家描述一下CSS中闭合CSS浮动元素的技巧,CSS浮动元素(floats)会被移出文档流,不会影响到块状盒子的布局而只会影响内联盒子(通常是文本)的排列。

按照CSS规范,CSS浮动元素(floats)会被移出文档流,当其高度超出包含容器时,一般父容器不会自动伸长以闭合CSS浮动元素。但是有时我们却需要这种自动闭合行为,具体如何处理呢?请看本文详细介绍。

闭合CSS浮动元素(floats)技巧

按照CSS规范,CSS浮动元素(floats)会被移出文档流,不会影响到块状盒子的布局而只会影响内联盒子(通常是文本)的排列。因此当其高度超出包含容器时,一般父容器不会自动伸长以闭合CSS浮动元素。但是有时我们却需要这种自动闭合行为,具体如何处理呢?

  ◆有一种做法就是在父容器内再插入一个额外的标签,并令其清除浮动(clear)以撑大父容器。这种方法浏览器兼容性好,没有什么问题,缺点就是需要额外的(而且通常是无语义的)标签,所以我个人不大喜欢。

  ◆后来又有了一种新的方式,使用:after伪类动态的嵌入一个用于清除浮动的元素,这种方法和上一种原理一样,不同的只是把这个额外的内容用CSS生成,但考虑到IE不支持:after不得不做了不少的hack。这种方法兼容性一般,但经过各种hack也可以应付不同浏览器了,同时又可以保证html比较干净,所以用得还是比较多的。

  ◆再后来又有人发现将父容器的overflow设为除visible之外的值就可以在标准兼容浏览器中闭合CSS浮动元素,IE自然又是不支持的,所以这种方法和上一种方法一样都对IE做了不同处理(具体就是触发layout),不同的就是overflow没有:after伪类那么麻烦了,缺点也有,overflow可能会产生一些小冲突。

  在使用overflow之前还有过一种使用float的方法,就是让父容器也浮动,这利用到了CSS浮动元素的一个特性——CSS浮动元素会闭合CSS浮动元素。这种方式在IE/Win和标准兼容浏览器中都有较好的效果,但缺点也很明显——父容器未必想浮动就浮动的了,毕竟浮动是一种比较特殊的行为,有时布局不允许其浮动也很正常。使用float虽然在IE和标准兼容浏览器中都能闭合CSS浮动元素,但原理却是不同的,IE/Win中float触发了layout因而闭合了浮动,而在标准兼容浏览器中,float其实和上一种方法中的overflow原理一样,产生了一个“块级格式化范围”——这是CSS规范中提到的一种现象,它往往具有某种独立性,特性之一就是会自动闭合内部的CSS浮动元素。

按照规范,以下类型的元素会产生一个块级格式化范围:

  ◆CSS浮动元素,left或者right皆可。

  ◆绝对定位的元素。

  ◆inline-block元素,不过这个gecko目前不支持。

  ◆table-cell类型元素,其实table,table-head-group,table-row什么的也都可以,还有inline-table(gecko不支持)也同样,因为他们都会间接产生一个匿名的table-cell。

  ◆overflow取值非visible的元素。

  所以,原来在标准兼容浏览器中我们也可以有这么多的方法闭合一个CSS浮动元素,而且只需要CSS,无需其他。顺带说一下以上除了overflow,其余都有一个附加效果就是自动收缩父容器宽度。

而对于IE/Win,它有一套自己的体系,就是layout,具有layout的元素会自动闭合CSS浮动元素,再来看看触发layout的CSS属性,会发现和上面的块级格式化范围有很多类似之处:

  ◆CSS浮动元素

  ◆绝对定位元素

  ◆display:inline-block

  ◆zoom

  ◆width/height

  ◆overflow/overflow-x/overflow-y[IE7新增]

  ◆max/min-width/height[IE7新增]

  以上来看IE中闭合CSS浮动元素的方法也不少,自然也都有其局限性,要么有附带效果,要么使用的是非标准属性(无法通过验证)。

  还要提一点的是display:inline-block,这个属性对IE而言本身没什么用,实际效果只是给一个元素暗地添加了layout,但是标准兼容浏览器是认得这个属性的,所以要不影响这些浏览器,需要将display设回默认。这里IE有一个bug,如果先定义了display:inline-block,然后再将display设回block(这两个display要先后放在两个CSS声明中才有效果),那么layout不会消失,同时也不会影响其他浏览器,所以目前来说,这也算一个不错的触发layout的方法:

  .gainlayout{display:inline-block;}

  .gainlayout{display:block;}

  所以要跨浏览器闭合CSS浮动元素,可以选择的方式还是很多的,如何搭配使用这些CSS属性就要具体情况具体分析了,灵活应用条件注释也很有必要,要是实在不行我们回过头来还有clear可以用嘛。

【编辑推荐】

  1. DIV+CSS滑动门技术简介
  2. 畅谈DIV排版和table排版的区别
  3. 14大CSS工具提高网页设计效率
  4. 实现DIV图片居中方法揭秘
  5. 鼠标经过时改变DIV背景颜色的三种途径

 

责任编辑:佚名 来源: IT168.com
相关推荐

2010-09-02 14:17:56

CSS浮动

2010-09-06 12:32:10

CSS伪元素

2010-08-26 15:18:27

CSS样式

2010-08-31 10:17:52

CSSmargin边界叠加

2010-08-31 10:11:50

divuldl

2010-09-02 15:32:51

CSSfloat

2023-05-15 08:34:36

css浮动

2013-03-28 11:02:26

CSS浮动

2010-09-06 13:04:16

CSS浮动float

2010-08-30 15:26:13

floatCSS

2020-08-18 08:08:59

CSS伪元素伪类

2010-08-24 16:17:27

CSS简写

2011-05-12 10:48:49

CSS清理浮动

2010-09-14 17:07:26

DIV浮动定位CSS

2014-03-17 09:34:01

HTMLHTML闭合

2010-08-23 10:04:48

CSS浮动

2010-08-12 11:34:15

Flex数据绑定

2010-01-25 17:43:13

Android资源

2010-01-13 15:52:59

VB.NET浮动窗体

2010-06-09 10:17:19

UML类图元素
点赞
收藏

51CTO技术栈公众号