Какой самый простой способ определить позицию элементов относительно окна 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.