元件空间偏移包括滚动

问题描述:

为了得到一个元素偏移我用:元件空间偏移包括滚动

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; 
} 

问题是我无法弄清楚如何合并这些两个函数在一起,所以我可以得到一个元素偏移,包括页面上已经完成的任何滚动。当设置一个元素位置时,我通常只需要引用这两个函数,但在一个函数中获得总偏移量似乎是有意义的。我怎样才能做到这一点?在一个函数中完成这一切事件是否是一个好主意,或者是否存在具体的用例,如果没有滚动来获得偏移量是一个好主意?

+0

为什么你会想要scrollLeft/Top包含在offset中?为什么你会想要积累完全无关的元素的scrollLeft/Tops?如果一个div滚动到40,body变为200,那么我可以使用数字240做什么? – Esailija 2012-07-28 14:10:58

+0

@Esailija可能会在视图框中查找元素的绝对位置? – Qnan 2012-07-28 14:12:21

+0

这个想法是能够得到一个元素在屏幕上的实际位置,如果一个自动溢出的div已经向下滚动,实际位置将不得不包括滚动位置以获得屏幕上的实际位置。 – ryandlf 2012-07-28 14:13:12

你的意思是这样的吗?

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