position学习终结者(一)

        position的值有以下五种,现结合例子谈一下我对这五种值的认识:

        一、不使用任何值:

        代码1-1如下: 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<style type="text/css">
			.parent{
				width:300px;
				height:300px;
				background-color:gray;
			}
			
			.son1{
				width:50px;
				height:50px;
				background-color:green;
			}
			
			.son2{
				width:50px;
				height:50px;
				background-color:red;
			}
		</style>
	</head>
	<body>
		<div class="parent">
			<div class="son1">son1</div>
			<div class="son2">son2</div>
		</div>
	</body>
</html>

图1-1

        二、static默认值。没有定位,元素忽略 top, bottom, left, right 或者 z-index 声明,按照正常的文档流进行排列。

        代码2-1如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<style type="text/css">
			.parent{
				width:300px;
				height:300px;
				background-color:gray;
			}
			
			.son1{
				position:static;
				left:60px;
				top:60px;
				width:50px;
				height:50px;
				background-color:green;
			}
			
			.son2{
				width:50px;
				height:50px;
				background-color:red;
			}
		</style>
	</head>
	<body>
		<div class="parent">
			<div class="son1">son1</div>
			<div class="son2">son2</div>
		</div>
	</body>
</html>

图2-1

        总结:

        ①、比对图1-1与图2-1可以发现两者没有什么差别,这说明static是position的默认值;

        ②、上面代码son1 div样式中设置了left和top属性,但从图2可以发现这些属性的设置并没有起到应有的作用,这印证了position为static时会忽略 top, bottom, left, right 或者 z-index 声明

        三、relative:这个单词本身是“相关、相对的意思,从这个单词可以看出该值的作用,不过这里要搞清楚它是相对哪个对象来进行偏移的。

        代码3-1如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<style type="text/css">
			.parent{
				width:300px;
				height:300px;
				background-color:gray;
			}
			
			.son1{
				position:relative;
				left:60px;
				top:60px;
				width:50px;
				height:50px;
				background-color:green;
			}
			
			.son2{
				width:50px;
				height:50px;
				background-color:red;
			}
		</style>
	</head>
	<body>
		<div class="parent">
			<div class="son1">son1</div>
			<div class="son2">son2</div>
		</div>
	</body>
</html>

图3-1

        总结:

        ①、对比图1-1代码和图3-1代码,对比图1-1和图3-1,可以得出这样的结论:son1是相对它原来的位置进行偏移的;

        ②、哪些属性可以设置son1的偏移位置:top、right、bottom、left都可以做到;

        ③、son1son2属于同级,son1偏移后,那son2偏移了吗?son2没有偏移,它依然在原来的位置,其实①已经可以回答这个问题了,可以这样理解:如果没有设置position的值,son1的位置会按照正常的文档流进行排列;如果设置son1 position属性的值为relative,son1的位置会按照top、right、bottom、left的值进行位置偏移,这种偏移是相对它原来的位置进行的(relative的“相对的”意思也正体现于此);

        ④、如果为son2也添加position的值为relative并添加left等属性,会发生什么?通过①可以回答这个问题:会按照son2原来的位置进行相对的偏移,还是那句话——这里的“相对”是与原来的位置相比;

        ⑤、呵呵呵,上面几点中有三点提到了“原来的位置”,那么它相对于原来位置的哪个部位偏移的呢?中心吗?不是的,relative的偏移是基于对象的margin的左上侧的来说的;

        四、absolute:毫不掩饰,当初学习这块儿时,就是这个absolute把我弄懵了,呵呵呵,下面通过例子来一层层的理解这个absolute(注意:为了更好地理解absolute值,请先“忘掉前面讲的一切”):

        代码4-1如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<style type="text/css">
			body{
				margin:0px;
				background-color:gray;
			}
			
			.son1{
				width:50px;
				height:50px;
				background-color:green;
			}
			
			.son2{
				width:50px;
				height:50px;
				background-color:red;
			}
		</style>
	</head>
	<body>
		<div class="son1">son1</div>
		<div class="son2">son2</div>
	</body>
</html>

图4-1

        说明:观察代码4-1可知上图中没有使用position属性,也就是说position属性的值为static;

        代码4-2如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<style type="text/css">
			body{
				margin:0px;
				background-color:gray;
			}
			
			.son1{
				position:relative;
				left:150px;
				width:50px;
				height:50px;
				background-color:green;
			}
			
			.son2{
				width:50px;
				height:50px;
				background-color:red;
			}
		</style>
	</head>
	<body>
		<div class="son1">son1</div>
		<div class="son2">son2</div>
	</body>
</html>

图4-2

        说明:比对代码4-1和代码4-2,可以看到唯一变化的地方就是son1的样式添加了“position:relative;left:150px;”;

        代码4-3如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<style type="text/css">
			body{
				margin:0px;
				background-color:gray;
			}
			
			.son1{
				position:absolute;
				left:150px;
				width:50px;
				height:50px;
				background-color:green;
			}
			
			.son2{
				width:50px;
				height:50px;
				background-color:red;
			}
		</style>
	</head>
	<body>
		<div class="son1">son1</div>
		<div class="son2">son2</div>
	</body>
</html>

图4-3

        说明:比对代码4-2和代码4-3,可以看到唯一变化的地方就是son1的样式position的属性值有relative改为了absolute;

        总结:

        ①、对比图4-2和图4-3可以很轻易的得出relative和absolute的一个区别:relative所作用的元素移动后,原来的位置没有被其它元素占用;absolute所作用的元素移动后,原来的位置会被其它元素占用;

        ②、absolute影响的元素移动后之所以会被其它元素占用是因为被absolute影响的元素脱离了文档流,不在自上而下、自左而右的显示元素,而另一个元素(son2)则没有脱离文档流,这时没有脱离文档流的元素直接从父元素(body相对于son2而言是父元素)开始定位,即言没有脱离文档流的元素son2)的文档流不再基于absolute影响的元素(son1)而是基于父元素定位,于是就看到了这种情形

        代码4-4如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<style type="text/css">
			body{
				margin:0px;
				background-color:gray;
			}
			
			.parent{
				margin-left:50px;
				width:300px;
				height:300px;
				background-color:yellow;
			}
			
			.son1{
				position:absolute;
				left:150px;
				width:50px;
				height:50px;
				background-color:green;
			}
			
			.son2{
				width:50px;
				height:50px;
				background-color:red;
			}
		</style>
	</head>
	<body>
		<div class="parent">
			<div class="son1">son1</div>
			<div class="son2">son2</div>
		</div>
	</body>
</html>

图4-4

        说明:观察代码4-4可知class为parent的div没有使用position属性,也就是说其position属性的值为static;

        代码4-5如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<style type="text/css">
			body{
				margin:0px;
				background-color:gray;
			}
			
			.parent{
				position:absolute;
				margin-left:50px;
				width:300px;
				height:300px;
				background-color:yellow;
			}
			
			.son1{
				position:absolute;
				left:150px;
				width:50px;
				height:50px;
				background-color:green;
			}
			
			.son2{
				width:50px;
				height:50px;
				background-color:red;
			}
		</style>
	</head>
	<body>
		<div class="parent">
			<div class="son1">son1</div>
			<div class="son2">son2</div>
		</div>
	</body>
</html>

图4-5

        说明:观察代码4-5可知class为parent的div的position属性的值为absolute;

        代码4-6如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<style type="text/css">
			body{
				margin:0px;
				background-color:gray;
			}
			
			.parent{
				position:relative;
				margin-left:50px;
				width:300px;
				height:300px;
				background-color:yellow;
			}
			
			.son1{
				position:absolute;
				left:150px;
				width:50px;
				height:50px;
				background-color:green;
			}
			
			.son2{
				width:50px;
				height:50px;
				background-color:red;
			}
		</style>
	</head>
	<body>
		<div class="parent">
			<div class="son1">son1</div>
			<div class="son2">son2</div>
		</div>
	</body>
</html>

图4-6

        说明:观察代码4-6可知class为parent的div的position属性的值为relative;

        代码4-7如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<style type="text/css">
			body{
				margin:0px;
				background-color:gray;
			}
			
			.parent{
				position:fixed;
				margin-left:50px;
				width:300px;
				height:300px;
				background-color:yellow;
			}
			
			.son1{
				position:absolute;
				left:150px;
				width:50px;
				height:50px;
				background-color:green;
			}
			
			.son2{
				width:50px;
				height:50px;
				background-color:red;
			}
		</style>
	</head>
	<body>
		<div class="parent">
			<div class="son1">son1</div>
			<div class="son2">son2</div>
		</div>
	</body>
</html>

图4-7
      说明:观察 代码4-7可知class为parent的div的position属性的值为fixed

      总结:

        ①、对比图4-4、图4-5、图4-6和图4-7可以很轻易的得出这样一个结论:如果某一absolute作用的元素(比如:上面的son1)的父对象(或曾祖父,只要是父级对象(比如上面class为parent的div))设置了position属性且position的属性值为absolute、relative或者fixed,那么这个子元素(比如:上面的son1)会参照离它(指子元素)最近的且position的属性值为absolute、relative或者fixed的父元素(比如上面class为parent的div)进行定位,可是以父元素哪个定位点来进行定位呢,答案是父元素的左上角(永远都是父元素的左上角,如果父元素样式中有padding也是这样,这一点可参考另一篇博客——《HTML CSS——position学习终结者(二)》);如果子元素(比如:上面的son1所有父元素的position属性值不为absolute、relative或者fixed,那么该子元素将以body为定位对象进行定位,图4-4很好的演示了这一点(注意:单单就子元素而言图4-4和图4-3是一样的,它们参照定位对象都是body);

        ②、由于将元素position属性设置为absolute后,会导致该元素脱离文档流,就像它不属于父对象一样,它漂浮了起来,在DreamWeaver中把它称为“层”,其实意思是一样的;

        五、fixed:fixed是特殊的absolute,position属性值为fixed的元素总是以body元素为定位对象(即按照浏览器的窗口进行定位)通过"left"、"top"、"right"或"bottom" 属性进行规定,即使拖动滚动条,该元素所在的位置也不会改变的(与background-attachment:fixed相似)。

        六、inherit:该属性作用的元素继承父元素position的属性值,由于该属性在任何的版本的 Internet Explorer (包括 IE8)都不支持,所以可以忽略它。

        【0分下载演示资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿老高

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值