offsetParent 算法

作者:vkvi 来源:千一网络(原创) 日期:2009-1-12

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

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

  1. 以下任一条件为真时,返回 null,并停止本算法。
    • A 是根元素。
    • A 是 HTML 的 body 元素。
    • 元素 A 的 position 属性计算值是 fixed注 1
  2. 如果 A 是 HTML 元素 area,并且在其上级元素链中有 HTML 元素 map,返回上级元素链中距 A 最近的 HTML 元素 map,并停止本算法。注 2
  3. 如果以下任一条件为真时,返回距 A 最近的符合下述条件的上级元素,并停止本算法。
    • 上级元素的 position 属性计算值不是 static注 3
    • 上级元素是 HTML 的 body 元素。注 4
    • A 的 position 属性计算值是 static,上级元素是 tdthtable
  4. 返回 null

前面已经提到,以上是工作草案的内容,所以与现行的浏览器不一定一致,注释如下:

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

总结

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

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

相关阅读

相关文章
文章评论
  • 1 楼:评论
    是千一原创的吗?
  • 2 楼:评论
    根据 w3 整理。