如何计算滚动div中的元素位置?

时间:2009-08-05 22:49:21

标签: css html scroll position

我有一个带有绝对定位设置的div,允许垂直滚动。我的应用程序包括drag&放弃依赖于我在事件被触发时确定元素坐标的设施。

我用来计算元素位置的偏移量(即element.offsetLeft& element.offsetTop)仅涉及元素的原始位置,并不考虑用户滚动产生的位置变化。我想我可以添加一个校正,如果我可以计算滚动的距离,但我看不到任何方法这样做(与窗口滚动不同)。

非常感谢任何建议。

3 个答案:

答案 0 :(得分:3)

查看div容器的scrollTopscrollLeft属性。

答案 1 :(得分: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];
}

答案 2 :(得分: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];
}