jQuery는 창을 기준으로 요소의 위치를 ​​가져옵니다.


168

HTML DOM ID가 주어지면 JavaScript / JQuery에서 창을 기준으로 요소의 위치를 ​​얻는 방법은 무엇입니까? 요소가 iframe 또는 다른 요소 내에있을 수 있기 때문에 이것은 문서 또는 오프셋 부모와 관련하여 동일하지 않습니다. 현재 표시되는 요소 사각형의 화면 위치 (위치 및 치수)를 가져와야합니다. 요소가 현재 화면 밖 (스크롤 오프) 인 경우 음수 값을 사용할 수 있습니다.

iPad (WebKit / WebView) 응용 프로그램 용입니다. 사용자가의 특수 링크를 탭할 때마다 링크에 대한 UIWebView추가 정보를 표시하는 팝 오버보기를 열어야합니다. 팝 오버보기는이를 호출하는 화면 부분을 가리키는 화살표를 표시해야합니다.

답변:


264

처음에는 요소 의 오프셋 위치를 잡고 창을 기준으로 상대 위치를 계산하십시오.

참조 :
1. 오프셋
2. 스크롤
3. scrollTop

바이올린 에서 시도해 볼 수 있습니다

몇 줄의 코드를 따르면 어떻게 해결할 수 있는지 설명합니다.

경우 .scroll 이벤트가 수행되고, 우리는 윈도우 오브젝트에 대한 요소의 상대적 위치를 계산

$(window).scroll(function () {
    console.log(eTop - $(window).scrollTop());
});

브라우저에서 스크롤이 수행되면 위의 이벤트 핸들러 함수를 호출합니다.

코드 스 니펫


function log(txt) {
  $("#log").html("location : <b>" + txt + "</b> px")
}

$(function() {
  var eTop = $('#element').offset().top; //get the offset top of the element
  log(eTop - $(window).scrollTop()); //position of the ele w.r.t window

  $(window).scroll(function() { //when window is scrolled
    log(eTop - $(window).scrollTop());
  });
});
#element {
  margin: 140px;
  text-align: center;
  padding: 5px;
  width: 200px;
  height: 200px;
  border: 1px solid #0099f9;
  border-radius: 3px;
  background: #444;
  color: #0099d9;
  opacity: 0.6;
}
#log {
  position: fixed;
  top: 40px;
  left: 40px;
  color: #333;
}
#scroll {
  position: fixed;
  bottom: 10px;
  right: 10px;
  border: 1px solid #000;
  border-radius: 2px;
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="log"></div>

<div id="element">Hello
  <hr>World</div>
<div id="scroll">Scroll Down</div>


1
스크립트 주셔서 감사합니다. 이것은 데스크탑에서는 작동하지만 iPad에서는 작동하지 않습니다. $ (window) .scrollTop () 및 $ (window) .scrollLeft ()가 iPad에서 업데이트되지 않는 것 같습니다. jsbin.com/ogiwu4/5
adib

2
윈도우 자체가 스크롤되지 않기 때문에 iPad에서 업데이트되지 않습니다. 사용자가 윈도우 내부를 스크롤하고 있습니다. 어쨌든 기본 웹 사이트의 경우입니다. 모바일 장치를 대상으로하는 웹 사이트에 대해서는 확실하지 않으며 더 많은 옵션이있을 수 있습니다.
eselk

요소가 다른 스크롤 가능한 요소 내에 있으면 실패합니다. e. 지. <div>. 문서 스크롤 만 고려하고 다른 요소 스크롤은 고려하지 않습니다.
ygoe

71

경계 상자를 사용해보십시오. 간단 해:

var leftPos  = $("#element")[0].getBoundingClientRect().left   + $(window)['scrollLeft']();
var rightPos = $("#element")[0].getBoundingClientRect().right  + $(window)['scrollLeft']();
var topPos   = $("#element")[0].getBoundingClientRect().top    + $(window)['scrollTop']();
var bottomPos= $("#element")[0].getBoundingClientRect().bottom + $(window)['scrollTop']();

7
getBoundingClientRect ()가이 문제에 대한 답입니다. 감사합니다.
Vlad Lego

1
이것은 잘 작동했습니다. scrollLetf 및 scrollTop 외에도 스크롤을 수정하는 코드를 포함해야했습니다. topPos = topPos-$ (window) .scrollTop (); leftPos = leftPos-$ (window) .scrollLeft (); rightPos = rightPos-$ (창) .scrollTop (); bottomPos = bottomPos-$ (창) .scrollLeft ();
Cesar

1
사람들이 유용한 유용한 방법으로 마무리하는 법을 배우는 날
mmm

@Noldorin IE / Edge에 대한 지원은 나에게 잘
어울린다

1
@prograhammer 나의 나쁜, 당신 말이 맞아. 나는 이것을 일부 웹 사이트에서 읽었고 액면가에서 그 단어를 취했다 ... 그것이 잘못되었다는 것이 밝혀졌다.
Noldorin

6
function getWindowRelativeOffset(parentWindow, elem) {
        var offset = {
            left : 0,
            top : 0
        };
        // relative to the target field's document
        offset.left = elem.getBoundingClientRect().left;
        offset.top = elem.getBoundingClientRect().top;
        // now we will calculate according to the current document, this current
        // document might be same as the document of target field or it may be
        // parent of the document of the target field
        var childWindow = elem.document.frames.window;
        while (childWindow != parentWindow) {
            offset.left = offset.left + childWindow.frameElement.getBoundingClientRect().left;
            offset.top = offset.top + childWindow.frameElement.getBoundingClientRect().top;
            childWindow = childWindow.parent;
        }
        return offset;
    };

당신은 이것을 이렇게 부를 수 있습니다

getWindowRelativeOffset(top, inputElement);

내 요구 사항에 따라 IE에만 ​​집중하지만 다른 브라우저에서도 비슷하게 수행 할 수 있습니다.


4

링크에 대한 툴팁을 원하는 것처럼 들립니다. 많은 jQuery 툴팁이 있습니다 . jQuery qTip을 사용해보십시오 . 많은 옵션이 있으며 스타일을 쉽게 변경할 수 있습니다.

그렇지 않으면 직접 수행하려는 경우 jQuery를 사용할 수 있습니다 .position(). 자세한 정보 .position()http://api.jquery.com/position/에 있습니다.

$("#element").position(); 오프셋 부모를 기준으로 요소의 현재 위치를 반환합니다.

jQuery도 있습니다. .offset (); 문서와 관련된 위치를 반환합니다.


2
실제로 툴팁은 아니지만 주석을 추가하기 위해 기본 UI 위젯을 엽니 다.
adib


1
    function trbl(e, relative) {
            var r = $(e).get(0).getBoundingClientRect(); relative = $(relative);

            return {
                    t : r.top    + relative['scrollTop'] (),
                    r : r.right  + relative['scrollLeft'](),
                    b : r.bottom + relative['scrollTop'] (),
                    l : r.left   + relative['scrollLeft']() 

            }
    }

    // Example
    trbl(e, window);

1

창을 기준으로 요소의 위치를 ​​얻으려면 이것을 시도하십시오.

        $("button").click(function(){
            var offset = $("#simplebox").offset();
            alert("Current position of the box is: (left: " + offset.left + ", top: " + offset.top + ")");
        });
    #simplebox{
        width:150px;
        height:100px;
        background: #FBBC09;
        margin: 150px 100px;
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button type="button">Get Box Position</button>
    <p><strong>Note:</strong> Play with the value of margin property to see how the jQuery offest() method works.</p>
    <div id="simplebox"></div>

더보기 @ jQuery를 사용하여 문서와 관련된 요소의 위치 가져 오기

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