杨的空间
业精于勤,荒于嬉,行成于思,毁于随

浮动模型的问题
(The
Float Model
Problem)

 
 
 
Moz/N7 与 Opera 6/7.1, Windows

Internet Explorer 5.5, Windows
(区块模块的尺寸不对
且有 3px 的
bug-space


Internet Explorer 6, Windows
(显示 3px bug-space)


Internet Explorer 5, Mac
(显示 IE5/mac
float/div bug


Opera 7, Windows

什么是浮动模型?

好的,我们要针对固定(static)元素与浮动(float)元素如何互动做个测试。根据 W3C 的规定,当浮动元素后面紧跟着固定元素(在一般的布局流下)时,浮动元素会以包含浮动元素的对象(在此是“body”元素)的左侧作为显示区块的基准,固定元素也会套用相同的基准,并且与浮动元素处在相同的重直高度。

除非固定元素设定左边界(margin)让自己往右边靠,而不被浮动元素挡住,否则浮动元素应该会覆盖住固定元素。你也可以利用 clear:left 或 clear:both 等属性来“清除”固定元素,让固定元素放置在浮动元素的下层。

测试细节

如图,带有绿色边框(border)的区块(div#left)在“body”里往左浮动,后面接着紫色区块(div#static)。如果 div#static 没有设定宽度,从大部分的浏览器都能显示正常,即绿色边框区块叠在紫色区块上。

但是因为 div#static 已经指定宽度,各家浏览器的差异就很明显了。Internet Explorer 会将浮动元素视为 body 左侧边界的一部份,而让 div#static 放在 div#left 右侧。Moz/N7Op6/7.1 则按照规格,让两个区块都固定在 body 的左侧边界上。

这有什么关系

在制作复杂的浮动式版面时,通常需要指定一些区块的宽度。但如果浮动区块后面接着固定区块时,IE 的表现方式就跟其它敢于遵从标准的浏览器不一样。差别如此之大,让人不得不正视这个问题。(除非你是哈利波特里法力无边的 *那个人(you know who)*)

解决这个问题有好几种方法。其中之一是只帮 IE 写程序,即使知道在少数浏览器下会烂掉。或是避免使用宽度指定,让许多形式的版面都变成“禁区”。

IE 不再孤独了

不过这种烦人的局面好象有越演越烈的趋势。Opera7(发行于 2003 年 1 月)做了跟 IE 一样的蠢事。 Opera7 本来该像 Opera6 一样,让 div#static 以视区(viewport)最左边当作基准,忽略浮动元素的存在。结果 Opera7 却把 div#static 并列于浮动元素旁边。

就我个人看来,这代表 Opera 的决策者决定认输,与其固守标准规格,不如选择“好走的路”。微软确实很有影响力,显然地浮动元素的标准快行不通了。我想所谓的标准规格,大概只要比尔盖兹点头说是的就是了。

可喜的是 Opera 7.1 (发行于2003年4月)正确地遵从了浮动的标准。

最后的感想

我没有洁癖,能够跟微软设计的规格愉快相处。但是当微软公开支持某些规格,然后又暗地里嘲弄它们,这就让我无法忍受。这样子会有什么未来?

这些问题在过去已经被一讲再讲。亲爱的读者,如果你有任何可以跟微软高层联络的管道,拜托你看看能不能探到一些未来动向的小道消息。我已经开始担心在那个新玩艺儿中,简洁明了的 CSS 无法以其“应有”的方式使用。 因为最大的浏览器厂家拒绝以正确的方式读取它。这种僵局总是要解决的;那为我们为什么不现在就一步到位呢?


Holly 'n John   e-mail © positioniseverything
最后修改日期: April 23, 2003
写于 January 28, 2003

繁体中文翻译:acer
简体中文翻译: onestab

posted on 2005-12-13 15:43 阅读(524) 评论(0)  编辑 收藏 引用 所属分类: WEB标准相关(DIV+CSS)
只有注册用户登录后才能发表评论。