IE6/7下absolute/relative position的一些意外

网络整理 - 07-29
网上广泛流传的获取object绝对位置的代码是:

var getAbsPos = function(pTarget){
 pTarget = JObj.$(pTarget);
 var x_ = y_ = 0;
 if(pTarget.style.position != "absolute"){
  while(pTarget.offsetParent){
   x_ += pTarget.offsetLeft;
   y_ += pTarget.offsetTop;
   pTarget = pTarget.offsetParent;
  }
 }
 x_ += pTarget.offsetLeft;
 y_ += pTarget.offsetTop;
 return {x:x_,y:y_};
}



这段代码在IE8、FF、Opera及Safari下都没有问题(因为各个浏览器的一些表现不一,所以数值上有少许差别,不过差别都只在几个像素而已),如果不是特殊情况,IE6和IE7也没有问题。

但是,我在做一个效果的时候,却在IE6/7下得到意想不到的值(注:特殊环境),如下面的代码(请在IE6/7下执行):


        



运行后,最上面有一些输出:

IE8为:

A.(0) -> div.section(250) -> div.right(225) -> div.com_directory(5) -> div.col1 (5) -> div.body(0) -> div.yesido(135) -> 
Total Offset Left:620



IE7为:

A.(0) -> div.section(250) -> div.right(230) -> div.com_directory(980) -> div.col1 (5) -> div.body(0) -> div.yesido(126) -> 
Total Offset Left:1591



IE6为:

A.(0) -> div.section(250) -> div.right(-750) -> div.com_directory(980) -> div.col1 (5) -> div.body(0) -> div.yesido(126) -> 
Total Offset Left:611



FF为:

A.(250) -> div.right(225) -> div.com_directory(5) -> div.col1(5) -> div.body(0) -> div.yesido(140) -> 
Total Offset Left:625



Opera为:

A.(250) -> div.right(225) -> div.com_directory(5) -> div.col1 (5) -> div.body(0) -> div.yesido(137) -> 
Total Offset Left:622



Safari为:

A.(250) -> div.right(225) -> div.com_directory(5) -> div.col1 (5) -> div.body(0) -> div.yesido(140) -> 
Total Offset Left:625



IE7下:1591,这个很扎眼;IE6下:div.right(-750)也很扎眼。

到底是为什么呢?我做过一些测试,在那段代码中有标出:
如果去掉"<!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-->"这一段,则:

IE7下是正常的:

A.(0) -> div.section(250) -> div.right(230) -> div.com_directory(5) -> div.col1 (5) -> div.body(0) -> div.yesido(129) -> 
Total Offset Left:619



IE6下还是不正常:

A.(0) -> div.section(250) -> div.right(-750) -> div.com_directory(5) -> div.col1 (5) -> div.body(0) -> div.yesido(126) -> 
Total Offset Left:-364



其它浏览器(包括IE8)一切正常。


如果不去掉"<!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-->",而是把:
.com_directory {
       position: relative;/*8888888888888888888888888888888888*/
}

换成:
.com_directory {
       position: absolute;/*8888888888888888888888888888888888*/
}

或是:
.com_directory {
}

IE7/IE6是正常的:

A.(0) -> div.section(250) -> div.right(230) -> div.col1 (5) -> div.body(0) -> div.yesido(126) -> 
Total Offset Left:611。




其它浏览器也正常。

但是现实中,你不可能对一个comment(HTML注释)做操作,我测试过,即使那段注释是其它的,比如:<br />,IE7下正常;比如:<div style="clear:both"></div>,IE6下正常。真的是变化莫测。

细心观察,你可以发现IE下的offsetParent和其它浏览器的offsetParent不一样!

或许还有其它更好的取绝对位置的方法吧。