这一次直接进入主题。

css中最常用的布局类属性,一个是float,另一个就是定位属性position。

对于position来讲,有以下属性值:

static : 无特殊定位,对象处于正常文档流。其中,left/right/top/bottom/z-index均无法生效。
relative : 对象遵循正常文档流。但将依据left/right/top/bottom等属性在正常文档流中偏移位置。可通过设置z-index控制层叠优先级。
absolute : 对象脱离正常文档流。配合使用left/right/top/bottom等属性进行绝对定位。同样,可以通过z-index控制其层叠优先级。
fixed : 对象脱离正常文档流。配合使用top,right,bottom,left等属性以当前浏览器窗口进行定位。当出现滚动条时,对象不会随着滚动。其层叠属性通过z-index控制。

所谓文档流,是指浏览器在渲染页面时,从上至下,从左至右的渲染和排列元素。有三种手段可以使指定的元素脱离文档流,即浮动、绝对定位和相对定位。

下面我们来分别探讨position指定的定位方式。

1,静态定位(static)
static是html元素默认的定位方式,它遵循正常的文档流渲染。为元素指定left/right/top/bottom及z-index均无效。

2,相对定位(relative)
顾名思义,relative及相对定位。这里的重点是相对,相对于什么地方而言呢?我们来做一个测试。

(1),原始未定位

<head>
<style type="text/css">
#divA{
width:300px;
height:100px;
border:1px solid blue;
}
#divB{
width:300px;
height:100px;
border:1px solid red;
}
</style>
</head>
<body>
<div id="divA">
contentA
</div>
<div id="divB">
contentB
</div>
</body>

页面显示为:

(2),我们修改divA元素的position属性。

<head>
<style type="text/css">
#divA{
width:300px;
height:100px;
border:1px solid blue;
position:relative;
top:20px;
left:20px;
}
#divB{
width:300px;
height:100px;
border:1px solid red;
}
</style>
</head>
<body>
<div id="divA">
contentA
</div>
<div id="divB">
contentB
</div>
</body>

页面显示为:

我自己又另外画了一副图:

现在应该能够明白,相对定位相对的是它原本在文档流中的位置而进行的偏移,而我们也知道relative定位也是遵循正常的文档流,同时它的left/right/top/bottom属性是生效的,可以说它是static到absoult的一个中间过渡属性,最重要的是它还占有文档空间,而且占据的文档空间不会随top,left,right,bottom等属性的偏移而发生变动,也就是说它后面的元素是依据上面绿色框所示的位置进行的定位,这点一定要理解。

ok,我们知道了left/right/top/bottom属性是不会对relative定位的元素所占据的文档空间产生偏移,那么margin,padding会让该文档空间产生偏移吗?我们依然来做一个实验。

<head>
<style type="text/css">
#divA{
width:300px;
height:100px;
border:1px solid blue;
position:relative;
top:20px;
left:20px;
margin-bottom:20px;
}
#divB{
width:300px;
height:100px;
border:1px solid red;
}
</style>
</head>
<body>
<div id="divA">
contentA
</div>
<div id="divB">
contentB
</div>
</body>

结果为:

我们为divA设置了margin-bottom:20px; 由上面的渲染结果示意图可知。margin同样会让relative定位的元素所占据的文档空间产生偏移。同理,padding也会对relative定位的元素据点的文档空间产生影响。

3,绝对定位(absoulte)
所谓absoulte定位,也称为绝对定位。虽然它的名字叫"绝对",但我认为它的功能却更接近于"相对"。因为使用absoult定位的元素脱离文档流后,就只能根据祖先类元素(父类以上)进行定位,而这个祖先类还必须是以postion非static方式定位的。举个例子,一个div元素使用absoulte定位,它会从父类开始找起,寻找以position非static方式定位的祖先类元素,直到<html>标签为止.这里还需要注意的是,relative和static方式在最外层时是以<body>标签为定位原点的,而absoulte方式在无父级是position非static定位时是以<html>作为原点定位。在我使用的Chrome浏览器中,<html>和<body>元素相差9px左右。

<head>
<style type="text/css">
#divA{
width:300px;
height:100px;
border:1px solid ;
position:absolute;
left:20px;
top:20px;
}
#divB{
width:300px;
height:100px;
border:1px solid red;
}
</style>
</head>
<body>
<div id="divA">
contentA
</div>
<div id="divB">
contentB
</div>
</body>

渲染结果为:

可以看到,应用了position:absolute的元素,已脱离了正常的文档流,其原本在文档中的位置会由其后继元素进行填充。

看了上面的代码后,可能有朋友会问,为什么absoulte定位要加 top:0; left:0; 属性,这不是多此一举呢?
其实加上这两个属性是完全必要的,因为我们如果使用absoulte或fixed定位的话,必须指定left/right/top/bottom属性中的至少一个,否则left/right/top/bottom属性会使用它们的默认值 auto ,这将导致对象遵从正常的HTML布局规则,简单讲就是都变成relative,会占用文档空间.这点非常重要,很多人使用absolute定位后发现没有脱离文档流就是这个原因。

少了left/right/top/bottom属性不行,那如果我们多设了呢?例如,我们同时设置了top和bottom的属性值,那元素又该往哪偏移好呢?记住下面的规则:

如果top和bottom同时存在的话,那么只有top生效。
如果left和right同时存在的话,那么只有left生效。

既然absoulte是根据祖先类中的position非static元素进行定位的,那么祖先类中的margin/padding会不会对position产生影响呢?

<head>
<style type="text/css">
#divA{
width:300px;
height:100px;
border:1px solid blue;
position:relative;
margin:20px;
padding:20px;
}
#divB{
width:300px;
height:100px;
border:1px solid red;
position: absolute;
top:20px;
left:20px;
}
</style>
</head>
<body>
<div id="divA">
contentA <div id="divB">
contentB
</div>
</div> </body>

页面显示为:

显而易见,祖先类的margin会让子类的absoulte跟着偏移,而padding却不会让子类的absoulte发生偏移。总结一下,就是absoulte是根据祖先类的border进行的定位。

4,固定定位(fixed)
fixed定位,又称为固定定位,它和absoult定位一样,都脱离了文档流,并且能够根据left/right/top/bottom属性进行定位,但不同的是fixed是根据窗口为原点进行偏移定位的,也就是说它不会根据滚动条的滚动而进行偏移。

5,z-index属性

z-index,又称为对象的层叠顺序,它用一个整数来定义堆叠的层次,整数值越大,则被层叠在越上面,当然这是指同级元素间的堆叠,如果两个对象的此属性具有同样的值,那么将依据它们在HTML文档中流的顺序层叠,写在后面的将会覆盖前面的。需要注意的是,父子关系是无法用z-index来设定上下关系的,一定是子级在上父级在下。

需要注意的是,使用static定位或无position定位的元素z-index属性是无效的。

详解css中的position属性的更多相关文章

  1. 举例详解CSS中的cursor属性

    这篇文章主要举例介绍了CSS中的cursor属性,包括zoom-in/zoom-out和grab/grabbing等常用属性值的使用,需要的朋友可以参考下 一.开篇之言 CSS3的领域范围已经渗透到了 ...

  2. 转: 详解css中的display属性

    在一般的CSS布局制作时候,我们常常会用到display对应值有block.none.inline这三个值.下面我们来分别来认识和学习什么时候用什么值.这里通过CSS display知识加实例讲解方法 ...

  3. Css中的Position属性

    Css中的Position属性 Css属性在线查询地址: http://www.css88.com/book/css/properties/index.htm CSS 中的 position 属性 在 ...

  4. CSS学习笔记(9)--详解CSS中:nth-child的用法

    详解CSS中:nth-child的用法 前端的哥们想必都接触过css中一个神奇的玩意,可以轻松选取你想要的标签并给与修改添加样式,是不是很给力,它就是“:nth-child”. 下面我将用几个典型的实 ...

  5. 对CSS中的Position属性的一些深入探讨

    转:http://www.cnblogs.com/coffeedeveloper/p/3145790.html Position属性 Position的属性值共有四个static.relative.a ...

  6. 理解css中的position属性

    理解css中的position 两种类型的定位 static类型:只有一个值position: static.position默认值 relative类型:包括三个值,这三个值会相互影响,允许你以特定 ...

  7. css中关于position属性的探究(原创)

    关于position属性的设置,头脑中一直觉得不是很清楚,所以借助这次机会单独自己测试了一下,记作学习笔记.   首先,css的position属性包含下面四种设置情况: static:默认属性.指定 ...

  8. 细说css中的position属性

    有过css开发经验的同学,对于position这个属性一定不会陌生,然而这个熟悉的属性确是面试题中的常客,也就说明了该属性在css的世界是有一定的江湖地位的,那么我们就来详细的说说position这个 ...

  9. css中的position属性值的探究

    css的position属性指定了元素的定位类型,然后通过top,botton,left,right来具体定位. 在具体定位之前必须使用position属性,否则所有的具体定位属性都无法生效. pos ...

随机推荐

  1. 无法将类型为“System.Decimal”的对象强制转换为类型“System.Char[]”。

    在用微软的SSIS操作ORACLE 数据源的时候碰到以下报错信息: [ADO NET Destination [13455]] 错误: 数据插入期间出现异常,从提供程序返回的消息为:无法将类型为&qu ...

  2. Backbone源码解析(二):Model(模型)模块

    Model(模型)模块在bk框架中的作用主要是存储处理数据,它对外和对内都有很多操作数据的接口和方法.它与视图(Views)模块精密联系着,通过set函数改变数据结构从而改变视图界面的变化.下面我们来 ...

  3. Git学习笔记(7)——多人协作

    本文主要记录了,多人协作时,产生冲突时的解决情况. 多人环境创建 首先我们需要模拟一个多人环境.前面的Git的学习都是在Ubuntu上面,现在我们也搭建一个win环境吧.安装win环境下的Git,很简 ...

  4. IOS 公共类-数字处理

    1.写一个方法,调用的时候交换两个数的值 -(void) swap:(int*)a andNumber:(int*)b{ int temp = *a; *a = *b; *b = temp; } 调用 ...

  5. NodeJS系列~第一个小例子,实现了request.querystring功能

    返回目录 百度百科上: Node.js是一套用来编写高性能网络服务器的JavaScript工具包,一系列的变化由此开始,在Node中,Http是首要的.Node为创建http服务器作了优化,所以在网上 ...

  6. 锋利的JQuery —— DOM操作

    图片猛戳链接

  7. atitit 短信接口规范与短信解决方案.docx

    atitit 短信接口规范与短信解决方案.docx 1.1. 国内比较著名的短信提供商1 1.2. 短信接口规范1 1.3. 短信sdk构成1 1.4. 短信的实现1 1.5. SmsServiceY ...

  8. Atitit usrQBM2331 参数格式化规范

    Atitit usrQBM2331 参数格式化规范 String sql = "insert agent(uid,parent_id,pwd,name,tel,wechat,bkkad,si ...

  9. c#设计模式-工厂方法

    一. 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 工厂方法模式是简单工 ...

  10. Lucene学习

    一.全文索引的原理 数据存在形式: 1.结构化数据: 指具有固定格式或有限长度的数据,如数据库,元数据等. 2.非结构化数据(全文数据): 指不定长或无固定格式的数据,如邮件,word文档等. 3.半 ...