Какой самый простой способ определить позицию элементов относительно окна document/body/browser? Прямо сейчас я использую'.offsetLeft/offsetTop ', но этот метод дает только положение относительно родительского элемента, поэтому вам нужно определить, сколько родителей принадлежит элементу body, чтобы знать, что релятивистская позиция к телу/браузеру положение окна/документа. Этот метод также громоздкий.
Определение позиции элемента относительно документа
Ответ 1
Вы можете пройти offsetParent
до верхнего уровня DOM.
function getOffsetLeft( elem )
{
var offsetLeft = 0;
do {
if ( !isNaN( elem.offsetLeft ) )
{
offsetLeft += elem.offsetLeft;
}
} while( elem = elem.offsetParent );
return offsetLeft;
}
Ответ 2
Вы можете получить сверху и слева без прохождения DOM следующим образом:
function getCoords(elem) { // crossbrowser version
var box = elem.getBoundingClientRect();
var body = document.body;
var docEl = document.documentElement;
var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
var clientTop = docEl.clientTop || body.clientTop || 0;
var clientLeft = docEl.clientLeft || body.clientLeft || 0;
var top = box.top + scrollTop - clientTop;
var left = box.left + scrollLeft - clientLeft;
return { top: Math.round(top), left: Math.round(left) };
}
Ответ 3
Вы можете использовать element.getBoundingClientRect()
для извлечения позиции элемента относительно окна просмотра.
Используйте scrollY
(document.documentElement.scrollTop
кросс-браузер совместимый), чтобы вычислить смещение видового экрана.
Сумма этих двух значений будет содержать позицию элемента относительно документа:
subjectRect.top + document.documentElement.scrollTop
Ответ 4
Если вы используете npm, document-offset интересен и, похоже, использует подходы из других ответов здесь. Использование довольно просто:
var offset = require('document-offset')
var target = document.getElementById('target')
console.log(offset(target))
// => {top: 69, left: 108}
Ответ 5
http://www.quirksmode.org/js/findpos.html Объясняет лучший способ сделать это, в целом, вы на правильном пути, вам нужно найти смещения и пересечь дерево родителей.
Ответ 6
Я предлагаю использовать
element.getBoundingClientRect()
как предложено здесь вместо вычисления ручного смещения через offsetLeft, offsetTop и offsetParent. как предложено здесь При некоторых обстоятельствах * ручной обход дает неверные результаты. См. Этот Plunker: http://plnkr.co/pC8Kgj
* Когда элемент находится внутри прокручиваемого родителя со статическим (= по умолчанию) позиционированием.
Ответ 7
Если вы не против использования jQuery, вы можете использовать функцию offset()
. Обратитесь к документации, если вы хотите больше узнать об этой функции.
Ответ 8
Протестировано в IE 11, Chrome 62, Firefox 56, Edge 38:
var box = domElement.getBoundingClientRect();
var offsetTop = Math.floor(box.top && box.top || box.y && box.y || 0);
Используйте left/x для offsetLeft.