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 相关文章推荐
js获取控件位置以及不同浏览器中的差别介绍
Aug 08 Javascript
js中this的用法实例分析
Jan 10 Javascript
BootStrap table表格插件自适应固定表头(超好用)
Aug 24 Javascript
jquery实现简单的瀑布流布局
Dec 11 Javascript
使用原生js封装的ajax实例(兼容jsonp)
Oct 12 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
Jan 16 Javascript
完美解决iview 的select下拉框选项错位的问题
Mar 02 Javascript
vue使用Proxy实现双向绑定的方法示例
Mar 20 Javascript
解决layui数据表格Date日期格式的回显Object的问题
Sep 19 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
Oct 30 Javascript
JavaScript字符和ASCII实现互相转换
Jun 03 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
php统计文章排行示例
2014/03/04 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
laravel自定义分页效果
2017/07/23 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
获取DOM对象的几种扩展及简写
2006/10/09 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
使用React实现轮播效果组件示例代码
2016/09/05 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
Jquery EasyUI $.Parser
2017/06/02 jQuery
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
JavaScript设计模式之工厂模式和抽象工厂模式定义与用法分析
2018/07/26 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
[00:02]DOTA2新版本使用PA至宝后暴击展示
2014/11/19 DOTA
举例区分Python中的浅复制与深复制
2015/07/02 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
实例讲解python中的序列化知识点
2018/10/08 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
冰淇淋开店创业计划书
2014/02/01 职场文书
优秀家长事迹材料
2014/05/17 职场文书
个人遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
三潭印月的导游词
2015/02/12 职场文书
实习证明格式范文
2015/06/16 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技
配置nginx负载均衡
2022/05/06 Servers
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS