Подтвердить что ты не робот

Абсолютное положение элемента на экране с помощью jQuery

Как узнать абсолютную позицию элемента на текущем видимом экране (viewport) с помощью 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;

Любые идеи?

Update: Мне нужно получить точный промежуток в пикселях между вершиной моего 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));

Спасибо...

4b9b3361

Ответ 1

Смотрите .offset() здесь документ jQuery. Он дает позицию относительно документа, а не родительской. Возможно, вы смутили .offset() и .position(). Если вам нужна позиция в окне вместо позиции в документе, вы можете вычесть значения .scrollTop() и .scrollLeft() для учета прокрученной позиции.

Здесь выдержка из документа:

Метод .offset() позволяет нам получить текущую позицию элемент относительно документа. Сравните это с .position(), который извлекает текущую позицию относительно родителя смещения. При позиционировании нового элемента поверх существующего для глобального манипуляции (в частности, для реализации drag-and-drop),.offset() является более полезным.

Чтобы объединить их:

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

Вы можете попробовать его здесь (прокрутите, чтобы увидеть изменения цифр): http://jsfiddle.net/jfriend00/hxRPQ/

Ответ 2

Для абсолютных координат любого элемента 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;
}