获取页面中元素到文档区域document的横向纵向坐标的两种方法及其比较
在js控制元素运动的过程中对于页面元素坐标位置的获取是经常用到的这里主要总结下两种方法
一通过叠加元素对象和它的offsetParent(如果存在)的offsetLeft/offsetTop属性来实现
在阅读javascript高级程序设计第三版DOM部分时了解到要获取某个元素在页面上的偏移量需要将这个元素的offsetLeft和offsetTop与其offsetParent的相同属性相加一直循环直至根元素所以要得到元素到文档区域的坐标位置只需通过while循环不断获取offsetParent的offsetLeft/offsetTop直到offsetParent = null为止
js代码
代码如下:
// 获取元素到文档区域的坐标
function getPosition(element) {
var actualLeft = elementoffsetLeft
actualTop = elementoffsetTop
current = elementoffsetParent; // 取得元素的offsetParent
// 一直循环直到根元素
while (current !== null) {
actualLeft += currentoffsetLeft;
actualTop += currentoffsetTop;
current = currentoffsetParent;
}
// 返回包含lefttop坐标的对象
return {
left: actualLeft
top: actualTop
};
}
例子截图
firebug下测试结果截图(注其他浏览器已通过测试!)
二通过 getBoundingClientRect() 方法实现
getBoundingClientRect方法用于获得页面中某个元素的左上右和下分别相对浏览器视窗window的位置返回的是一个对象该对象有四个属性topleftrightbottom;该方法原本是IE Only的但是FF+和Opera+已经支持了该方法可以说在获得页面元素位置上效率有很大的提高 另外该方法避免使用while循环而是直接获取数值来实现比第一种方法性能要好特别是在复杂的页面上更为明显
js代码
代码如下:
// 获取元素到文档区域的坐标
function getPosition(element){
var dc = document
rec = elementgetBoundingClientRect()
_x = recleft // 获取元素相对浏览器视窗window的左上坐标
_y = rectop;
// 与html或body元素的滚动距离相加就是元素相对于文档区域document的坐标位置
_x += dcdocumentElementscrollLeft || dcbodyscrollLeft;
_y += dcdocumentElementscrollTop || dcbodyscrollTop;
return {
left: _x
top: _y
};
}
经测试该方法与第一种方法获取元素相对于document的坐标大小相同对于IE低版本浏览器存在一些差异
注意记得要累加上html(IE除外)或body(针对IE)元素的水平或垂直滚动距离!
结语上文已对如何获取元素相对于文档区域document的坐标位置做出了阐述如遇到相关问题可联系本人或直接发表评论另外对于右坐标right以及下坐标bottom的获取只需把lefttop坐标的大小和元素本身的宽度(elemoffsetWidth)以及高度(elemoffsetHeight)相加即可当然offsetWidthoffsetHeight属性会计算元素的内边距边框所以最好的办法还是通过getBoundingClientRect方法来获取ps补充一点利用该方法返回对象的rightleft = 元素宽度;bottomtop = 元素高度可以获取不带边框的元素本身的宽度和高度