Я хочу получить позицию элемента относительно области просмотра браузера (область просмотра, в которой отображается страница, а не вся страница). Как это можно сделать в JavaScript?
Большое спасибо
Я хочу получить позицию элемента относительно области просмотра браузера (область просмотра, в которой отображается страница, а не вся страница). Как это можно сделать в JavaScript?
Большое спасибо
Ответы:
Существующие ответы сейчас устарели. Нативный getBoundingClientRect()метод существует уже довольно давно и делает именно то, о чем просит вопрос. Плюс это поддерживается во всех браузерах (включая IE 5, кажется!)
Со страницы MDN :
Возвращаемым значением является объект TextRectangle, который содержит свойства left, top, right и bottom, доступные только для чтения, описывающие рамку в пикселях, причем верхний левый угол относительно верхнего левого угла области просмотра .
Вы используете это так:
var viewportOffset = el.getBoundingClientRect();
// these are relative to the viewport, i.e. the window
var top = viewportOffset.top;
var left = viewportOffset.left;
getBoundingClientRect().topне в моем IE11, он возвращает 0. У вас есть какое-либо решение.
В моем случае, просто чтобы быть уверенным в прокрутке, я добавил window.scroll к уравнению:
var element = document.getElementById('myElement');
var topPos = element.getBoundingClientRect().top + window.scrollY;
var leftPos = element.getBoundingClientRect().left + window.scrollX;
Это позволяет мне получить реальную относительную позицию элемента в документе, даже если он был прокручен.
getBoundingClientRect().topотсутствует в моем IE11, он возвращает 0. У вас есть какое-либо решение?
window.scrollY || window.pageYOffsetможет улучшить поддержку
Редактировать: добавить код для учета прокрутки страницы.
function findPos(id) {
var node = document.getElementById(id);
var curtop = 0;
var curtopscroll = 0;
if (node.offsetParent) {
do {
curtop += node.offsetTop;
curtopscroll += node.offsetParent ? node.offsetParent.scrollTop : 0;
} while (node = node.offsetParent);
alert(curtop - curtopscroll);
}
}
Аргумент id - это идентификатор элемента, смещение которого вы хотите. Адаптировано из поста причудливого режима .
var element = document.querySelector('selector');
var bodyRect = document.body.getBoundingClientRect(),
elemRect = element.getBoundingClientRect(),
offset = elemRect.top - bodyRect.top;
Можешь попробовать:
node.offsetTop - window.scrollY
Он работает в Opera с определенным метатегом viewport.
offsetTopотносится к ближайшему расположенному элементу. Который, в зависимости от структуры страницы, может быть или не быть корневым элементом.
JQuery реализует это довольно элегантно. Если вы посмотрите на источник для jQuery offset, вы обнаружите, что в основном это так:
var rect = elem.getBoundingClientRect();
var win = elem.ownerDocument.defaultView;
return {
top: rect.top + win.pageYOffset,
left: rect.left + win.pageXOffset
};
Функция на этой странице возвращает прямоугольник с координатами top, left, height и width переданного элемента относительно порта просмотра браузера.
localToGlobal: function( _el ) {
var target = _el,
target_width = target.offsetWidth,
target_height = target.offsetHeight,
target_left = target.offsetLeft,
target_top = target.offsetTop,
gleft = 0,
gtop = 0,
rect = {};
var moonwalk = function( _parent ) {
if (!!_parent) {
gleft += _parent.offsetLeft;
gtop += _parent.offsetTop;
moonwalk( _parent.offsetParent );
} else {
return rect = {
top: target.offsetTop + gtop,
left: target.offsetLeft + gleft,
bottom: (target.offsetTop + gtop) + target_height,
right: (target.offsetLeft + gleft) + target_width
};
}
};
moonwalk( target.offsetParent );
return rect;
}
function inViewport(element) {
let bounds = element.getBoundingClientRect();
let viewWidth = document.documentElement.clientWidth;
let viewHeight = document.documentElement.clientHeight;
if (bounds['left'] < 0) return false;
if (bounds['top'] < 0) return false;
if (bounds['right'] > viewWidth) return false;
if (bounds['bottom'] > viewHeight) return false;
return true;
}
Спасибо за ответы на все вопросы. Кажется, в Prototype уже есть функция, которая делает это (функция page ()). Просматривая исходный код функции, я обнаружил, что она сначала вычисляет позицию смещения элемента относительно страницы (то есть верх документа), а затем вычитает из этого scrollTop. Смотрите исходный код прототипа для более подробной информации.
Я предполагаю, что элемент с идентификатором btn1существует на веб-странице, а также что jQuery включен. Это работало во всех современных браузерах Chrome, FireFox, IE> = 9 и Edge. jQuery используется только для определения позиции относительно документа.
var screenRelativeTop = $("#btn1").offset().top - (window.scrollY ||
window.pageYOffset || document.body.scrollTop);
var screenRelativeLeft = $("#btn1").offset().left - (window.scrollX ||
window.pageXOffset || document.body.scrollLeft);
Иногда getBoundingClientRect()значение свойства объекта показывает 0 для IE. В этом случае вы должны установитьdisplay = 'block' для элемента. Вы можете использовать код ниже для всех браузеров, чтобы получить смещение.
Расширить функциональность jQuery:
(function($) {
jQuery.fn.weOffset = function () {
var de = document.documentElement;
$(this).css("display", "block");
var box = $(this).get(0).getBoundingClientRect();
var top = box.top + window.pageYOffset - de.clientTop;
var left = box.left + window.pageXOffset - de.clientLeft;
return { top: top, left: left };
};
}(jQuery));
Используйте:
var elementOffset = $("#" + elementId).weOffset();