谈谈相对定位

栏目: CSS · 发布时间: 5年前

内容简介:美好的周末从码字开始......说道相对定位,相信很多童鞋会立马想到绝对定位。虽是同个妈生的,爹地却不同,那么性情绝对是不相同滴。相对定位,它是一种定位机制,可以使得block-level box和inline-level box相对它们本身的位置上下左右移动一段距离。

美好的周末从码字开始......

说道相对定位,相信很多童鞋会立马想到绝对定位。虽是同个妈生的,爹地却不同,那么性情绝对是不相同滴。

是什么

相对定位,它是一种定位机制,可以使得block-level box和inline-level box相对它们本身的位置上下左右移动一段距离。

这个“本身的位置”可以是box进行block formatting /inline formatting之后的位置,也可以是进行float定位之后的位置。

这表明:相对定位既可以对普通流里的元素进行定位,也可以对float元素进行定位。

怎么用

CSS中有五个属性可以用来相对定位。其中position必须设为relative,另外四个属性用法如下:

属性名: left

含义:在水平方向上,box往右边移动的距离

值: | | auto |inherit

初始值: auto

应用对象: 定位元素

继承性: 无

百分比值 :参考对象为containing block的 宽度

属性名: right

含义:在水平方向上,box往左边移动的距离

值: | | auto |inherit

初始值: auto

应用对象: 定位元素

继承性: 无

百分比值 :参考对象为containing block的 宽度

属性名: top

含义:在垂直方向上,box往下方移动的距离

值: | | auto |inherit

初始值: auto

应用对象: 定位元素

继承性: 无

百分比值 :参考对象为containing block的 高度

属性名: bottom

含义:在垂直方向上,box往上方移动的距离

值: | | auto |inherit

初始值: auto

应用对象: 定位元素

继承性: 无

百分比值 :参考对象为containing block的 高度

我们通过指定left, right, top, bottom的值来就可以控制box的位置。其实实际应用时,我们只需要设置left或right, top或bottom就可以了。但是如果left和right都设置值了,或是top和bottom都设置值了,css怎么去确定元素的位置呢?

。。。哎,好头疼,干嘛两个都设置呀,这让css解析器怎么确定box的位置呀。。

其实,他们有的是规则对付!

规则一: 这四个属性的used value始终保证 left = - right, top = -bottom

规则二:left, right 值均为auto, 则它们的used value均为0;同理top和bottom

规则三:left, right中只有一个为auto, 则它的used value为另外一个的相反数;同理top和bottom

规则四:left和right均不为auto的情况下,父元素的direction为ltr,则 left的used value为开发人员设定的值,right = -left ; 父元素的direction为rtl,则 right值为开发人员设定的值,left = -right

规则五:top和bottom均不为auto的情况下,top值为开发人员设定的值,bottom= - top

这些规则足以应对任何情况。看吧,既然css放开这些属性给你设置,肯定做好了任何情况的准备工作。

接下来上个栗子(测试工具:chrome 49.0)

<html>
  <head>
  <style type="text/css">	
	.comparation{
		width:210px;
		height:130px;
		margin:auto;
		border:solid 2px #5CBDD2;
	}
	.child{
		width:200px;
		height:100px;
		border:solid 2px #E2D72F;
	}
  	.relative{
		position:relative;
  		left:10px;
		right:20px;
		top:30px;
		bottom:40px;
  	}
	.ltr{
		direction:ltr;
	}
	.rtl{
		direction:rtl;
	}
  </style>
  </head>
<body>
<div class='comparation'>
<div class='child'>
	child element
</div>
</div>
</body>
</html>
复制代码

父元素的direction为ltr的情况

为父元素加上css类ltr,代码修改成酱紫:

<body>
<div class='comparation ltr'>
<div class='child'>
	child element
</div>
</div>
</body>
复制代码

在子元素还没有进行相对定位时,它们的关系是酱紫的:

谈谈相对定位

因为父元素的direction为ltr,故子元素都是从父元素的左边开始排列。图中子元素的左边框与父元素的左边框重叠,该位置为子元素在普通流中的正常位置。

现在让子元素进行相对定位,为子元素加上css类relative:

<body>
<div class='comparation ltr'>
<div class='child relative'>
	child element
</div>
</div>
</body>
复制代码

测试结果如下:

谈谈相对定位

我们明显看到,父元素与子元素的右边框,下边框重叠,而父元素的宽度是比子元素的宽度多出10px,高度多出30px,恰好说明了子元素向右移动了10px,向下移动了30px,子元素的right值及bottom值均被忽略了。

父元素的direction为rtl的情况

为父元素加上css类rtl,代码修改成酱紫:

<body>
<div class='comparation rtl'>
<div class='child'>
	child element
</div>
</div>
</body>
复制代码

在子元素还没有进行相对定位时,它们的关系是酱紫的:

谈谈相对定位

子元素从父元素的右边开始排列,图中为子元素在普通流中的正常位置。

现在让子元素进行相对定位,代码如下:

<body>
<div class='comparation rtl'>
<div class='child relative'>
	child element
</div>
</div>
</body>
复制代码

结果是酱紫的:

谈谈相对定位

我们发现,子元素的左边框超过了父元素的左边框,但它们的下边框依然重叠,这说明了子元素从正常位置上向左移动了20px,向下移动了30px,left值和bottom值均被忽略了。

可以看到,这一切都在我们的预料之中,前提是你通晓css规则!

特殊注意事项

如果没有控制好间距,相对定位有可能引起元素之间的重叠。

元素A,元素B均为block box,宽度均为100px。它们并列在父元素的怀抱里,A在B的前面,间距为0。突然A使坏了,它启动了相对定位功能,设置left为50px。你猜猜发生了什么?

B的一半和A的一半重叠了!!

这是为什么呢?

普通流中的元素和float元素会先不考虑相对定位,在某一阶段中确定好位置,接着,相对定位元素会基于它本身的位置开始定位,定位之后其他元素不会被重新定位,然后。。。。。。。结果你们都知道的!

这中间涉及到元素的渲染流程,之后会出专门的文章,敬请期待吧!

ps: 本文例子均是在chrome 上测试。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

SOA & Web 2.0 -- 新商业语言

SOA & Web 2.0 -- 新商业语言

(美)Sandy Carter / 袁月杨、麻丽莉 / 清华大学出版社 / 2007 / 29.80元

在《SOA&Web 2.0:新商业语言》中,Sandy Calter示范了将企业解构为“组件化”业务模式的方法,然后用相互连接的、可重复的并且能快速、轻松、经济地适应各种变化的IT服务来支持该模式。这些技术将帮助IT专家和业务经理达到崭新的运营水平,以开展着眼于市场的创新,这才是最重要的。总而言之,企业必须实现灵活应对。直到最近,技术都一直阻碍着这些目标的实现。正是由于面向服务架构(SOA)、We......一起来看看 《SOA & Web 2.0 -- 新商业语言》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具