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 相关文章推荐
根据分辩率调用不同的CSS.
Jan 08 Javascript
JS去除字符串的空格增强版(可以去除中间的空格)
Aug 26 Javascript
基于jquery的给文章加入关键字链接
Oct 26 Javascript
jquery实现文本框的禁用和启用
Dec 07 Javascript
完美的js图片轮换效果
Feb 05 Javascript
js实现仿购物车加减效果
Mar 01 Javascript
简单实现js菜单栏切换效果
Mar 04 Javascript
浅谈Vue组件及组件的注册方法
Aug 24 Javascript
webpack 3.X学习之多页面打包的方法
Sep 04 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
Jun 27 Javascript
JS实现随机抽取三人
Nov 06 Javascript
原生JS实现留言板
Mar 26 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
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
php类常量的使用详解
2013/06/08 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
JavaScript 面向对象编程(1) 基础
2010/05/18 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
jQuery的文档处理程序详解
2016/05/10 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
2017/12/15 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
Python 多线程实例详解
2017/03/25 Python
python语言中with as的用法使用详解
2018/02/23 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
详解python 注释、变量、类型
2018/08/10 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
银河香水:Galaxy Perfume
2019/03/25 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
工程概预算专业毕业生求职信
2013/10/04 职场文书
工程管理专业个人求职信范文
2013/12/07 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
企业年检委托书范本
2014/10/14 职场文书
经费申请报告
2015/05/15 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书