2009-08-05 156 views
2

我有一個絕對定位設置爲允許垂直滾動的div。我的應用程序包括拖動&拖放設施,依靠我確定事件觸發時元素的座標。如何計算滾動div中的元素位置?

我用來計算元素位置的偏移量(即element.offsetLeft & element.offsetTop)僅與元素的原始位置相關,並且不考慮用戶滾動導致的位置變化。我想我可以補充一個更正,如果我可以計算距離滾動,但我不明白任何方式做到這一點(不同於窗口滾動)。

真的很感激任何建議。

+0

準確確定了一個元件被在屏幕上是一個困難的問題。你需要支持多個瀏覽器還是僅支持一個? – NotMe 2009-08-05 22:53:05

+0

我忘了提及,我需要一個可以在ie6中工作的解決方案(國企 - 不是我的選擇......)。 – PeterJ 2009-08-05 22:55:59

回答

3

查看div容器的scrollTopscrollLeft屬性。

+0

謝謝你 - 夥計們應該訣竅 – PeterJ 2009-08-05 23:09:11

+0

@PeterJ:如果這對你有用,你應該投票並接受他的回答。 – 2009-08-06 11:14:23

0

這是我正在實施的糾正措施,以防任何人感興趣。

謝謝你們。

/* 
    Find a html element's position. 
    Adapted from Peter-Paul Koch of QuirksMode at http://www.quirksmode.org/js/findpos.html 
*/ 
function findPos(obj) 
{ 
    var curleft = 0; 
    var curtop = 0; 
    var curxscroll = 0; 
    var curyscroll =0; 

    while(obj && obj.offsetParent) 
    { 
     curyscroll = obj.offsetParent.scrollTop || 0; 
     curxscroll = obj.offsetParent.scrollLeft || 0; 
     curleft += obj.offsetLeft - curxscroll; 
     curtop += obj.offsetTop - curyscroll; 
     obj = obj.offsetParent; 
    } 

    return [curleft,curtop]; 
} 
1

這裏的一個跨瀏覽器的解決方案,發現了一個元素的位置考慮到滾動的div/s和窗口滾動:

var isIE = navigator.appName.indexOf('Microsoft Internet Explorer') != -1; 

function findElementPosition(_el){ 
    var curleft = 0; 
    var curtop = 0; 
    var curtopscroll = 0; 
    var curleftscroll = 0; 

    if (_el.offsetParent){ 
     curleft = _el.offsetLeft; 
     curtop = _el.offsetTop; 

     /* get element scroll position */ 
     var elScroll = _el; 
     while (elScroll = elScroll.parentNode) { 
      curtopscroll = elScroll.scrollTop ? elScroll.scrollTop : 0; 
      curleftscroll = elScroll.scrollLeft ? elScroll.scrollLeft : 0; 

      curleft -= curleftscroll; 
      curtop -= curtopscroll; 
     } 

     /* get element offset postion */ 
     while (_el = _el.offsetParent) { 
      curleft += _el.offsetLeft; 
      curtop += _el.offsetTop; 
     } 
    } 

    /* get window scroll position */ 
    var offsetX = isIE ? document.body.scrollLeft : window.pageXOffset; 
    var offsetY = isIE ? document.body.scrollTop : window.pageYOffset; 

    return [curtop + offsetY,curleft + offsetX]; 
}