float、clear、position(重点相对定位和绝对定位)用法总结

来源:互联网 发布:淘宝网茶具套装价格 编辑:程序博客网 时间:2024/05/18 13:46

    先来理解CSS的定位机制。CSS 定位机制

    CSS 有三种基本的定位机制:普通流浮动绝对定位

    除非专门指定,否则所有框都在普通流中定位。也就是说,普通流中的元素的位置由元素在 X(HTML) 中的位置决定。

    块级框从上到下一个接一个地排列,框之间的垂直距离是由框的垂直外边距计算出来。

    行内框在一行中水平布置。可以使用水平内边距、边框和外边距调整它们的间距。但是,垂直内边距、边框和外边距不影响行内框的高度。由一行形成的水平框称为行框(Line Box),行框的高度总是足以容纳它包含的所有行内框。不过,设置行高可以增加这个框的高度。


一、float

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

如果浮动非替换元素,则要指定一个明确的宽度;否则,它们会尽可能地窄。

假如在一行之上只有极少的空间可供浮动元素,那么这个元素会跳至下一行,这个过程会持续到某一行拥有足够的空间为止。

其默认值是none。所有主流浏览器都支持 float 属性。

float的属性值有四个,如下:

    left:       元素向左浮动。

    right:  元素向右浮动。

    none:  默认值。元素不浮动,并会显示在其在文本中出现的位置。

   inherit: 规定应该从父元素继承 float 属性的值。

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

以上是W3C中对float的部分解释。

上述文字并不难理解,可以发现float实际上是将块级元素脱离普通文档流,该元素的垂直距离取决于它原来在文档中的位置,顶端与当前行的顶端对齐,而水平方向则尽可能的向容器边缘移动,且仍遵守填充距离padding的设定值。行内元素会将其环绕。

float打破了既定的框的排列顺序,将块级元素漂浮到我们希望它在的位置上。

二、clear

clear 属性规定元素的哪一侧不允许其他浮动元素。

clear 属性定义了元素的哪边上不允许出现浮动元素。在 CSS1 和 CSS2 中,这是通过自动为清除元素(即设置了 clear 属性的元素)增加上外边距实现的。在 CSS2.1 中,会在元素上外边距之上增加清除空间,而外边距本身并不改变。不论哪一种改变,最终结果都一样,如果声明为左边或右边清除,会使元素的上外边框边界刚好在该边上浮动元素的下外边距边界之下。默认值为none,且所有主流浏览器都支持 clear 属性。

    clear可以取的几个属性值:

left 在左侧不允许浮动元素。 

right 在右侧不允许浮动元素。 

both 在左右两侧均不允许浮动元素。 

none 默认值。允许浮动元素出现在两侧。 

inherit 规定应该从父元素继承 clear 属性的值。 

以上为W3Cclear的部分解释。

同时用overflowhidden也可以为标签清除浮动。为什么要清除浮动在下面的例子中会提到。

三、position

position 属性规定元素的定位类型。

这个属性定义建立元素布局所用的定位机制。任何元素都可以定位,不过绝对(absolute)固定元素(fixed)会生成一个块级框,而不论该元素本身是什么类型。相对定位元素(relative)会相对于它在正常流中的默认位置偏移。

position的属性值

absolute生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。

fixed: 生成绝对定位的元素,相对于浏览器窗口进行定位。元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。

relative: 生成相对定位的元素,相对于其正常位置进行定位。因此,"left:20" 会向元素的 LEFT 位置添加 20 像素。

static: 默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)。

inherit 规定应该从父元素继承 position 属性的值。 

 

上述W3Cposition的属性值定义写的很清楚,理解起来没什么障碍。只要注意absolute是相对于父元素来进行定位,这里的父元素指的是也是绝对定位的父元素,如果不存在这样的父元素,就相对于body,即是上文中的“相对于 static 定位以外的第一个父元素进行定位”。而relative相对于元素本来应该在的位置进行的定位。如果元素设置了margin值,那就在margin的基础上进行移动。

相对定位不会将元素脱出普通文档流,将其看做普通流定位的一部分。而设置为绝对定位的元素框从文档流完全删除,并相对于其包含块定位,包含块可能是文档中的另一个元素或者是初始包含块。元素原先在正常文档流中所占的空间会关闭,就好像该元素原来不存在一样。元素定位后生成一个块级框,而不论原来它在正常流中生成何种类型的框。

 

CSS布局是网页排版的一个重要部分,要清晰熟练的掌握这些方法属性必须多加练习,练的多了就有了自己的体会,日积月累便能运用自如。

 

下面举个小例子,看看各种定位方法的效果。

网页中有三块内容,每块放入一个div中,一块为空div(设置了宽高),一块为图片div,一块为文字div。我们可以分别做实验看下效果。我为div加了框便于区分。

代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

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

<head></head>

<body>

<div id="blank"></div>

<div id="image"><img src="cat.jpg" /></div>

<div id="intro">

<p>现在,猫成为了全世界家庭中极为广泛的宠物。研究表明,猫不吃老鼠,夜视能力就会有所下降,会长期丧失夜间活动的能力。德国海德堡大学有一份研究称老鼠体内有一种牛黄酸的物质,可以增强生物的夜视能力,而猫体内不能自己合成该物质,只能通过吃老鼠进行补充。</p>

</div>

</body>

CSS样式表:

1、什么效果都不加,只设置大小

body{ margin: 0; padding: 0;}

div#blank{width:500px; height:200px; border:1px #99CC33 solid; }

div#image{width:500px; height:333px; border:1px #FF0000 solid;}

#intro{ width:700px; border:1px #663366 solid;}



 

2、将blank向左浮起来

body{ margin: 0; padding: 0;}

div#blank{width:500px; height:200px; border:1px #99CC33 solid; float:left;}

div#image{width:500px; height:333px; border:1px #FF0000 solid;}

#intro{ width:700px; border:1px #663366 solid;}

    

    3、用clear清除浮动

body{ margin: 0; padding: 0;}

div#blank{width:500px; height:200px; border:1px #99CC33 solid; float:left;}

div#image{width:500px; height:333px; border:1px #FF0000 solid; clear:both;}

#intro{ width:700px; border:1px #663366 solid;}



 

    4、用overflow清除浮动

body{ margin: 0; padding: 0;}

div#blank{width:500px; height:200px; border:1px #99CC33 solid; float:left;}

div#image{width:500px; height:333px; border:1px #FF0000 solid; overflow:hidden;}

#intro{ width:700px; border:1px #663366 solid;}



 

    5、将前两个div浮起来,文字部分的width拉长,可以看到文字环绕效果。

body{ margin: 0; padding: 0;}

div#blank{width:500px; height:200px; border:1px #99CC33 solid; float:left;}

div#image{width:500px; height:333px; border:1px #FF0000 solid; float:left;}

#intro{ width:1300px; border:1px #663366 solid;}



 

6、将blank设置成相对定位

body{ margin: 0; padding: 0;}

div#blank{width:500px; height:200px; border:1px #99CC33 solid; position:relative; left:100px; top:100px;}

div#image{width:500px; height:333px; border:1px #FF0000 solid; }

#intro{ width:1300px; border:1px #663366 solid;}



 

可以看出blank下移100像素,右移100像素,而其他元素的位置均没变;

7、将image设置成绝对定位

body{ margin: 0; padding: 0;}

div#blank{width:500px; height:200px; border:1px #99CC33 solid;}

div#image{width:500px; height:333px; border:1px #FF0000 solid; position:absolute; top:100px;}

#intro{ width:700px; border:1px #663366 solid;}



 

可以看出image脱出文档流(因为intro元素顶上去了),出现在距离顶部100像素的地方。

 

 

 

在试验中发现,若两张相同的图片放在网页中,将其中一张往左边浮动,不会覆盖另一张,而如果是两块div则会覆盖起来。

你可以尝试修改html,将img标签去掉,用2中的CSS样式,可以发现两块div重叠了。

div中有文字,文字将会环绕浮起来的那块div,你可以将图片去掉,让blank浮起来并在image中加入文字,可以发现文字环绕blank显示。

 

另外的各种情况就可以通过修改样式表来看效果。在这里就不赘述了。另外还有float和相对定位,绝对定位混合用的情况,可以根据实际情况进行运用,只要记住基本的规则就不会用错的。