【分享】深入挖掘 offsetParant 元素的判定
在处理某些JS程序的时候,往往会用到一个元素的坐标值,如果,把页面的左上角当作是原点,那么,如何正确的取到一个元素的坐标值呢?一般来说,会采用元素的 offsetLeft 值取得横轴的坐标, offsetTop 值取得纵轴的坐标。某元素 offsetLeft 和 offsetTop 属性值是偏移量没错,关键在于,它针对哪个元素的偏移值?是它的直接父元素吗?…… 其实应该是它的 offsetParent。而且,要求它的确切坐标,也需要递归计算它所有的 offsetParent 的相对坐标值,直到 offsetParent 是null为止。看来,offsetParent 是关键。
对于元素A的offsetParent,W3C标准的 CSSOM 规范,对此作了规定。我们现在就跟据标准挖掘一下,各浏览器到底是不是一致,是不是遵守标准。
如何元素 A 的 offsetParant 元素 B
A是根元素或 BODY 则 offsetParent 元素为null
<html id="_html"><script> function op(id) { var off = document.getElementById(id); return id + " offsetParent : " + (!!off.offsetParent ? off.offsetParent : "null"); } window.onload = function() { document.getElementById("info").innerHTML = op("_body") + "</br>" + op("_html"); }</script><body id="_body"><div id="info"></div></body></html>
<html id="_html"><script> function op(id) { var off = document.getElementById(id); return id + " offsetParent : " + (!!off.offsetParent ? off.offsetParent.id : "null"); } window.onload = function() { document.getElementById("info").innerHTML = op("_fixed"); }</script><body id="_body"><div id="_fixed" style="position:fixed;">fixed</div><div id="info"></div></body></html>
<html id="_html"><script> function op(id) { var off = document.getElementById(id); return id + " offsetParent : " + (!!off.offsetParent ? off.offsetParent.id : "null"); } window.onload = function() { document.getElementById("info").innerHTML = op("_normaldiv"); }</script><body id="_body"><div id="_positioned" style="position:relative;"> <div id="second"> <div id="_normaldiv"></div> </div></div><div id="info"></div></body></html>
<html id="_html"><script> function op(id) { var off = document.getElementById(id); return id + " offsetParent : " + (!!off.offsetParent ? off.offsetParent.id : "null"); } window.onload = function() { document.getElementById("info").innerHTML = op("_normaldiv"); }</script><body id="_body"><div id="_positioned" style="position:relative;"> <div id="first" style="width:100px;"> <div id="second"> <div id="_normaldiv"></div> </div> </div></div><div id="info"></div></body></html>
<html id="_html"><script> function op(id) { var off = document.getElementById(id); return id + " offsetParent : " + (!!off.offsetParent ? off.offsetParent.id : "null"); } window.onload = function() { document.getElementById("info").innerHTML = op("_normaldiv"); }</script><body id="_body"><div id="_positioned"> <div id="first" style="width:100px;"> <div id="second"> <div id="_normaldiv"></div> </div> </div></div><div id="info"></div></body></html>
<html id="_html"><script> function op(id) { var off = document.getElementById(id); return id + " offsetParent : " + (!!off.offsetParent ? off.offsetParent.id : "null"); } window.onload = function() { document.getElementById("info").innerHTML = op("_th") + "<br/>" + op("_td") + "<br/>" + op("_positoinedinth") + "<br/>" + op("_positoinedintd") + "<br/>" + op("_inth") + "<br/>" + op("_intd") + "<br/>"; }</script><body id="_body"><table id="_table"> <tr id="_tr"> <th id="_th"> <div id="_inth">in th</div> <div id="_positoinedinth" style="position:relative;">positoined in th</div> </th> <td id="_td"> <div id="_intd">in tr</div> <div id="_positoinedintd" style="position:relative;">positoined in th</div> </td> </tr></table><div id="info"></div></body></html>