offsetParent:返回离当前元素最近的、设置过定位的祖先元素。。
根据 quirksmode 中的介绍,查找元素 x 的 offsetParent 流程是这样的:沿着 DOM 树向上查找,遇到如下情况则停止并返回当前元素:
- <body>
- position 值不为 static 的元素
- <table>,<th> 或是 <td>,前提是 x 的 position 为 static。
body 的 offsetParent 为 null。
position 为 fixed 的元素的 offsetParent:在 IE (测试到 IE 9) 和 Chrome 中为 null,firefox 返回 body 元素。
display 为 none 的元素的 offsetParent:IE 返回 body 元素,firefox 和 Chrome 均返回 null。
规范 中关于 offsetParent 的介绍:
返回 null 的情况:
- 元素没有与之关联的 CSS 布局盒。(例如 display 为 none)
- 元素为根元素
- 元素为 body
- 元素的 position 为 fixed
所以,从规范角度来看,目前浏览器均没有很好的遵循。
jQuery 1.10.2 中对于这些情况统一返回 html 元素。
http://jsfiddle.net/5Cdp8/,我对 jQuery 和原生 js 做了对比,在不同浏览器下的差别很大。