offsetParent 算法分析

以下部分内容翻译自 W3C 的 CSSOM View Module,W3C 工作草案 2008年2月22日。

当调用元素 A 的 offsetParent 属性时,必须按以下算法返回元素。 

以下任一条件为真时,返回 null,并停止本算法。 
A 是根元素。 
A 是 HTML 的 body 元素。 
元素 A 的 position 属性计算值是 fixed。注 1 
如果 A 是 HTML 元素 area,并且在其上级元素链中有 HTML 元素 map,返回上级元素链中距 A 最近的 HTML 元素 map,并停止本算法。注 2 
如果以下任一条件为真时,返回距 A 最近的符合下述条件的上级元素,并停止本算法。 
上级元素的 position 属性计算值不是 static。注 3 
上级元素是 HTML 的 body 元素。注 4 
A 的 position 属性计算值是 static,上级元素是 td、th 或 table。 
返回 null。 
前面已经提到,以上是工作草案的内容,所以与现行的浏览器不一定一致,注释如下: 

注 1 Firefox 不适用;IE 6 不适用;DOCTYPE 使 IE 7 不支持 fixed 时不适用(以下简称 IE 6 模式)。
注 2 Firefox 不适用。 
注 3 上级元素的 position 属性计算值是 fixed,并且 IE 6 或者 IE 6 模式不适用。 
注 4 IE 7 模式中,如果元素的 position 属性计算值是 absolute 或 relative,返回元素 HTML,而不是 BODY。 
总结 

由此看出,获得 offsetParent 在各个浏览器中,各个浏览器的各个版本中,同一版本的不同模式中,都有不同的算法,实在有些麻烦。所以还是建议将其理解为通过 offsetParent 循环和 offsetLeft、offsetTop 可以获得控件在浏览器中的绝对位置即可。 

但庆幸的是有一种常见布局在各种浏览器中 offsetParent 是一样的,那就是:外层元素 div 的 position 计算值是 relative、absolute 时,内层元素 div 的 offsetParent 总是外层元素 div。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值