25

如何使用 jQuery 找出元素在当前可见屏幕(视口)上的绝对位置?

我有position:relative,所以 offset() 只会给出父级内的偏移量。

我有分层 div,所以$("#me").parent().offset() + $("#me").offset()也无济于事。

我需要窗口中的位置,而不是文档,所以当文档滚动时,值应该会改变。

我知道我可以将所有父偏移量相加,但我想要一个更清洁的解决方案。

var top = $("#map").offset().top + 
    $("#map").parent().offset().top + 
    $("#map").parent().parent().offset().top +
    $("#map").parent().parent().parent().offset().top;

有任何想法吗?

更新: 我需要获取我的 div 顶部和文档顶部之间的确切像素间隙,包括填充/边距/偏移量?

我的代码:

HTML

<div id="map_frame" class="frame" hidden="hidden">
    <div id="map_wrapper">
        <div id="map"></div>
    </div>
</div>

CSS

#map_frame{
    border:1px solid #800008;
}

#map_wrapper {
    position:relative;
    left:2%;
    top:1%;
    width:95%;
    max-height:80%;
    display:block;
}

#map {
    position:relative;
    height:100%;
    width:100%;
    display:block;
    border:3px solid #fff;
}

jQuery 调整地图大小以填充屏幕*

var t = $("#map").offset().top + 
    $("#map").parent().offset().top + 
    $("#map").parent().parent().offset().top + 
    $("#map").parent().parent().parent().offset().top;

$("#map").height($(window).height() - t - ($(window).height() * 8 / 100));

谢谢...

4

3 回答 3

55

请参阅jQuery 文档.offset()中的此处。它给出了相对于文档的位置,而不是父级。你也许已经和困惑了。如果您想要窗口中的位置而不是文档中的位置,您可以减去和值来说明滚动位置。.offset().position().scrollTop().scrollLeft()

这是文档的摘录:

.offset() 方法允许我们检索元素相对于文档的当前位置。将此与 .position() 进行对比,后者检索相对于偏移父级的当前位置。当将新元素放置在现有元素之上以进行全局操作(特别是用于实现拖放)时,.offset() 更有用。

结合这些:

var offset = $("selector").offset();
var posY = offset.top - $(window).scrollTop();
var posX = offset.left - $(window).scrollLeft(); 

你可以在这里试试(滚动查看数字变化):http: //jsfiddle.net/jfriend00/hxRPQ/

于 2012-12-18T09:39:58.607 回答
4

对于我编写此函数的任何 jquery 元素的绝对坐标,它可能不适用于所有 css 位置类型,但对于某人来说可能是一个好的开始..

function AbsoluteCoordinates($element) {
    var sTop = $(window).scrollTop();
    var sLeft = $(window).scrollLeft();
    var w = $element.width();
    var h = $element.height();
    var offset = $element.offset(); 
    var $p = $element;
    while(typeof $p == 'object') {
        var pOffset = $p.parent().offset();
        if(typeof pOffset == 'undefined') break;
        offset.left = offset.left + (pOffset.left);
        offset.top = offset.top + (pOffset.top);
        $p = $p.parent();
    }

    var pos = {
          left: offset.left + sLeft,
          right: offset.left + w + sLeft,
          top:  offset.top + sTop,
          bottom: offset.top + h + sTop,
    }
    pos.tl = { x: pos.left, y: pos.top };
    pos.tr = { x: pos.right, y: pos.top };
    pos.bl = { x: pos.left, y: pos.bottom };
    pos.br = { x: pos.right, y: pos.bottom };
    //console.log( 'left: ' + pos.left + ' - right: ' + pos.right +' - top: ' + pos.top +' - bottom: ' + pos.bottom  );
    return pos;
}
于 2014-11-20T17:13:06.940 回答
4

顺便说一句,如果有人想在没有 jQuery 的情况下获取屏幕上元素的坐标,请试试这个:

function getOffsetTop (el) {
    if (el.offsetParent) return el.offsetTop + getOffsetTop(el.offsetParent)
    return el.offsetTop || 0
}
function getOffsetLeft (el) {
    if (el.offsetParent) return el.offsetLeft + getOffsetLeft(el.offsetParent)
    return el.offsetleft || 0
}
function coordinates(el) {
    var y1 = getOffsetTop(el) - window.scrollY;
    var x1 = getOffsetLeft(el) - window.scrollX; 
    var y2 = y1 + el.offsetHeight;
    var x2 = x1 + el.offsetWidth;
    return {
        x1: x1, x2: x2, y1: y1, y2: y2
    }
}
于 2020-05-07T06:32:19.893 回答