JQuery получает местоположение элемента относительно окна
Учитывая HTML DOM ID, как получить позицию элемента относительно окна в JavaScript/JQuery? Это не то же самое, что относительно документа или смещенного родителя, поскольку элемент может находиться внутри iframe или некоторых других элементов. Мне нужно получить расположение экрана прямоугольника элемента (как в позиции и измерении), так как оно отображается в настоящее время. Отрицательные значения приемлемы, если элемент в данный момент отключен (прокручивается).
Это для приложения iPad (WebKit/WebView). Всякий раз, когда пользователь нажимает на специальную ссылку в UIWebView
, я должен открыть всплывающее представление, которое отображает дополнительную информацию о ссылке. В представлении popover необходимо отобразить стрелку, которая указывает на ту часть экрана, которая вызывает его.
Ответы
Ответ 1
Сначала возьмите .offset положение элемента и вычислите его относительное положение относительно окна
Обратитесь:
1. offset
2. scroll
3. scrollTop
Вы можете попробовать попробовать fiddle
После нескольких строк кода объясняется, как это можно решить.
когда выполняется .scroll, мы вычисляем относительное положение элемента относительно объекта window
$(window).scroll(function () {
console.log(eTop - $(window).scrollTop());
});
когда прокрутка выполняется в браузере, мы вызываем вышеупомянутую функцию обработчика событий
фрагмент кода
function log(txt) {
$("#log").html("location : <b>" + txt + "</b> px")
}
$(function() {
var eTop = $('#element').offset().top; //get the offset top of the element
log(eTop - $(window).scrollTop()); //position of the ele w.r.t window
$(window).scroll(function() { //when window is scrolled
log(eTop - $(window).scrollTop());
});
});
#element {
margin: 140px;
text-align: center;
padding: 5px;
width: 200px;
height: 200px;
border: 1px solid #0099f9;
border-radius: 3px;
background: #444;
color: #0099d9;
opacity: 0.6;
}
#log {
position: fixed;
top: 40px;
left: 40px;
color: #333;
}
#scroll {
position: fixed;
bottom: 10px;
right: 10px;
border: 1px solid #000;
border-radius: 2px;
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="log"></div>
<div id="element">Hello
<hr>World</div>
<div id="scroll">Scroll Down</div>
Ответ 2
Попробуйте ограничительную рамку. Это просто:
var leftPos = $("#element")[0].getBoundingClientRect().left + $(window)['scrollLeft']();
var rightPos = $("#element")[0].getBoundingClientRect().right + $(window)['scrollLeft']();
var topPos = $("#element")[0].getBoundingClientRect().top + $(window)['scrollTop']();
var bottomPos= $("#element")[0].getBoundingClientRect().bottom + $(window)['scrollTop']();
Ответ 3
function getWindowRelativeOffset(parentWindow, elem) {
var offset = {
left : 0,
top : 0
};
// relative to the target field document
offset.left = elem.getBoundingClientRect().left;
offset.top = elem.getBoundingClientRect().top;
// now we will calculate according to the current document, this current
// document might be same as the document of target field or it may be
// parent of the document of the target field
var childWindow = elem.document.frames.window;
while (childWindow != parentWindow) {
offset.left = offset.left + childWindow.frameElement.getBoundingClientRect().left;
offset.top = offset.top + childWindow.frameElement.getBoundingClientRect().top;
childWindow = childWindow.parent;
}
return offset;
};
вы можете называть это следующим образом
getWindowRelativeOffset(top, inputElement);
Я фокусируюсь на IE только по моему требованию, но подобное можно сделать для других браузеров
Ответ 4
Это похоже на то, что вы хотите использовать всплывающую подсказку для выбранной ссылки. Есть много подсказок jQuery, попробуйте jQuery qTip. У него много вариантов и легко изменить стили.
В противном случае, если вы хотите сделать это самостоятельно, вы можете использовать jQuery .position()
. Более подробная информация о .position()
находится на http://api.jquery.com/position/
$("#element").position();
вернет текущую позицию элемента относительно родителя смещения.
Существует также jQuery . offset();, который будет возвращать позицию относительно документа.
Ответ 5
TL; DR
headroom_by_jQuery = $('#id').offset().top - $(window).scrollTop();
headroom_by_DOM = $('#id')[0].getBoundingClientRect().top; // if no iframe
. getBoundingClientRect() выглядит как universal. . offset() и . scrollTop() имеют поддерживается с jQuery 1.2. Спасибо @user372551 и @prograhammer. Чтобы использовать DOM в iframe, см. решение @ImranAnsari.
Ответ 6
function trbl(e, relative) {
var r = $(e).get(0).getBoundingClientRect(); relative = $(relative);
return {
t : r.top + relative['scrollTop'] (),
r : r.right + relative['scrollLeft'](),
b : r.bottom + relative['scrollTop'] (),
l : r.left + relative['scrollLeft']()
}
}
// Example
trbl(e, window);