ブラウザーのビューポート(ページ全体ではなく、ページが表示されるビューポート)に対する要素の位置を取得したい。これはどのようにJavaScriptで実行できますか?
どうもありがとう
ブラウザーのビューポート(ページ全体ではなく、ページが表示されるビューポート)に対する要素の位置を取得したい。これはどのようにJavaScriptで実行できますか?
どうもありがとう
回答:
現在の回答は古くなっています。ネイティブgetBoundingClientRect()メソッドはかなり以前から存在しており、質問が要求することを正確に実行します。さらに、すべてのブラウザーでサポートされています(IE 5を含むようです!)
MDNページから:
戻り値はTextRectangleオブジェクトです。これには、境界線ボックスをピクセル単位で表す読み取り専用のleft、top、right、bottomプロパティが含まれ、左上がビューポートの左上を基準とします。。
次のように使用します。
var viewportOffset = el.getBoundingClientRect();
// these are relative to the viewport, i.e. the window
var top = viewportOffset.top;
var left = viewportOffset.left;
getBoundingClientRect().topは私のIE11にはありません。0を返します。解決策はありますか。
私の場合、スクロールに関して安全を期すために、数式にwindow.scrollを追加しました。
var element = document.getElementById('myElement');
var topPos = element.getBoundingClientRect().top + window.scrollY;
var leftPos = element.getBoundingClientRect().left + window.scrollX;
これにより、スクロールされている場合でも、ドキュメント上の要素の実際の相対位置を取得できます。
getBoundingClientRect().topは私のIE11にはありません。0を返します。解決策はありますか。
window.scrollY || window.pageYOffsetはサポートを改善する可能性があります
編集: ページのスクロールに対応するコードを追加します。
function findPos(id) {
var node = document.getElementById(id);
var curtop = 0;
var curtopscroll = 0;
if (node.offsetParent) {
do {
curtop += node.offsetTop;
curtopscroll += node.offsetParent ? node.offsetParent.scrollTop : 0;
} while (node = node.offsetParent);
alert(curtop - curtopscroll);
}
}
id引数は、オフセットが必要な要素のIDです。quirksmodeの投稿から転載。
var element = document.querySelector('selector');
var bodyRect = document.body.getBoundingClientRect(),
elemRect = element.getBoundingClientRect(),
offset = elemRect.top - bodyRect.top;
jQueryはこれを非常にエレガントに実装します。jQueryののソースを見ると、offsetこれが基本的に実装方法であることがわかります。
var rect = elem.getBoundingClientRect();
var win = elem.ownerDocument.defaultView;
return {
top: rect.top + win.pageYOffset,
left: rect.left + win.pageXOffset
};
このページの関数は、ブラウザービューポートを基準にして、渡された要素の上、左、高さ、幅の座標を持つ長方形を返します。
localToGlobal: function( _el ) {
var target = _el,
target_width = target.offsetWidth,
target_height = target.offsetHeight,
target_left = target.offsetLeft,
target_top = target.offsetTop,
gleft = 0,
gtop = 0,
rect = {};
var moonwalk = function( _parent ) {
if (!!_parent) {
gleft += _parent.offsetLeft;
gtop += _parent.offsetTop;
moonwalk( _parent.offsetParent );
} else {
return rect = {
top: target.offsetTop + gtop,
left: target.offsetLeft + gleft,
bottom: (target.offsetTop + gtop) + target_height,
right: (target.offsetLeft + gleft) + target_width
};
}
};
moonwalk( target.offsetParent );
return rect;
}
function inViewport(element) {
let bounds = element.getBoundingClientRect();
let viewWidth = document.documentElement.clientWidth;
let viewHeight = document.documentElement.clientHeight;
if (bounds['left'] < 0) return false;
if (bounds['top'] < 0) return false;
if (bounds['right'] > viewWidth) return false;
if (bounds['bottom'] > viewHeight) return false;
return true;
}
すべての回答をありがとう。Prototypeにはこれを行う関数(page()関数)がすでにあるようです。関数のソースコードを表示すると、最初にページ(つまり、ドキュメントの上部)に対する要素のオフセット位置が計算され、次にそこからscrollTopが減算されることがわかりました。詳細については、プロトタイプのソースコードを参照してください。
idの要素がbtn1Webページに存在し、jQueryが含まれていると想定しています。これは、Chrome、FireFox、IE> = 9、およびEdgeのすべての最新ブラウザーで機能しました。jQueryは、ドキュメントに対する相対的な位置を決定するためにのみ使用されています。
var screenRelativeTop = $("#btn1").offset().top - (window.scrollY ||
window.pageYOffset || document.body.scrollTop);
var screenRelativeLeft = $("#btn1").offset().left - (window.scrollX ||
window.pageXOffset || document.body.scrollLeft);
getBoundingClientRect()オブジェクトのプロパティ値がIEで0を示す場合があります。その場合display = 'block'、要素を設定する必要があります。すべてのブラウザでオフセットを取得するには、以下のコードを使用できます。
jQuery機能を拡張します。
(function($) {
jQuery.fn.weOffset = function () {
var de = document.documentElement;
$(this).css("display", "block");
var box = $(this).get(0).getBoundingClientRect();
var top = box.top + window.pageYOffset - de.clientTop;
var left = box.left + window.pageXOffset - de.clientLeft;
return { top: top, left: left };
};
}(jQuery));
使用する :
var elementOffset = $("#" + elementId).weOffset();