Znajdowanie pozycji elementu względem dokumentu

Jak najłatwiej określić pozycję elementów względem dokumentu/treści / okna przeglądarki?

W tej chwili używam .offsetLeft/offsetTop, ale ta metoda podaje tylko pozycję względem elementu nadrzędnego, więc musisz określić, ilu rodziców do elementu body, aby poznać pozycję relatywną do pozycji ciała/okna przeglądarki/dokumentu.

Ta metoda jest również uciążliwa.
Author: Kos, 2011-04-08

9 answers

Możesz przejść offsetParent do najwyższego poziomu DOM.

function getOffsetLeft( elem )
{
    var offsetLeft = 0;
    do {
      if ( !isNaN( elem.offsetLeft ) )
      {
          offsetLeft += elem.offsetLeft;
      }
    } while( elem = elem.offsetParent );
    return offsetLeft;
}
 58
Author: KeatsKelleher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-24 22:40:05

Możesz uzyskać top i left bez przechodzenia przez DOM tak:

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) };
}
 189
Author: basil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-23 11:38:59

Możesz użyć element.getBoundingClientRect() Aby pobrać pozycję elementu względem punktu widokowego.

Następnie użyj document.documentElement.scrollTop aby obliczyć przesunięcie viewport.

Suma tych dwóch elementów da pozycję elementu względem dokumentu:

element.getBoundingClientRect().top + document.documentElement.scrollTop
 118
Author: dy_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-21 12:15:17

Proponuję użyć

element.getBoundingClientRect()

Zgodnie z propozycją tutaj zamiast ręcznego obliczania offsetu za pomocą offsetLeft, offsetTop i offsetParent . zgodnie z propozycją tutaj W pewnych okolicznościach* ręczne Przejście daje nieprawidłowe wyniki. Zobacz ten Plunker: http://plnkr.co/pC8Kgj

*gdy element znajduje się wewnątrz przewijalnego rodzica ze statycznym (=domyślnym) pozycjonowaniem.

 7
Author: HANiS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:13

document-offset (3rd-party script ) jest interesujący i wydaje się wykorzystywać podejścia z innych odpowiedzi tutaj.

Przykład:

var offset = require('document-offset')
var target = document.getElementById('target')
console.log(offset(target))
// => {top: 69, left: 108} 
 7
Author: Mathieu M-Gosselin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-01 11:31:54

Znalazłem następującą metodę, która jest najbardziej niezawodna w przypadku przypadków skrajnych, które potkną się w offsetTop/offsetLeft.

function getPosition(element) {
    var clientRect = element.getBoundingClientRect();
    return {left: clientRect.left + document.body.scrollLeft,
            top: clientRect.top + document.body.scrollTop};
}
 5
Author: Robin Stewart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-10 21:27:44

Dla tych, którzy chcą uzyskać współrzędne X i y różnych pozycji elementu względem dokumentu.

const getCoords = (element, position) => {
  const { top, left, width, height } = element.getBoundingClientRect();
  let point;
  switch (position) {
    case "top left":
      point = {
        x: left + window.pageXOffset,
        y: top + window.pageYOffset
      };
      break;
    case "top center":
      point = {
        x: left + width / 2 + window.pageXOffset,
        y: top + window.pageYOffset
      };
      break;
    case "top right":
      point = {
        x: left + width + window.pageXOffset,
        y: top + window.pageYOffset
      };
      break;
    case "center left":
      point = {
        x: left + window.pageXOffset,
        y: top + height / 2 + window.pageYOffset
      };
      break;
    case "center":
      point = {
        x: left + width / 2 + window.pageXOffset,
        y: top + height / 2 + window.pageYOffset
      };
      break;
    case "center right":
      point = {
        x: left + width + window.pageXOffset,
        y: top + height / 2 + window.pageYOffset
      };
      break;
    case "bottom left":
      point = {
        x: left + window.pageXOffset,
        y: top + height + window.pageYOffset
      };
      break;
    case "bottom center":
      point = {
        x: left + width / 2 + window.pageXOffset,
        y: top + height + window.pageYOffset
      };
      break;
    case "bottom right":
      point = {
        x: left + width + window.pageXOffset,
        y: top + height + window.pageYOffset
      };
      break;
  }
  return point;
};

Użycie

  • getCoords(document.querySelector('selector'), 'center')

  • getCoords(document.querySelector('selector'), 'bottom right')

  • getCoords(document.querySelector('selector'), 'top center')

 4
Author: Raphael Rafatpanah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-12 19:42:38

Jeśli nie masz nic przeciwko użyciu jQuery, możesz użyć funkcji offset(). Zapoznaj się z dokumentacją Jeśli chcesz dowiedzieć się więcej o tej funkcji.

 2
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-12 09:35:40

Http://www.quirksmode.org/js/findpos.html wyjaśnia najlepszy sposób, aby to zrobić, w sumie, jesteś na dobrej drodze, musisz znaleźć przesunięcia i trawersować drzewo rodziców.

 1
Author: Jake Kalstad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-08 17:38:47