日期:2013-11-04  浏览次数:20942 次

Web建造者要对付的最棘手情况之一是:相反的CSS代码被不同的浏览器解释后会生成不同的效果。在以前,各种不同的浏览器生成极其不同的页面是随处可见的,而如今我们可以用所谓的符合标准的浏览器获得更好的效果。然而,显示效果的差别还是无法避免。

当前处于领导地位的一些浏览器在处理浮动效果上就存在着这样的差别。如果有人想创建一个能够随着浏览器窗口的大小变化而动态更改大小多栏的规划,那么这将是一个特别麻烦的问题。

简单的没有浮动的页面

假设你有两个div——div#one和div#two,它们都有固定的宽度。如果没有浮动或者绝对的定位,这些div就会以一个摞在另一个之上的方式放在浏览器窗口的左侧(如例A所示),由于标准的页面安排顺序是从左到右,从上到下,块级元素(block-level element)都会在前一个元素下面紧接着开始一个新的行。

下面是所有例子都需求的一段HTML:

<body>
<div id="one">
    Port side text...
</div>
<div id="two">
    Second column text...
</div>
</body>

下面的CSS代码用于基本的、不带浮动的版本:

div#one {
    width: 150px;
    margin: 0px;
    background-color: red;
}
div#two {
    width: 300px;
    padding: 0px 10px 5px 10px;
    margin: 0px;
    background-color: silver;
}

基本的浮动
当你创建一个包含有float: left或者float: right属性的CSS款式,并把它使用到诸如div标签这样的块级元素上的时候,div就会从文档的普通文本安排顺序里被删除,并被强制放到包含元素(containing element)的左侧或者右侧。如果包含元素是一个主体标签,那么div就会浮动到浏览器窗口的一侧。否则,浮动的div就会挪动到包含div的边缘,而以前是不会这样的。

如果你有一个以上的浮动元素,那么第二个和随后的浮动元素会紧接着第一个排成一条,其陈列方式非常像文本里的一行字母。一系列浮动元素会对齐成一行,直到撑满浏览器窗口的整个宽度,然后换到下一行,就像段落里的文字那样陈列。

固定宽度的浮动
只需div#one和div#two具有固定宽度,而且其总宽度小于浏览器窗口的宽度,它们就会像例B所示的那样紧挨着排在一同。几个大的浏览器在处理固定宽度浮动的方式上保持着相当的分歧性。下面的CSS代码所生成的页面在IE6、Netscape 7、Mozilla 1和Opera 7里显示出来是如出一辙的。

 
div#one {
    float: left;
    width: 150px;
    margin: 0px;
    background-color: red;
}
div#two {
    float: left;
    width: 300px;
    padding: 0px 10px 5px 10px;
    margin: 0px;
    background-color: silver;
}

可变宽度的浮动带来了可变的结果
当你想把div变成宽度可变的时候,生成浮动效果不分歧的问题就浮现出来了。例如,假设你想要在页面的左侧放一个固定宽度栏,用于导航按钮的列表,而想在右侧放另外一个栏,让它依据浏览器窗口(的大小)自在扩展和收缩。

你可能会认为本人用两个左侧浮动的div就能实现这个效果;一个是固定宽度的,而另一个把宽度设定为自动,让div自动调整大小,这样它就能够填补第一个div和浏览器窗口右侧之间的空白。例C就是下面代码显示的结果:

div#one {
    float: left;
    width: 150px;
    margin: 0px;
    background-color: red;
}
div#two {
    float: left;
    width: auto;
    padding: 0px 10px 5px 10px;
    margin: 0px;
    background-color: silver;
}

如果在IE里显示这个例子,你会获得估量的效果,即左边是固定宽度的栏,紧挨着它右侧的是一个可变宽度的栏;但是,相反的代码在其他当前流行的浏览器上却会生成不同的结果。第二个div会掉到第一个的下面,而不是接着这一行放在左边。结果就和不带浮动的页面非常类似。

处理方案
要获得这种两栏规划,其中一栏能够自动调整大小的理想效果的一种处理方案是对第一栏使用浮动div,但是要从必须调整大小的那一栏里把浮动删掉。由于浮动栏和普通的文档安排顺序是分离的,所以常规的div会被放在上方,但是在浮动div的下方。在左边添加一个padding,并让其等于浮动div的宽度,而常规div的内容看起来就会像是放在左边div右侧的一个栏里。例D说明了这个技巧。下面的代码能够在当前所有的浏览器里生成相反的效果。

div#one {
    float: left;
    width: 150px;
    margin: 0px;
    background-color: red;
}
div#two {
    width: auto;
    padding: 0px 10px 5px 160px;
    margin: 0px;
    background-color: silver;
}

虽然当前Netscape/Mozilla浏览器普通都被认为要比IE愈加符合标准,但是我团体认为IE生成浮动元素的效果要比前两个浏览器愈加分歧。但是如果不考虑哪一个生成的效果是“正确的”,那么其差别就会给Web建造者带来最头疼的问题。要避免你的页面设计出现问题,知道浏览器生成的效果会有所不同是第一步,也是最重要的一步。


--------------------------------------------------------------------------------
本文作者:Michael Meadhra在Web发展的最后阶段就在这一领域从事开发。他出版的书已累积几十种,包括即将上市的由Osborne/McGraw-Hill发行的《如何用Dreamweaver MX 2004做到一切(How to Do Everything with Dreamweaver MX 2004)》。