js获取元素到文档区域document的(横向、纵向)坐标的两种方法


Posted in Javascript onMay 17, 2013

获取页面中元素到文档区域document的横向、纵向坐标的两种方法及其比较
在js控制元素运动的过程中,对于页面元素坐标位置的获取是经常用到的,这里主要总结下两种方法:

一:通过叠加元素对象和它的offsetParent(如果存在)的offsetLeft/offsetTop属性来实现
在阅读javascript高级程序设计第三版DOM部分时,了解到要获取某个元素在页面上的偏移量,需要将这个元素的offsetLeft和offsetTop与其offsetParent的相同属性相加,一直循环直至根元素。所以,要得到元素到文档区域的坐标位置,只需通过while循环不断获取offsetParent的offsetLeft/offsetTop直到offsetParent = null为止。
js代码

// 获取元素到文档区域的坐标 
function getPosition(element) { 
var actualLeft = element.offsetLeft, 
actualTop = element.offsetTop, 
current = element.offsetParent; // 取得元素的offsetParent 
// 一直循环直到根元素 
while (current !== null) { 
actualLeft += current.offsetLeft; 
actualTop += current.offsetTop; 
current = current.offsetParent; 
} 
// 返回包含left、top坐标的对象 
return { 
left: actualLeft, 
top: actualTop 
}; 
}

例子截图

js获取元素到文档区域document的(横向、纵向)坐标的两种方法 
firebug下测试结果截图:(注:其他浏览器已通过测试!)

js获取元素到文档区域document的(横向、纵向)坐标的两种方法

二:通过 getBoundingClientRect() 方法实现
getBoundingClientRect方法用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗window的位置。返回的是一个对象,该对象有四个属性:top,left,right,bottom;该方法原本是IE Only的,但是FF3.0+和Opera9.5+已经支持了该方法,可以说在获得页面元素位置上效率有很大的提高。 另外,该方法避免使用while循环,而是直接获取数值来实现,比第一种方法性能要好,特别是在复杂的页面上更为明显。
js代码

// 获取元素到文档区域的坐标 
function getPosition(element){ 
var dc = document, 
rec = element.getBoundingClientRect(), 
_x = rec.left, // 获取元素相对浏览器视窗window的左、上坐标 
_y = rec.top; 
// 与html或body元素的滚动距离相加就是元素相对于文档区域document的坐标位置 
_x += dc.documentElement.scrollLeft || dc.body.scrollLeft; 
_y += dc.documentElement.scrollTop || dc.body.scrollTop; 
return { 
left: _x, 
top: _y 
}; 
}

经测试,该方法与第一种方法获取元素相对于document的坐标大小相同,对于IE低版本浏览器,存在一些差异。

注意:记得要累加上html(IE除外)或body(针对IE)元素的水平或垂直滚动距离!
结语:上文已对如何获取元素相对于文档区域document的坐标位置做出了阐述,如遇到相关问题,可联系本人或直接发表评论,另外,对于右坐标right以及下坐标bottom的获取只需把left、top坐标的大小和元素本身的宽度(elem.offsetWidth)以及高度(elem.offsetHeight)相加即可,当然offsetWidth、offsetHeight属性会计算元素的内边距、边框,所以最好的办法还是通过getBoundingClientRect方法来获取。ps:补充一点,利用该方法返回对象的right-left = 元素宽度;bottom-top = 元素高度。可以获取不带边框的元素本身的宽度和高度。

Javascript 相关文章推荐
JQuery CSS样式控制 学习笔记
Jul 23 Javascript
jQuery 表单验证扩展代码(二)
Oct 20 Javascript
jquery实现div拖拽宽度示例代码
Jul 31 Javascript
JQuery创建DOM节点的方法
Jun 11 Javascript
AngularJS实现Model缓存的方式
Feb 03 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
Jun 24 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
Aug 02 Javascript
jQuery回调方法使用示例
Jun 26 jQuery
微信小程序 rich-text的使用方法
Aug 04 Javascript
Angularjs实现多图片上传预览功能
Jul 18 Javascript
详解vue中axios的使用与封装
Mar 20 Javascript
JavaScript实现登录窗体
Jun 22 Javascript
javascript解决innerText浏览器兼容问题思路代码
May 17 #Javascript
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
May 17 #Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
May 17 #Javascript
JQuery DataTable删除行后的页面更新利用Ajax解决
May 17 #Javascript
extjs ColumnChart设置不同的颜色实现代码
May 17 #Javascript
JQuery设置和去除disabled属性的5种方法总结
May 16 #Javascript
javascript检测页面是否缩放的小例子
May 16 #Javascript
You might like
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
用于table内容排序
2006/07/21 Javascript
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
js中用window.open()打开多个窗口的name问题
2014/03/13 Javascript
JavaScript学习笔记之Function对象
2015/01/22 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
JS实现为排序好的字符串找出重复行的方法
2016/03/02 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
完美解决在oj中Python的循环输入问题
2018/06/25 Python
python pygame实现五子棋小游戏
2020/10/26 Python
python global关键字的用法详解
2019/09/05 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
python 实现性别识别
2020/11/21 Python
十岁生日父母答谢词
2014/01/18 职场文书
班组长岗位职责
2014/03/03 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
为Centos安装指定版本的Docker
2022/04/01 Servers
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js
CentOS MySql8 远程连接实战
2022/04/19 MySQL