div / span 태그의 위치 가져 오기


103

누군가 지정되지 않은 경우 또는 요소 의 top& left위치 를 얻는 방법을 보여줄 수 있습니까 ?divspan

즉 :

<span id='11a' style='top:55px;' onmouseover="GetPos(this);">stuff</span>
<span id='12a' onmouseover="GetPos(this);">stuff</span>

위의 경우 다음을 수행합니다.

document.getElementById('11a').style.top

의 값 55px이 반환됩니다. 그러나 span'12a'에 대해 시도하면 아무것도 반환되지 않습니다.

페이지에 / 속성을 지정할 수없는 div/ spans 가 여러 개 있지만 해당 요소 바로 아래에 를 표시해야합니다 .topleftdiv

답변:


100

이 함수는 페이지를 기준으로 요소의 x, y 위치를 알려줍니다. 기본적으로 모든 요소의 부모를 반복하고 오프셋을 함께 추가해야합니다.

function getPos(el) {
    // yay readability
    for (var lx=0, ly=0;
         el != null;
         lx += el.offsetLeft, ly += el.offsetTop, el = el.offsetParent);
    return {x: lx,y: ly};
}

그러나 컨테이너에 상대적인 요소의 x, y 위치를 원하면 다음과 같이하면됩니다.

var x = el.offsetLeft, y = el.offsetTop;

이 요소 바로 아래에 요소를 배치하려면 높이도 알아야합니다. 이것은 offsetHeight / offsetWidth 속성에 저장됩니다.

var yPositionOfNewElement = el.offsetTop + el.offsetHeight + someMargin;

5
불행히도이 방법은 요소가 테두리가있는 테이블 내부에있을 때 Chrome에서 실패합니다. 또한 BODY 여백으로 인해 IE6 표준 모드에서 실패합니다.
GetFree

1
이 코드 사용자를위한 경고입니다. 이것은 창이 아니라 페이지를 기준으로합니다. 사용자가 스크롤바를 사용하여 스크롤하면 동일한 값을 반환합니다. 조심해.
Isaac Bolinger 2014

감사합니다 @IsaacBolinger가 방금 그것을 발견했습니다. 누군가 창 크기가 조정되거나 사용자가 스크롤 할 때 값을 변경하는 방법을 알려줄 수 있습니까?
David Fariña

@ DavidFariña dojo의 기하학 모듈 "dom-geometry"를 사용했습니다. 나는 그것을 기본적으로하는 방법을 모른다.
Isaac Bolinger

Downvoted-경험이 많은 사용자에게는 분명 할 수 있지만 el에 대해 정확히 전달해야하는 항목을 지정하지 않았습니다 (예 : 샘플 사용을 제공하십시오).
Matt

183

getBoundingClientRect()요소에 대한 참조 에서 메서드 를 호출 할 수 있습니다 . 그런 다음 검사 할 수 있습니다 top, left, right및 / 또는 bottom속성을 ...

var offsets = document.getElementById('11a').getBoundingClientRect();
var top = offsets.top;
var left = offsets.left;

jQuery를 사용하는 경우 더 간결한 코드를 사용할 수 있습니다.

var offsets = $('#11a').offset();
var top = offsets.top;
var left = offsets.left;

11
이 답변에 +1을 getBoundingClientRect()사용해야합니다. 이 답변 이 허용되어야합니다. 그러나 이것이 작동하기 위해 "최신 브라우저" 가 필요하지 않습니다 . 여기에 표시된 호환성 목록을 참조하십시오. stackoverflow.com/questions/1480133/… . IE 4.0+ (!), Chrome 1.0+, FF 3.0+, Safari 4.0+ 및 Opera에서 잘 작동합니다.
Sk8erPeter

25
getBoundingClientRect()문서가 아닌 뷰포트에 상대적인 값 을 반환합니다. 이를 위해 top = el.getBoundingClientRect().top + window.pageYOffset - el.ownerDocument.documentElement.clientTop.
Zack Bloom

1
또한주의 getBoundingClientRect한다 transform계정으로.
ExpExc

절대 위치가 아닌 첫 번째 자식이 margin-top 또는 margin-left를 갖는 경우 이것은 정확하지 않습니다. 현재이 페이지에는 정확한 해결책이 없으므로 아는 사람이 있으면 답변을 게시하십시오.
Curtis

16

@nickf의 대답이 작동하는 동안. 이전 브라우저를 신경 쓰지 않는다면이 순수한 자바 스크립트 버전을 사용할 수 있습니다. IE9 + 및 기타에서 작동

var rect = el.getBoundingClientRect();

var position = {
  top: rect.top + window.pageYOffset,
  left: rect.left + window.pageXOffset
};

12

Alex가 언급했듯이 jQuery offset ()을 사용하여 문서 흐름과 관련된 위치를 가져올 수 있습니다. 부모에 상대적인 x, y 좌표에 position ()을 사용하십시오.

편집 : 단순히 DOM을 준비하는 대신 크기를 얻을 수 있도록 모든 요소를 ​​기다리기 때문에 전환 document.ready되었습니다 . 내 경험상 Javascript 위치 요소가 더 적습니다.window.loadloadload

$(window).load(function(){ 
  // Log the position with jQuery
  var position = $('#myDivInQuestion').position();
  console.log('X: ' + position.left + ", Y: " + position.top );
});

9

맨 위 또는 왼쪽 위치 만 필요한 사람에게는 @Nickf의 읽기 가능한 코드를 약간 수정하면 트릭이됩니다.

function getTopPos(el) {
    for (var topPos = 0;
        el != null;
        topPos += el.offsetTop, el = el.offsetParent);
    return topPos;
}

function getLeftPos(el) {
    for (var leftPos = 0;
        el != null;
        leftPos += el.offsetLeft, el = el.offsetParent);
    return leftPos;
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.