元件空间偏移包括滚动
问题描述:
为了得到一个元素偏移我用:元件空间偏移包括滚动
function(el) {
if(el && el.parentNode) {
var x = 0;
var y = 0;
while(el) {
x += el.offsetLeft;
y += el.offsetTop;
el = el.offsetParent;
}
return {x: x, y: y};
}
return null;
}
,并获得其滚动偏移量使用:
function(el) {
if(el && el.parentNode) {
var x = 0;
var y = 0;
while(el) {
if(el && el.parentNode) {
x += el.scrollLeft;
y += el.scrollTop;
el = el.parentNode;
} else {
el = null;
}
}
return {x: x, y: y};
}
return null;
}
问题是我无法弄清楚如何合并这些两个函数在一起,所以我可以得到一个元素偏移,包括页面上已经完成的任何滚动。当设置一个元素位置时,我通常只需要引用这两个函数,但在一个函数中获得总偏移量似乎是有意义的。我怎样才能做到这一点?在一个函数中完成这一切事件是否是一个好主意,或者是否存在具体的用例,如果没有滚动来获得偏移量是一个好主意?
答
你的意思是这样的吗?
function f (el) {
var offset = (function(el) {
if(el && el.parentNode) {
var x = 0;
var y = 0;
while(el) {
x += el.offsetLeft;
y += el.offsetTop;
el = el.offsetParent;
}
return {x: x, y: y};
}
return null;
})(el);
var scroll = (function(el) {
if(el && el.parentNode) {
var x = 0;
var y = 0;
while(el) {
if(el && el.parentNode) {
x += el.scrollLeft;
y += el.scrollTop;
el = el.parentNode;
} else {
el = null;
}
}
return {x: x, y: y};
}
return null;
})(el);
return { x: offset.x + scroll.x, y: offset.y + scroll.y }
}
+1
所以没有办法做到这一点没有迭代dom两次? – ryandlf 2012-07-28 14:24:02
为什么你会想要scrollLeft/Top包含在offset中?为什么你会想要积累完全无关的元素的scrollLeft/Tops?如果一个div滚动到40,body变为200,那么我可以使用数字240做什么? – Esailija 2012-07-28 14:10:58
@Esailija可能会在视图框中查找元素的绝对位置? – Qnan 2012-07-28 14:12:21
这个想法是能够得到一个元素在屏幕上的实际位置,如果一个自动溢出的div已经向下滚动,实际位置将不得不包括滚动位置以获得屏幕上的实际位置。 – ryandlf 2012-07-28 14:13:12