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 相关文章推荐
你需要知道的10个最佳javascript开发实践小结
Apr 15 Javascript
js数组的基本操作(很全自己整理的)
Oct 16 Javascript
jquery 获取select数组与name数组长度的实现代码
Jun 20 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
Sep 19 Javascript
给easyui的datebox控件添加清空按钮的实现方法
Nov 09 Javascript
Javascript同时声明一连串(多个)变量的方法
Jan 23 Javascript
jQuery日期范围选择器附源码下载
May 23 jQuery
Angular限制input框输入金额(是小数的话只保留两位小数点)
Jul 13 Javascript
vue.js 实现评价五角星组件的实例代码
Aug 13 Javascript
jQuery实现图片下载代码
Jul 18 jQuery
微信小程序使用echarts获取数据并生成折线图
Oct 16 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
Sep 07 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下一个阿拉伯数字转中文数字的函数
2007/07/16 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
PHP统计当前在线用户数实例讲解
2015/10/21 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
PHP7修改的函数
2021/03/09 PHP
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
javascript运行机制之执行顺序理解
2020/08/03 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
Python字符串处理函数简明总结
2015/04/13 Python
python批量赋值操作实例
2018/10/22 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
对python中assert、isinstance的用法详解
2019/11/27 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
冰淇淋店的创业计划书
2014/02/07 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
大学应届毕业生求职信
2014/05/24 职场文书
销售提升方案
2014/06/07 职场文书
争做文明公民倡议书
2014/08/29 职场文书
公安机关起诉意见书
2015/05/20 职场文书
开学第一周总结
2015/07/16 职场文书
团队执行力培训心得体会
2015/08/15 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android