IE6/7关于 Absolute Position 、relative 的一些意外

时间:2008-11-27 11:34:00 

网上广泛流传的取 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,7也没有问题。

但是,我在做一个东东的时候,却在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 不一样!

上面这些不知道您看懂了没有。
或许您有其它的更好的取绝对位置的方法,请您共享一下。

yangedie: 获取位置,我都是用obj.getBoundingClientRect()

我佛山人:参考下mootools 1.2.1的Element.Dimensions.js

标签:ie6,ie7,Absolute,代码
0
投稿

猜你喜欢

  • 面向对象设计过程中必须遵守的相关准则

    2009-01-08 15:52:00
  • XMLHTTP获取web造访头信息和网页代码

    2010-04-01 14:37:00
  • ajax 同步请求和异步请求的差异分析

    2011-07-05 12:36:04
  • 让数据站住脚-浅谈用户研究中的信度与效度

    2010-09-10 13:14:00
  • ASP生成静态页面的方法

    2010-05-27 12:13:00
  • 一个用JavaScript写的本周是本学期第几周的程序

    2009-03-09 12:49:00
  • IE和Firefox的js兼容性整理

    2007-11-21 19:40:00
  • 通过模版字符串及JSON数据进行目标内容整理的一个小方法

    2010-01-12 16:55:00
  • 在js中的replace方法详解

    2007-08-21 15:47:00
  • Excute后都需要返回一个RecordSet对象吗?

    2009-10-28 18:28:00
  • asp是的日期转换为星座的函数

    2011-02-26 11:11:00
  • ServerXMLHTTP的超时设置(setTimeouts)参数含义

    2009-02-12 12:51:00
  • asp封装dll源码分享

    2008-09-25 17:20:00
  • CSS文件的编码要和页面的编码相一致

    2010-06-06 13:59:00
  • 推荐9款很棒的网页绘制图表JavaScript框架脚本

    2009-04-15 12:13:00
  • 在ASP中使用类,实现模块化

    2008-10-15 14:57:00
  • ORACLE实例的后台进程

    2009-09-30 10:28:00
  • CSS设计之如何让数字字母自动换行

    2007-10-19 15:12:00
  • Oracle 10G:PL/SQL正规表达式(正则表达式)手册

    2009-07-02 12:33:00
  • 个人网站与动网整合非官方方法

    2009-07-05 18:42:00
  • asp之家 网络编程 m.aspxhome.com