【分享】说说标准--CSS核心可视化格式模型(visual formatting model)之六:常规流中的相对定位

WebAdvocate 2010-08-09 06:48:43
加精
前两个”说说标准“系列的帖子已经将常规流中的BFCIFC都说过了。今天跟大家分享最后常规流中的最后一个要点:常规流中的相对定位。

绝对定位元素在常规流中的占位是未偏移前的位置
一旦一个框按照常规流或者是浮动得到定位,它还可以相对该位置而偏移。这就是相对定位。按照这种方式偏移一个框(B1)不会对后续的框(B2)有影响:
● B2在定位时,就好象B1没有发生偏移一样。
● B1偏移后,B2不会重新定位。
也就是说,B2只认没有偏移之前的B1,B1的偏移不对B2产生任何影响,相对定位的元素,是处于常规流中的,这点需要注意,另外,相对定位是相对于元素的自身定位,并且,在常规流中还占据原来的位置。
这也意味着相对定位可能产生框的重叠。比如,http://topic.csdn.net/u/20100728 /16/e10db11c-e212-4e10-83a2-df4ebbf7ccc7.html?70582中关于相对定位的例子中,红色的框 B 将其下面蓝色的框 C 覆盖了。

相对定位元素溢出包含块时,应由浏览器提供滚动条
然而,如果相对定位引起overflow:auto 或 overflow:scroll 框的溢出,浏览器必须允许用户访问内容,即,需要创建需要的滚动条,这可能会影响布局。
例:
<div style="width:100px; height:100px; overflow:auto; border:2px solid blue;">
<div style="width:20px; height:20px; background-color:red; position:relative; top:100px; left:100px;">A</div>
</div>
其中,红色的小块 A 定位的时候,已经超出外面蓝色框的显示范围了,已经溢出。根据标准,应该出现滚动条,以保证用户可以正常的访问 A 中的内容。此时,存在兼容性问题。
在Firefox/Chrome/Safari/IE8(S)/Opera中符合标准,截图:

在IE6(Q)/IE7(Q)/IE8(Q)中,没有出现滚动条,A 的内容也看不到:

在IE6(S)和IE7(S)中更奇怪,直接将 A 显示了出来:


相对定位元素的尺寸
相对定位元素的尺寸,会保持它在常规流中的尺寸。包括换行以及原来为它保留的位置。
包含块的章节中,说明了什么时候相对定位元素会产生新的包含块。

如何偏移以及计算后的值

对于一个相对定位的元素,’left’ 和 ‘right’ 会水平的位移框而不会改变它的大小。’left’会将框向右移动,’right’会将框向左移动。由于 ‘left’ 或者 ‘right’ 不会造成框被拆分或者拉伸,所以,计算后的值(computed value)总是:left = -right。

如果 left 和 right 的值都是 ‘auto’ (它们的初始值),计算后的值(computed value)为 0(例如,框区留在其原来的位置)。

如果 left 为 ‘auto’,计算后的值(computed value)为 right 的负值(例如,框区根据 right 值向左移)。
如果 right 被指定为 ‘auto’,其计算后的值(computed value)为 left 值的负值。
<div style="width:20px; height:20px; background-color:red; position:relative; left:100px;"></div>
如上述代码中,DIV 元素是相对定位的元素,它的left 值是 ‘100px’, right 没有设置,默认为”auto”,那么,right 特性计算后的值应该是 -left,即’right:-100px’。

如果 left 和 right 都不是 auto,那么定位就显得很牵强,其中一个不得不被舍弃。如果包含块的 direction 属性是 ‘ltr’,那么 left 将获胜,right 值变成 "-left"。如果包含块的 direction 属性是 ‘rtl’,那么 right 获胜,left 值将被忽略。
<div style="width:100px; height:100px; overflow:auto; border:1px solid blue;">
<div style="width:20px; height:20px; background-color:red; position:relative; left:60px; right:60px;"></div>
</div>
最后,left应该比较强悍才对。

top 和 bottom 属性将相对定位元素向上或者向下移动,而不改变其大小。top 把框向下移动,而 bottom 将其向上移动。由于 top 和 bottom 没有造成框被拆分或者拉伸,计算值总是 top=-bottom,如果两个都是auto,其计算值就都是0,如果其中之一是auto,它就是另一个的负值。如果都不是auto,bottom被忽 略(例如,bottom的计算值会是top值的负值)。
注意:在脚本环境中,动态移动相对定位框区能够产生动画效果(见“visibility属性”部分)。虽然 相对定位可以用于创建上标或者下标,行高并不会被自动调整以适应定位需要。

至此,常规流中的要素就已经介绍完毕,下面的分享中将开始介绍浮动和绝对定位的内容,敬请期待……


可视化格式模型概述:
http://topic.csdn.net/u/20100719/17/ff203b89-135e-46cf-8fce-705f16e37beb.html?006156676166584196

更多说说标准系列:
【分享】说说标准系列目录
...全文
2438 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
dapengfeixiang 2010-09-28
  • 打赏
  • 举报
回复
学习学习!
nxm_2008 2010-08-13
  • 打赏
  • 举报
回复
牛,学习中
wangfood 2010-08-13
  • 打赏
  • 举报
回复
路过,学习学习
tizll521 2010-08-13
  • 打赏
  • 举报
回复
相对定位溢出的问题 以前还真不知道 又学习了
hujun4561812 2010-08-13
  • 打赏
  • 举报
回复
这个不错,下载来研究下!
WebAdvocate 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 takingjoyride 的回复:]

好像很复杂,不是挺简单的么
[/Quote]这是比较细节的东西……
程序园苑 2010-08-12
  • 打赏
  • 举报
回复
路过,研究一下,蛮有意思
vlixiaolei0 2010-08-12
  • 打赏
  • 举报
回复
路过学习学习
TakingJoyride 2010-08-12
  • 打赏
  • 举报
回复
好像很复杂,不是挺简单的么
xinbaby 2010-08-12
  • 打赏
  • 举报
回复
看不懂!!!!!!!!!!!
jie378711809 2010-08-12
  • 打赏
  • 举报
回复
这个不错,下载来看看, 研究下!!!
fyundersky 2010-08-12
  • 打赏
  • 举报
回复
菜鸟来学习
hylgogogo_2009 2010-08-12
  • 打赏
  • 举报
回复
hylgogogo_2009 2010-08-12
  • 打赏
  • 举报
回复
zlwcgs 2010-08-11
  • 打赏
  • 举报
回复
zlwcgs 2010-08-11
  • 打赏
  • 举报
回复
鼠标抖一抖,一分到手
hdyljw 2010-08-11
  • 打赏
  • 举报
回复
辛苦了楼主,感谢!!
sdwlcth 2010-08-11
  • 打赏
  • 举报
回复
我是菜鸟,是来学习的!
dingjian36311261 2010-08-11
  • 打赏
  • 举报
回复
不错,Mark下,刚好用到这个
kvater 2010-08-11
  • 打赏
  • 举报
回复
顶顶顶``这个的学呢
加载更多回复(10)

本帖接 【分享标准——CSS核心可视化格式模型(visual formatting model)之八:float 特性以及浮动(Float)定位细则一

6. 浮动框的顶边不可以高于源文档中先前元素产生的块框或浮动框的顶
例子最直接了: