怎样用JavaScript获得/测算网页页面元素的offset

日期:2020-12-11 类型:科技新闻 

关键词:如何制作微信小程序,微信小程序源码,小程序码生成,凡科网微信小程序,微信公众号小程序

难题 

根据点一下1控制,在控制的下面显示信息1个波动层,一般的做法是:获得此控制的offset值,再测算出波动层的top,left等css特性的值,取值便可。

那末下面就看1下怎样获得控制的offset值。

纯JS的完成

最先想起的是这样的1段js。


拷贝编码
编码以下:

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

发现必须加上值企业,那末就改动成下面这模样:

用IETester和FireFox再检测下,IE6+下都可以以,如之前1样,写出的纯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的完成

再细1步去查有关难题时发现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;
});
}
});

测算方法大同市小异,但是有1点需留意的是:

offset() 涵数的测算 不包含margin值(但包括border值)