什么是浮动模型?
好的,我们要针对固定(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/N7 和 Op6/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