努力成为一名合格的前端开发工程师!!!

闻达有先后,术业有专攻,努力,加油ing!!!!

导航

CSS中Position 的用法详解。

记得一年前,到一家公司面试的时候,问我position有哪几个属性,我憋半天才回答出2个,大家估计都清楚,就是我们经常用到的2个(relative,absolute)。

最近又用到了好多,深入研究了下。

一、语法:

position:static | relative | absolute | fixed

取值:
static :默认值,无特殊定位,对象遵循正常文档流。top,right,bottom,left等属性不会被应用,默认值。
relative:相对定位,对象遵循正常文档流,但将依据top,right,bottom,left等属性在正常文档流中偏移位置。
absolute:绝对定位,对象脱离正常文档流,使用top,right,bottom,left等属性进行绝对定位。而其层叠通过z-index属性定义。
fixed:固定定位,对象脱离正常文档流,使用top,right,bottom,left等属性以窗口为参考点进行定位,当出现滚动条时,对象不会随着滚动。

 

二、四个属性的详细介绍:

1、static,默认值
说 到这里我们不得不提一下一个定义——文档流,很多书对文档流这个概念只是一笔带过,没有详细解答,但我根据自己的经验和理解对它进行了总结,文档流其实就 是文档的输出顺序,也就是我们通常看到的由左到右、由上而下的输出形式,在网页中每个元素都是按照这个顺序进行排序和显示的,而float和 position两个属性可以将元素从文档流脱离出来显示。

默认值就是让元素继续按照文档流显示,不作出任何改变。

2、relative,相对定位

相对定位一个最大特点是:自己通过定位跑开了还占用着原来的位置,不会让给他周围的诸如文本流之类的对象。相对定位也比较独立,做什么事它自己说了算,要定位的时候,它是以自己本身所在位置偏移的(相对对象本身偏移)。本身位置变化了,而元素最初所占的物理空间依然还是存在,另外一点元素相对定位后并没有影响其他相邻的元素。

3、absolute,绝对定位

位置被设置为absolute后,被设置的元素会被定义到包含它的元素内的指定坐标(X坐标、Y坐标)。

比如:position:absolute;left:20px;top:80px; 这个容器始终位于距离浏览器左20px,距离浏览器上80px的这个位置。它不会随着窗口大小变化,只是固定在一个特定的坐标轴上面;

4、固定位置,fixed

在理论上,被设置为fixed的元素会被定位于浏览器窗口的一个指定坐标,不论窗口是否滚动,它都会固定在这个位置。但是目前它在IE6中不被支持.

Ie6处理方法:

body{
    background-image:url(about:blank); /* for IE6 */
    background-attachment:fixed; /*必须*/
}

.demo{
    _position:absolute;
    _top:expression(documentElement.scrollTop + documentElement.clientHeight-this.offsetHeight);
}

总的例子html:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>position</title>
<style type="text/css">
*{margin:0;padding:0;}
.clearfix:before,.clearfix:after {content:"";display:table;}
.clearfix:after {clear:both;overflow:hidden;}
.clearfix {zoom:1;}
.mgt20{margin-top:20px;}
.w1000{width:1000px;margin:0 auto;min-height:1900px;}

#demo{  
    position:relative;  
    border:1px solid #000;  
    margin-top:50px;
    top:-50px;  
    line-height:18px; 
} 
.static,.fixed,.absolute,.relative{  
    width:200px;      
}  
.relative{  
    position:relative;  
    left:150px;  
    top:-20px;  
    background-color:#ffe4e1;  
}
.static{   
    position:static; 
    background-color:#bbb;    
}  
.fixed{  
    position:fixed;  
    top:200px;
    left:50%;
    margin-left:-500px;
    background-color:#ffc0cb;
}  
.absolute{ 
    position:absolute;  
    right:10px;  
    top:10px;  
    background-color:#b0c4de;  
} 
</style>
</head>
<body>
<div class="w1000">
    <div class="mgt20 clearfix">
        <div id="demo" class="clearfix">  
            <div class="static">static: 默认值。无特殊定位,对象遵循HTML定位规则 </div>  
            <div class="absolute">absolute: 将对象从文档流中拖出,使用left,right,top,bottom 等属性相对于其最接近的一个最有定位设置的父对象进行绝对定位。如果不存在这样的父对象,则依据body对象。而其层叠通过z-index属性定义 </div>  
            <div class="fixed">fixed属性的说明:fixed总是以body为定位时的对象,总是根据浏览器的窗口来进行元素的定位,通过"left"、 "top"、 "right"、"bottom" 属性进行定位。</div>  
            <div class="relative">relative1:对象不可层叠,对象原来占有的位置保留,但将依据 left,right,top,bottom 等属性在正常文档流中偏移位置 </div> 
        </div> 
    </div>    
</div>
</body>
</html>

 

显示:

 

三、position注意事项

1、当Position属性值为Relative时对象原来占有的位置保留,其后面 的对象按原来文档流仍然保持原来的位置Top的值表示对象相对原位置向下偏移的距离bottom的值表示对象相对原位置向上偏移的距离两者同时存在时,只有Top起作用。left的值表示对象相对原位置向右偏移的距离right的值表示对象相对原位置向左偏移的距离两者同时存在时,只有left起作用。

2、当Position属性值为absolute时对象从文档流中抽取出来,原占有的位置被后面的对象顶替上来Top的值表示对象上边框与浏览器窗口顶部 的距离bottom的值表示对象下边框与浏览器窗口底部的距离两者同时存在时,只有Top起作用;如果两者都未指定,则其顶端将与原文档流位置一致,即垂 直保持位置不变。left的值表示对象左边框与浏览器窗口左边的距离right的值表示对象右边框与浏览器窗口右边的距离两者同时存在时,只有left起 作用;如果两者都未指定,则其左边将与原文档流位置一致,即水平保持位置不变。
在Position属性值为absolute的同时,如果有一级父对象(无论是父对象还是祖父对象,或者再高的辈分,一样)的Position属性值为Relative时,则上述的相对浏览器窗口定位将会变成相对父对象定位,这对精确定位是很有帮助的。

 

五、positon 与 display
元素分为内联元素和区块元素两类(当然也有其它的),在内联元素中有个非常重要的常识,即内联元素是不可以设置区块元素所具有的样式,例如:width | height。
relative : 原来是什么类型的依旧是什么类型。
absolute | fixed : 元素就被重置为了区块元素,

例如:打算为span元素指定大小,并绝对定位

<span style="position:absolute; width:100px; height:50px;">span</span>这是完全正确的,
<span style="position:absolute; display:block; width:100px; height:100px;">span</span>,这里的display:block就是多余的了。

 

六、position 与 float
一个元素若设置了 position:absolute | fixed; 则该元素就不能设置float。这是一个常识性的知识点,因为这是两个不同的流,一个是浮动流,另一个是“定位流”。
但是 relative 却可以。因为它原本所占的空间仍然占据文档流。

posted on 2016-08-08 11:47  前端小小匠  阅读(8749)  评论(0编辑  收藏  举报