网络编程
位置:首页>> 网络编程>> JavaScript>> 获取Dom元素的X/Y坐标(2)

获取Dom元素的X/Y坐标(2)

作者:zhusun 来源:Koubei UED 发布时间:2009-10-10 12:49:00 

标签:dom,坐标,框架,对象

将ClientRect对象的left、top属性分别加上scrollLeft和scrollTop,就能获取Dom元素的X/Y坐标了。但对于IE8之前的IE版本在很多情况下要对这个值进行一些调整,有三种情况,下面来分别看一下:

1.IE6的标准模式下不需要调整;

2.所有怪异模式下为取document的当前borderLeftWidth和borderTopWidth值做调整,分别加在X/Y坐标值上;

3.其他的情况都分别在X/Y坐标值上加上2;

样就可以获取最后准确的X/Y坐标了。如果所有的浏览器都能如此就好了,可惜有些浏览器(FF2、Safari)不支持getBoundingClientRect方法。需要通过一级级查找和计算offsetParent来获取X/Y坐标值。这里首先介绍什么是元素的offsetParent属性。

offsetParent属性是距离调用offsetParent的元素最近的(在包含层次中最靠近的),并且是已进行过CSS定位的与容器元素。首先说明一下CSS定位,是指对元素设置position属性为absolute、relative或fixed(IE6除外),还有一个问题是元素在table元素中时会有不同的情况。

下面是我的一些归纳,不全之处望大家指出:

1.元素不在table元素中,且元素及其所有上级元素都未进行CSS定位时,这个元素的offsetParent属性为根元素(Body);

2.元素本身没进行CSS定位,而出现在table中或有上级元素进行了CSS定位,那么当向上先达到TD元素时该元素的offsetParent属性为TD元素;当向上先达到进行了CSS定位的上级元素时该元素的offsetParent属性为该上级元素;

3.无论元素在不在table中,只要元素本身进行了CSS定位,有上级元素进行了CSS定位的则元素的offsetParent属性为该上级元素,没有上级素进行了CSS定位的则元素的offsetParent属性为根元素;

知道了offsetParent属性的含义,就可以通过offsetParent属性来一级级的计算X/Y坐标了。一种比较简单的while循环:

    var node;/*求坐标的元素*/
    var xy=[];/*保存XY坐标*/
    while ((node = node.offsetParent)) {
      xy[0] += node.offsetLeft;
      xy[1] += node.offsetTop];
    }

通过这一个循环就能累计元素每级offsetParent属性元素的偏移量,但这个偏移量在累加的过程中没有计算每级父元素有滚动条的情况,最后还要同getBoundingClientRect方法一样加上页面滚动值(这里scrollLeft和scrollTop)。现在先来累计计算元素每上级元素的滚动条情况,首先判断元素本身是不是设置了position为fixed:

1.设置了则不用计算每上级元素的滚动条情况,但需要对Opera和其他浏览器做区分,Opera浏览器减去scrollLeft和scrollTop xy[0] -= scrollLeft;xy[1] -= scrollTop;,其他情况是加上scrollLeft和scrollTop。

xy[0] += scrollLeft;xy[1] += scrollTop;2.未设置时就需要累计计算元素每上级元素的滚动条,通过一个循环里累加:

while ((node = node.parentNode) && node.tagName) {
  scrollTop = node.scrollTop;
  scrollLeft = node.scrllLeft;
  if (scrollTop || scrollLeft) {
    xy[0] -= scrollLeft;
    xy[1] -= scrollTop;
  }
}

最后机上页面滚动值

xy[0] += scrollLeft;xy[1] += scrollTop;

这样最后就可以在不支持getBoundingClientRect方法的浏览器下获取元素的X/Y坐标了。
最后总结一下,如果浏览器支持getBoundingClientRect方法,通过该方法再加上页面滚动条的偏移就能获取元素的X/Y了(不同浏览器需要微调),如果不支持getBoundingClientRect方法,则需要通过循环该元素的每级offsetParent属性来累计偏移量,再通过每个父级元素的滚动条来调整,最后再加上页面滚动条的偏移来获取元素的X/Y坐标。获取X/Y坐标的方式还有很多,可能不尽相同,我这里主要是基于YUI里面的思想和方法。不全之处望大家指正~

0
投稿

猜你喜欢

  • 关于截取字符串指定长度的自定义函数很多,各式各样!不过大多原理都是一个样,循环字符串判断每一个字符的asc码!我这里也有一个,示例函数如下:
  • 其实也算不上教程,也就是自己没事儿的时候做点东西然后发上来大家交流交流,希望大家不吝赐教^!^因为刚看过亚东的教程和这个有点相似,所以就自己
  • CSS 盒模型网页设计中的每个元素都是长方形的盒子。盒子的尺寸是怎样精确计算的,请看下图:如果是 Firebug 用户的话(基本和前端有关的
  • 如何用SQLMail建立一个电子刊物自动处理系统?下面我们用SQLMail来做一个电子刊物自动处理系统。在这个系统中,主要实现两个功能:1、
  • 听说firefox是史上最好用的浏览器,便下载下来体验一番,将体验感受与大家分享一下,并和我一直使用的the world浏览器做一个对比!首
  • EcmaScript正則表達式( 深入淺出系列之淺出 ^_^ )在线正则表达式测试:http://www.aspxhome.com/RegE
  • asp压缩access数据库,具体asp代码见下: Class DatabaseTools   &n
  • 下面是我已经证实可用的自动备份的方法. 1、打开企业管理器->管理->sql server代理 2、新建一个作业,作业名称随便取
  • 将有安全问题的SQL过程删除,比较全面.一切为了安全!删除了调用shell,注册表,COM组件的破坏权限use master&nb
  • 任何一位数据库程序员都会有这样的体会:高通信量的数据库驱动程序中,一条糟糕的SQL查询语句可对整个应用程序的运行产生严重的影响,其不仅消耗掉
  • 我的工作内容可以说是五花八门,策划、文案、设计(包括平面设计、网站设计、VIS设计)、前端代码、交互、测试、摄影、项目管理等。所有这些工作最
  • 见过很多网站,在设计的时候给了用户很大的自由度,我个人并不赞同这种做法。最简单的例子,圈网。我在研究圈网的时候注册完成后圈网给了我一个搜索框
  • li {list-style-image: url(images/disc.gif);}li的这个样式定义是将列表项目使用图片来代替显示的小
  • 原文:Five quick JavaScript tips真是五个很quick的小提示:1.只在<form>元素上使用submi
  • 原理:第一步:应用程序把查询SQL语句发给服务器端执行。我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给
  • ASP 错误代码 说明 ASP 0100 内存不足 ASP 0101 意外错误 ASP 0102 需要字符串输入 ASP 0103 需要数字
  • 如IP为192.168.1.111现要截取第二个.之前的值,得到结果192.168,很多网站都只显示前面2个值  &nb
  • 最近在开发项目的过程中遇到一个问题,就是在插入一条记录的后要立即获取所在数据库中ID,而该ID是自增的,怎么做?在sql server 20
  • !DOCTYPE--------------------------------------------------------------
  • 前阵子刚完成一个B/S架构的学校办公系统,体会就是表太多,文件太多,而每个文件中类似的操作(代码)也太多了,例如学生信息和教师信息操作,st
手机版 网络编程 asp之家 www.aspxhome.com