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继承的实现
Oct 24 Javascript
yepnope.js 异步加载资源文件
Sep 08 Javascript
JavaScript转换农历类实现及调用方法
Jan 27 Javascript
用jquery写的菜单从左往右滑动出现
Apr 11 Javascript
js中函数声明与函数表达式
Jun 03 Javascript
基于jQuery通过jQuery.form.js插件实现异步上传
Dec 13 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
Jan 05 Javascript
node.js实现博客小爬虫的实例代码
Oct 08 Javascript
javascript入门之window对象【新手必看】
Nov 22 Javascript
jquery.masonry瀑布流效果
May 25 jQuery
对vue里函数的调用顺序介绍
Mar 17 Javascript
p5.js临摹旋转爱心
Oct 23 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 广告调用类代码(支持Flash调用)
2011/08/11 PHP
ThinkPHP3.1数据CURD操作快速入门
2014/06/19 PHP
十幅图告诉你什么是PHP引用
2015/02/22 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
2020/12/24 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
Python中优化NumPy包使用性能的教程
2015/04/23 Python
用Pygal绘制直方图代码示例
2017/12/07 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
关于Python中的向量相加和numpy中的向量相加效率对比
2019/08/26 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
美味咖啡的顶级烘焙师:Cafe Britt
2018/03/15 全球购物
数控技术应用个人求职信范文
2014/02/03 职场文书
追悼会主持词
2014/03/20 职场文书
教师党员一句话承诺
2014/03/28 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
职代会闭幕词
2015/01/28 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
详解Python如何批量采集京东商品数据流程
2022/01/22 Python