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 相关文章推荐
JavaScript setTimeout和setInterval的使用方法 说明
Mar 25 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
Mar 29 Javascript
js左右弹性滚动对联广告代码分享
Feb 19 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 Javascript
常用原生js自定义函数总结
Nov 20 Javascript
使用javascript做时间倒数读秒功能的实例
Jan 23 Javascript
node微信开发之获取access_token+自定义菜单
Mar 17 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
Mar 20 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
Nov 05 Javascript
原生JS与CSS实现软件卸载对话框功能
Dec 05 Javascript
vue将文件/图片批量打包下载zip的教程
Oct 21 Javascript
node.js如何操作MySQL数据库
Oct 29 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实现mysql数据库操作类分享
2014/02/14 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
JavaScript之IE的fireEvent方法详细解析
2013/11/20 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
2016/12/29 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
浅谈如何使用webpack构建多页面应用
2018/05/30 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
paramiko模块安装和使用(远程登录服务器)
2014/01/27 Python
Python中pillow知识点学习
2018/04/30 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
2020/07/20 Python
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
制衣厂各岗位职责
2013/12/02 职场文书
大学生的创业计划书就该这么写
2014/01/30 职场文书
优秀求职信
2014/05/29 职场文书
安全环保标语
2014/06/09 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书