手机
当前位置:查字典教程网 >网页设计 >心得技巧 >如何用JavaScript获取/计算页面元素的offset
如何用JavaScript获取/计算页面元素的offset
摘要:问题通过点击一控件,在控件的下面显示一个浮动层,通常的做法是:获取此控件的offset值,再计算出浮动层的top,left等css属性的值,...

问题

通过点击一控件,在控件的下面显示一个浮动层,通常的做法是:获取此控件的offset值,再计算出浮动层的top,left等css属性的值,赋值即可。

那么下面就看一下如何获取控件的offset值。

纯JS的实现

首先想到的是这样的一段js。

document.getElementById("divFloat").style.top=document.getElementById("Button").offsetLeft+25;

发现需要添加值单位,那么就修改成下面这样子:

用IETester和FireFox再测试下,IE6+下都可以,如以前一样,写出的纯js的方法无情地被FireFox鄙视了,获取的值不正确。

网上再查了下,发现应该这样写,通过循环,层层向上计算,最后得到准确的offset值。

function getOffsetLeft(o)

{

var left=0;

var offsetParent = o;

while (offsetParent != null && offsetParent != document.body)

{

left += offsetParent.offsetLeft;

offsetParent = offsetParent.offsetParent;

}</p> <p>return left;

}

jQuery的实现

再细一步去查相关问题时发现jQuery中已经包含了实现此功能的函数:offset(),很好地兼容了各浏览器。

$("#Button").offset().left

下载源码后发现jQuery是这样实现的

jQuery.fn.extend({

position: function() {

if ( !this[0] ) {

return null;

}

var elem = this[0],

// Get *real* offsetParent

offsetParent = this.offsetParent(),

// Get correct offsets

offset = this.offset(),

parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();

// Subtract element margins

// note: when an element has margin: auto the offsetLeft and marginLeft

// are the same in Safari causing offset.left to incorrectly be 0

offset.top -= parseFloat( jQuery.curCSS(elem, "marginTop", true) ) || 0;

offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0;

// Add offsetParent borders

parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth", true) ) || 0;

parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;

// Subtract the two offsets

return {

top: offset.top - parentOffset.top,

left: offset.left - parentOffset.left

};

},

offsetParent: function() {

return this.map(function() {

var offsetParent = this.offsetParent || document.body;

while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {

offsetParent = offsetParent.offsetParent;

}

return offsetParent;

});

}

});

计算方式大同小异,不过有一点需注意的是:

offset() 函数的计算 不包括margin值(但包含border值)

【如何用JavaScript获取/计算页面元素的offset】相关文章:

按照字体名称调用字体让浏览器显示你希望的字体

用frameset实现复杂的页面布局技巧小结

网页FOUC问题导致网页混乱的解决方法

关于页面元素的绝对定位和相对定位的一些理解

对div盒子模型使用心得总结

如何将页脚固定在页面底部(多种方法实现)

谁是用户体验的设计者?

网页设计关于超级链接的设计原则

使用data URI scheme在网页中内嵌图片使用介绍

如何制作百度死链文件的方法介绍

精品推荐
分类导航