JavaScriptでポインターの位置を取得する方法を教えます

JavaScriptでポインターの位置を取得する方法を教えます

JavaScript でポインターの位置を取得する方法は、イベント オブジェクトの pageX と pageY、または clientX と clientY プロパティを使用し、scrollLeft と scrollTop プロパティと連携して、ポインターの位置を計算します。

この記事の動作環境: Windows 10 システム、JavaScript 1.8.5、ThinkPad T480 コンピューター。

ページ上のポインターの位置を取得するには、イベント オブジェクトの pageX と pageY、または clientX と clientY (IE 互換) プロパティを使用できます。また、scrollLeft と scrollTop プロパティと連携して、ページ上のマウス ポインターの位置を計算する必要があります。

//マウス ポインターのページ位置を取得します //パラメータ: e は現在のイベント オブジェクトを表します //戻り値: ページに対するマウスの座標をオブジェクト形式 (x, y) で返します

関数 getMP(e) {

    var e = e || window.event;

    戻る {

        x : e.pageX || e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)、

        y : e.pageY || e.clientY + (document.documentElement.scrollTop || document.body.scrollTop)

    }

}

pageX および pageY イベント属性は IE ブラウザではサポートされておらず、clientX および clientY イベント属性は Safari ブラウザではサポートされていないため、異なるブラウザとの互換性を保つためにこれらを混在させることができます。 Quirks モードでは、body 要素がページ領域を表し、html 要素は非表示になりますが、標準モードでは、html 要素がページ領域を表し、body 要素は独立したページ要素にすぎないため、これら 2 つの解析方法は互換性がある必要があります。

次の例は、上記の拡張機能 getMP() を呼び出して、ドキュメント内のマウス ポインターの現在の位置を取得する方法を示しています。

<body style="width:2000px;height:2000px;">
    <textarea id="t" cols="15" rows="4" style="position:fixed;left:50px;top:50px;"></textarea>
</本文>
<スクリプト>
    var t = document.getElementById("t");
    document.onmousemove = function(e){
        var m = getMP(e);
        t.value = "mouseX = " + mx + "\n" + "mouseY = " + my
    }
</スクリプト>

デモンストレーション効果は以下のとおりです。

ポインタの相対位置を取得する

offsetX と offsetY または layerX と layerY を使用して、マウス ポインターの、それを含むボックスに対するオフセット位置を取得します。 offsetLeft プロパティと offsetTop プロパティを使用して、配置包含ボックス内の要素のオフセット座標を取得し、layerx プロパティ値を使用して offsetLeft プロパティ値を減算し、layery プロパティ値を使用して offsetTop プロパティ値を減算すると、要素内のマウス ポインターの位置を取得できます。

//要素内のマウスポインターの位置を取得します //パラメータ: e は現在のイベントオブジェクトを表し、o は現在の要素を表します //戻り値: 相対座標オブジェクトを返します function getME (e, o) {

    var e = e || window.event;

    戻る {

        x : e.offsetX || (e.layerX - o.offsetLeft)、

        y : e.offsetY || (e.layerY - o.offsetTop)

    }

}

実際には、上記の機能には次の 2 つの問題があります。

  • Mozilla Type と Safari は、要素の境界外壁の左上隅を参照ポイントとして使用します。
  • 他のブラウザでは、要素の境界の内壁の左上隅を座標の原点として使用します。

境界線がマウスの位置に与える影響を考慮すると、要素の境界線が非常に広い場合は、境界線がマウスの位置に与える影響を排除する方法を検討する必要があります。ただし、境界線のスタイルが異なるため、デフォルトの幅は 3 ピクセルとなり、要素の境界線の実際の幅を取得するのが難しくなります。現在の要素の境界線の幅を決定するには、さらに条件を設定する必要があります。

要素内のマウス ポインターの位置を取得するための改良された拡張機能は次のとおりです。

//要素内のマウスポインターの位置を完全に取得します //パラメータ: e は現在のイベントオブジェクト、o は現在の要素を表します //戻り値: 要素に対するマウスの座標位置を返します。x は x 軸のオフセット距離、y は y 軸のオフセット距離を表します function getME(e, o){

    var e = e || window.event;

    // 要素の左境界線の幅を取得します // getStyle() 拡張関数を呼び出して境界線スタイルの値を取得し、数値に変換してみます。変換が成功したら、値を割り当てます。

    // それ以外の場合は、境界線スタイルが定義されているかどうかを判断します。境界線スタイルが定義されていて、値が none でない場合は、境界線の幅がデフォルト値の 3 ピクセルであることを意味します。

    //境界線スタイルが定義されておらず、幅の値が自動の場合、境界線の幅は 0 になります

    var bl = parseInt(getStyle(o, "borderLeftWidth")) || ((o.style.borderLeftStyle && o.style.borderLeftStyle != "none" )? 3 : 0);

    // 要素の上部境界線の幅を取得します。設計の考え方は、左境界線を取得する場合と同じです。var bt = parseInt(getStyle(o, "borderTopWidth")) || ((o.style.borderTopStyle && o.style.borderTopStyle !="none" ) ? 3 : 0);

    var x = e.offsetX || (e.layerX - o.offsetLeft - bl); // 一般的なブラウザのマウス オフセット値 // Mozilla ブラウザと互換性があり、境界線の幅を引いた値 var y = e.offsetY || (e.layerY - o.offsetTop - bt); // 一般的なブラウザのマウス オフセット値 // Mozilla ブラウザと互換性があり、境界線の幅を引いた値 var u = navigator.userAgent; // ブラウザのユーザー データを取得します if( (u.indexOf("KHTML") > - 1) ||(u.indexOf("Konqueror") > - 1) || (u.indexOf("AppleWebKit") > - 1)

    ){ // Safari ブラウザの場合は、境界線効果を減算します x -= bl; y -= bt;

    } return { // 要素の境界の内壁の左上隅を位置決めの原点として、さまざまなブラウザと互換性のあるマウス位置オブジェクトを返します。x: x、y: y

    }  

}

デモンストレーション効果は以下のとおりです。

推奨学習: JavaScript ビデオチュートリアル

これで、JavaScript でポインターの位置を取得する方法についての記事は終了です。js ポインターの位置の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript の変数、ポインタ、参照関数と操作の例
  • JavaScript におけるポインタとアドレスについての簡単な説明
  • JavaScript の this ポインターに関する新しい理解を共有する
  • js 変数スコープと this ポインタに関する議論
  • JavaScript 関数内で this ポインタを変更する 3 つの方法
  • Javascript thisポインタ

<<:  W3C チュートリアル (10): W3C XQuery アクティビティ

>>:  Ubuntu Server 18.04.5 LTS サーバー エディションのインストールと構成のグラフィック チュートリアル

推薦する

フロントエンドは画像を遅延ロードする方法を知っている必要があります(3つの方法)

目次1. 遅延読み込みとは何ですか? 2. 遅延読み込みを実装する🌄: 2.1 最初の方法: 2.2...

HTML文書におけるol要素の数値制限に関する議論

一般的に言えば、HTML ドキュメント内で極端に大きな <ol> リストに遭遇する可能性...

Nginx 7層負荷分散のいくつかのスケジューリングアルゴリズムの簡単な理解

この記事は主に、Nginx 7 層負荷分散のいくつかのスケジューリング アルゴリズムを紹介します。こ...

EDMをHTMLで記述する際の注意点まとめ(メール送信時の一般的な注意点)

フォーマットエンコーディング1. ページの幅は600~800px、長さは1024px以内に設定してく...

ECMAScriptにおけるプリミティブ値と参照値の詳しい説明

目次序文動的プロパティとは何ですか?値のコピー値の種類を決定する要約する序文これは JavaScri...

Win10 MySQLでCSVをエクスポートする2つの方法

Win10 で csv をエクスポートする方法は 2 つあります。1 つ目はツールを使用することです...

入力テキスト ボックスと画像検証コードの位置合わせの問題 (画像は常に入力より 1 つ上になります)

Web ページ制作では、input と img が同じ行に配置されることが多く、img タグが常に ...

ReactアプリケーションにおけるDOM DIFFアルゴリズムの詳細な説明

目次序文VirtualDOM とは何ですか? VirtualDOMを使用する理由DOMレンダリングペ...

Vue は better-scroll を使用して水平スクロール方法の例を実現します

1. スクロールの実装原理better-scroll のスクロール原理は、ブラウザのネイティブスクロ...

Vue コンポーネントでのアンチシェイクとスロットリングの使用例の分析

入力ボックスへのユーザー入力、ウィンドウのサイズ変更、スクロール、Intersection Obse...

ナビゲーションバーコンポーネントをVueでカプセル化する

はじめに:ナビゲーション バーなどのコンポーネント ベースのアイデアを使用して機能モジュールを完全に...

HTML ハイパーリンク スタイル (4 つの異なる状態) の設定例

コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...

CentOS7 は rpm パッケージを使用して mysql 5.7.18 をインストールします

例示するこの記事は、2017 年 5 月 20 日に MySQL-5.7.18 を使用して作成されま...