13.5 CSS浮动

除了上面所讲的定位模型之外,还有一种非常重要的定位模型就是浮动模型。浮动元素不占任何正常文档流空间,但浮动元素的定位还是基于正常的文档流,从文档流中抽出并尽可能远地移动至左侧或者右侧。文字内容会围绕在浮动元素周围,当一个元素从正常文档流中抽出后,仍然在文档流中的其他元素将忽略该元素并填补它原先的空间。

如图13-12所示,当把框1向右浮动时,它脱离文档流并且向右移动,直到它的右边缘碰到包含框的右边缘。

而在图13-13中,当把框1向左浮动时,它脱离文档流并且向左移动,直到它的左边缘碰到包含框的左边缘。因为它不再处于文档流中,所以它不占据空间,实际上覆盖住了框2,使框2从视图中消失。如果把所有三个框都向左浮动,那么框1向左浮动直到碰到包含框,另外两个框向左浮动,直到碰到前一个浮动框。

figure_0479_0362

图 13-12 向右浮动的元素

figure_0479_0363

图 13-13 向左浮动的元素

如果包含块太窄,无法容纳水平排列的三个浮动元素,那么其他浮动块向下移动,直到有足够空间的地方(如图13-14所示)。如果浮动元素的高度不同,那么当它们向下移动时可能会被其他浮动元素“卡住”。

figure_0479_0364

图 13-14 如果没有足够的水平空间,浮动元素将向下移动,直到有足够空间的地方

因此,浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。因为浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样。

13.5.1 float属性

float属性定义了元素在哪个方向浮动,取值如表13-16所示。

figure_0480_0365

以往这个属性总是应用于图像,使文本围绕在图像周围,不过在CSS中,任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身是何种元素。

如果浮动非替换元素,则要指定一个明确的宽度;否则,它们会尽可能地窄。假如在一行之上只有极少的空间可供浮动元素,那么这个元素会跳至下一行,这个过程会持续到某一行拥有足够的空间为止。代码清单13-4展示了一个图像浮动的例子:

代码清单13-4 float属性的使用例子


<html xmlns="http://www.w3.org/1999/xhtml">

<head id="Head1"runat="server">

<title>测试页面</title>

<style type="text/css">

body

{

font-size:12px;

}

img

{

float:left;

border:solid 1px black;

padding:5px;

margin:5px;

width:120px;

height:100px;

}

</style>

</head>

<body>

<img src="cs.jpg"alt="易学C#"/>

C#语言是微软公司近几年推出的一种新型的完全面向对象的程序设计语言,到目前为止,它已经成为了应用软件开发的主流语言,尤其是在Web开发方面更是无与伦比。UML则是面向对象软件的标准化建模语言,无论企业信息系统、基于Web的分布式系统还是实时系统等都适合于使用UML来进行建模分析。本书正是C#与UML融合的产物,书中不仅阐述了C#语言的编程基础知识与高级特性,而且还阐述了如何利用UML图形来进行面向对象的分析与设计。本书旨在帮助读者在较短的时间里对C#语言与UML得到全面深刻的理解与认识,从而使读者将C#与UML融合到一起,为读者以后的软件设计生涯打下坚实的基础……

</body>

</html>


在代码清单13-4中,我们在img样式里定义了图像的浮动float属性的值为left,在这种情况下,图片向左浮动,使得周围的内容流向右边然后包围它的下方。而且,当改变浏览器窗口大小时,保存文本的“方框”的大小也随之动态地调整。运行结果如图13-15所示。

figure_0481_0366

图 13-15 代码清单13-4运行结果

13.5.2 clear属性

float属性的一个同伴是clear属性,它控制跟随一个浮动的元素的位置。这个属性用来防止内容跟随一个浮动的元素,迫使它移动到浮动的下一行。clear属性取值如表13-17所示。

figure_0481_0367

有趣的是,clear属性并不像人们认为的那样,仅限于非浮动元素;相反,它还可以用来控制浮动元素的行为,把一个浮动元素推到其他浮动元素下面。为了能够演示clear属性,在代码清单13-4的body标签中再加一个相同的img标签,并且该标签同样使用img样式(浮动),即代码如下:


<body>

<img src="cs.jpg"alt="易学C#"/>

<img src="cs.jpg"alt="易学C#"/>

C#语言是微软公司近几……

</body>


运行上面的代码,因为两个img标签同样都使用img样式,即都是浮动元素,所以结果如图13-16所示。

现在来改变图13-16这种浮动效果,在img样式里添加一个clear属性“clear:left”,即在左侧不允许浮动元素。img样式代码如下所示:


img

{

float:left;

clear:left;

border:solid 1px black;

padding:5px;

margin:5px;

width:120px;

height:100px;

}


这样,所有图片都向左浮动。clear的使用情况:第二幅图片的left属性被推到第一幅图片下面,建立一种垂直结构。注意,第一幅图片也使用了clear属性,但因为它上面没有图片,所以没有产生效果。当然,这里的float属性同样也能够保证页面中的文本块围绕在图片栏周围。运行结果如图13-17所示。

figure_0482_0368

图 13-16 两个图片浮动的运行结果

figure_0482_0369

图 13-17 添加“clear:left”后的运行结果

13.5.3 用float和clear创建三栏动态布局

网页的三栏布局是目前最常见的页面布局方法,一般情况下,主要页内容放在中间一栏,边上的两栏放置导航链接之类的内容。基本布局一般是在标题之下放置三栏,三栏占据整个页面的宽度,最后在页的底端放置页脚,页脚也占据整个页面宽度。下面介绍一种用CSS的float和clear属性来获得三栏动态布局的方法。

页面基本的布局包含五个div:标题、页脚和三栏。标题和页脚占据整个页宽。左栏div和右栏div都是固定宽度的,并且用float属性来把它们挤压到浏览器窗口的左侧和右侧。中栏实际上占据了整个页宽,中栏的内容在左、右两栏之间移动。由于中栏div的宽度并不固定,因此它可以根据浏览器窗口的改变进行必要的伸缩。中栏div的左侧和右侧的内边距属性保证内容安排在一个整齐的栏中,甚至当它伸展到边栏(左栏或者右栏)的底端也是这样。详细页面代码如代码清单13-5所示。

代码清单13-5三栏动态布局例子


<html xmlns="http://www.w3.org/1999/xhtml">

<head id="Head1"runat="server">

<title>测试页面</title>

<style type="text/css">

body

{

margin:0px;

padding:0px;

}

div#header

{

clear:both;

height:50px;

background-color:aqua;

padding:1px;

}

div#left

{

float:left;

width:150px;

background-color:red;

}

div#right

{

float:right;

width:150px;

background-color:green;

}

div#middle

{

padding:0px 160px 5px 160px;

margin:0px;

background-color:silver;

}

div#footer

{

clear:both;

background-color:yellow;

}

</style>

</head>

<body>

<form id="form1"runat="server">

<div id="header">

<h1>

Header文本</h1>

</div>

<div id="left">

Left文本……

</div>

<div id="right">

Right文本……

</div>

<div id="middle">

Middle文本……

</div>

<div id="footer">

Footer文本……

</div>

</form>

</body>

</html>


在代码清单13-5中,HTML代码中各部分出现的顺序是非常重要的。左栏和右栏div必须在中栏之前出现。这样才可以让这两个边栏浮动到它们的位置上(即屏幕两侧),并让中栏的内容“流”入它们之间的空间。如果浏览器在一个或者两个边栏div之前先发现中栏,那么中栏将占据屏幕的一侧或者两侧,这样浮动的部分就会跑到中栏的下面而不是中栏的旁边了。

div#header和div#footer样式中的clear:both声明用来确保浮动部分不会占据标题和页脚的空间。div#header样式中的padding:1px声明用来消除页头背景色中的异常边,如果padding设置为零,那么在Netscape浏览器中就会看到这个异常。

div#left样式中的float:left声明是用来把左栏挤压到左侧。width:150px声明用来设置栏的固定宽度,不过也可以把它的宽度设置为其他具体值。类似地,div#right样式中的float:right声明用来把右栏div挤压到右侧。在本例中,float把左栏和右栏完全挤压到浏览器窗口的左边缘和右边缘。然而,如果这些div被其他div包含,那么float将会把它们挤压到包含它们的div的边缘。

在div#middle样式中,clear声明允许中栏的内容移动在两个边栏之间。“padding:0px 160px 5px 160px”声明设置了中栏的内容到左栏和右栏的内边距,这样允许150px宽度的栏div,再加上10px的间距。

代码清单13-5运行结果如图13-18所示。

figure_0484_0370

图 13-18 代码清单13-5运行结果

虽然,这个例子看起来很粗糙和简单,但是它却很好地演示了用浮动div来创建三栏动态布局这项基本技术。有兴趣的读者可以在此基础之上加以完善来达到实用的效果。