jQueryは、ウィンドウに対する要素の位置を取得します


168

HTML DOM IDが与えられた場合、JavaScript / JQueryでウィンドウに対する要素の位置を取得する方法は?要素はiframeまたは他のいくつかの要素の内部にある可能性があるため、これはドキュメントやオフセットの親に対する相対とは異なります。現在表示されている要素の四角形(位置と寸法など)の画面位置を取得する必要があります。要素が現在画面外にある(スクロールされていない)場合は、負の値でも許容されます。

これはiPad(WebKit / WebView)アプリケーション用です。ユーザーがの特別なリンクをタップするたびに、リンクUIWebViewに関する詳細情報を表示するポップオーバービューを開くことになっています。ポップオーバービューは、それを呼び出す画面の一部を指す矢印を表示する必要があります。

回答:


264

最初に、要素の.offset位置を取得し、ウィンドウに対するその相対位置を計算します

参照
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では更新されません。ユーザーはウィンドウ内をスクロールしています。とにかく、基本的なWebサイトの場合です。モバイルデバイスを対象とするWebサイトについては不明ですが、おそらくより多くのオプションがあります。
eselk 2013年

要素が別のスクロール可能な要素内にある場合、これは失敗するはずです。g。<div>。ドキュメントのスクロールのみを考慮し、他の要素のスクロールは考慮しません。
ygoe 2017

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()はこの問題への答えです。prograhammerありがとう。
Vlad Lego

1
これはうまくいきました。scrollLetfとscrollTopに加えて、スクロールを修正するためのコードをいくつか含める必要がありました。topPos = topPos-$(window).scrollTop(); leftPos = leftPos-$(window).scrollLeft(); rightPos = rightPos-$(window).scrollTop(); bottomPos = bottomPos-$(window).scrollLeft();
Cesar

1
人々が便利な方法で物事をまとめることを学ぶ
mmm

@Noldorin IE / Edgeのサポートは私には良さそうです:caniuse.com/#feat=getboundingclientrect
prograhammer

1
@prograhammer私の悪い、あなたは正しいです。私はこれをいくつかのウェブサイトで読んでその言葉を額面通りに受けました...それは間違っていたことがわかりました(または少なくとも古いIEでは動作しません)。
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ツールチップはたくさんあります。jQueryqTipを試してください。それは多くのオプションがあり、スタイルを変更するのは簡単です。

それ以外の場合は、これを自分で行いたい場合はjQueryを使用できます.position()。詳細について.position()は、http://api.jquery.com/position/をご覧ください。

$("#element").position(); オフセットの親を基準にした要素の現在の位置を返します。

jQuery .offset();もあります。ドキュメントに対する相対位置を返します。


2
実際にはツールチップではありませんが、ネイティブUIウィジェットを開いて注釈を追加します。
adib

3

TL; DR

headroom_by_jQuery = $('#id').offset().top - $(window).scrollTop();

headroom_by_DOM = $('#id')[0].getBoundingClientRect().top;   // if no iframe

.getBoundingClientRect()ユニバーサルであるようです。 .offset()および.scrollTop()は、jQuery 1.2以降サポートされています。@ user372551と@prograhammerに感謝します。iframeでDOMを使用するには、@ ImranAnsariのソリューションを参照してください。


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.