JavaScript を使用してページ要素のオフセットを取得/計算する方法

JavaScript を使用してページ要素のオフセットを取得/計算する方法

質問

コントロールをクリックすると、コントロールの下にフローティング レイヤーが表示されます。通常の方法は、コントロールのオフセット値を取得し、フローティング レイヤーの top、left、その他の CSS プロパティの値を計算して割り当てます。

次に、コントロールのオフセット値を取得する方法を見てみましょう。

純粋なJS実装

最初に思い浮かぶのは、次のような js です。


コードをコピー
コードは次のとおりです。

document.getElementById("divFloat").style.top=document.getElementById("Button").offsetLeft+25;

値単位を追加する必要があることが判明した場合は、次のように変更します。

再度、IETesterとFireFoxでテストしたところ、IE6+では問題なく動作しました。前回同様、私が書いた純粋なjsメソッドはFireFoxに容赦なく無視され、取得された値は不正確でした。

オンラインで調べたところ、次のように記述する必要があることがわかりました。ループを実行し、レイヤーごとに計算して、最終的に正確なオフセット値を取得します。


コードをコピー
コードは次のとおりです。

関数 getOffsetLeft(o)
{
var 左 = 0;
var offsetParent = o;
(offsetParent != null && offsetParent != document.body) の場合
{
左 += offsetParent.offsetLeft;
offsetParent = offsetParent.offsetParent;
}</p> <p>左に戻ります。
}

jQueryの実装

関連する問題をより詳しく調べたところ、jQuery にはすでにこの関数を実装する関数 offset() が含まれており、さまざまなブラウザと非常に互換性があることがわかりました。


コードをコピー
コードは次のとおりです。

$("#ボタン").offset().左

ソースコードをダウンロードしたところ、jQueryは次のように実装されていることがわかりました。


コードをコピー
コードは次のとおりです。

jQuery.fn.extend({
位置: 関数() {
もし ( !this[0] ) {
null を返します。
}
var 要素 = this[0],
// *実際の* offsetParent を取得します
offsetParent = this.offsetParent(),
// 正しいオフセットを取得する
オフセット = this.offset(),
parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
// 要素の余白を減算する
// 注意: 要素に margin: auto がある場合、offsetLeft と marginLeft
// Safariでは同じなので、offset.leftが誤って0になる
offset.top -= parseFloat( jQuery.curCSS(elem, "marginTop", true) ) || 0;
offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0;
// offsetParent 境界を追加
parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth", true) ) || 0;
parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;
// 2つのオフセットを減算する
戻る {
上: offset.top - parentOffset.top、
左: offset.left - parentOffset.left
};
},
オフセット親: 関数() {
this.map(function() を返す {
var offsetParent = this.offsetParent || document.body;
offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") の間、
offsetParent = offsetParent.offsetParent;
}
offsetParent を返します。
});
}
});

計算方法は似ていますが、注意すべき点が 1 つあります。

offset() 関数は計算にマージン値を含めません (ただし、境界値は含めます)。

<<:  HTMLプログラミングタグとドキュメント構造の詳細な説明

>>:  Docker swarm の簡単なチュートリアル

推薦する

Docker で Tomcat、MySQL、Redis をインストールするための詳細な手順

目次DockerでTomcatをインストールするtomcatイメージを使用してコンテナを作成する(イ...

VUE ユニアプリライフサイクルに関する簡単な説明

目次1. アプリケーションライフサイクル2. ページのライフサイクルコンポーネントライフサイクル要約...

MySQL 5.7.24 圧縮パッケージのインストールと設定方法のグラフィックチュートリアル

この記事では、参考までにMySQL 5.7.24圧縮パッケージのインストールチュートリアルを紹介しま...

JavaScript コードを省略する一般的な方法の概要

目次序文矢印関数一般的な配列操作をマスターするスプレッド演算子オブジェクトの省略形構造化割り当てデー...

Echarts 基本入門: 棒グラフと折れ線グラフの一般的な構成

1eChartsの基本手順4つのステップ1 DOMコンテナを見つける2 初期化3 設定オプション4 ...

Node.js組み込みモジュールの詳細な説明

目次概要1. パスモジュール2. モジュールまで3. fsモジュール4. イベントモジュール5. h...

Tomcatの各ポートの機能の詳細な説明

tomcat 設定ファイルから、tomcat の起動時にデフォルトで 8080 (8443)、800...

SpringBoot と Docker の統合の詳細なプロセス

目次1. デモプロジェクト1.1 インターフェースの準備1.2 構成の準備2. Dockerがリモー...

Linuxでブーストライブラリをインストールするための完全な手順

序文Boost ライブラリは、標準ライブラリのバックアップとして機能し、C++ 標準化プロセスの開発...

Dockerでmongodbデータベースを使用するための実装コード

mongoイメージを取得する sudo docker pull mongo mongodbサービスを...

Vueはアンカー配置機能を実装します

この記事では、アンカー配置を実装するためのVueの具体的なコードを例として紹介します。具体的な内容は...

JavaScript タイマーの詳細

目次1. 簡単な紹介2. 間隔を設定する2.1 説明2.2 パラメータ2.3 戻り値2.4 使用法3...

MySQL トランザクション分離レベルの原則例分析

導入あなたも面接でこれに遭遇したことがあるはずです。トランザクションの分離レベルについてお話ししまし...

JavaScript における URL オブジェクトの素晴らしい使い方

目次序文解析パラメータURLパラメータを変更する要約する序文URLオブジェクトはページ側ではあまり使...

Tomcatの動作原理を分析する

SpringBoot は巨大な Python のようで、ゆっくりと私たちの周りを巻きつき、麻痺させま...