답변:
offsetParentDOM의 최상위 수준까지 이동할 수 있습니다 .
function getOffsetLeft( elem )
{
var offsetLeft = 0;
do {
if ( !isNaN( elem.offsetLeft ) )
{
offsetLeft += elem.offsetLeft;
}
} while( elem = elem.offsetParent );
return offsetLeft;
}
다음 과 같이 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) };
}
<html>요소의 테두리 값에 해당 합니다.
를 사용 element.getBoundingClientRect()하여 뷰포트를 기준으로 요소 위치를 검색 할 수 있습니다 .
그런 다음을 사용 document.documentElement.scrollTop하여 뷰포트 오프셋을 계산합니다.
이 둘의 합은 문서에 상대적인 요소 위치를 제공합니다.
element.getBoundingClientRect().top + document.documentElement.scrollTop
document.documentElement.scrollTop는 Safari에서 작동하지 않습니다. window.scrollY대신 사용
나는 사용하는 것이 좋습니다
element.getBoundingClientRect()
offsetLeft를 통한 수동 오프셋 계산 대신 여기에 제안 된대로 , offsetTop 및 offsetParent를 . 여기에 제안 된대로 일부 상황 *에서 수동 순회는 잘못된 결과를 생성합니다. 이 Plunker 참조 : http://plnkr.co/pC8Kgj
* 요소가 정적 (= 기본값) 위치를 갖는 스크롤 가능한 부모 내부에있을 때.
offsetLeft및 offsetTop계정 CSS3의 변환은 고려하지 getBoundingClientRect()않습니다. 따라서 결과가 유효하지 않을 수 있습니다. 필요한 경우을 offsetLeft사용하여 부모 (예 :)에 상대적인 요소의 오프셋을 가져올 수 있습니다 (element.getBoundingClientRect().left - parent.getBoundingClientRect().left).
document-offset( 타사 스크립트 ) 흥미롭고 여기 다른 답변의 접근 방식을 활용하는 것 같습니다.
var offset = require('document-offset')
var target = document.getElementById('target')
console.log(offset(target))
// => {top: 69, left: 108}
문서를 기준으로 한 요소의 다양한 위치에 대한 x 및 y 좌표를 얻으려는 사람들을 위해.
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;
};
getCoords(document.querySelector('selector'), 'center')
getCoords(document.querySelector('selector'), 'bottom right')
getCoords(document.querySelector('selector'), 'top center')
http://www.quirksmode.org/js/findpos.html 이 작업을 수행하는 가장 좋은 방법을 설명합니다 . 대체로 오프셋을 찾고 부모 트리를 탐색해야하는 올바른 길을 가고 있습니다.