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 サーバー エディションのインストールと構成のグラフィック チュートリアル

推薦する

myisamchk および mysqlcheck ツールを使用して破損した MySQL データベース ファイルを迅速に修復する方法

サーバーのデータベース ハード ディスク領域がいっぱいだったため、大量のデータの書き込みに失敗し、「...

jQueryはショッピングカート機能を実装します

この記事の例では、ショッピングカート機能を実装するためのjQueryの具体的なコードを参考までに共有...

JavaScript ファイルの読み込みとブロックの問題: パフォーマンス最適化のケーススタディ

まず質問させてください。HTML ページを作成するときに、外部から JS ファイルをインポートする場...

MySQL 5.7.18 MSI インストール グラフィック チュートリアル

この記事では、参考までにMySQL 5.7.18 MSIインストールチュートリアルを紹介します。具体...

nginx リバース プロキシの魔法のスラッシュについての簡単な説明

nginx リバース プロキシを設定する場合、location と proxy_pass のスラッシ...

MySQL マルチテーブル結合クエリの詳細な説明

目次複数テーブル結合クエリ内部結合左結合右結合サブクエリ要約する複数テーブル結合クエリテーブル間の接...

我々は自らの力でIE6を絶滅に追い込んでいる

実際、IE6 が本当にいつ消滅するのか私たちは毎日疑問に思っていますが、2001 年のリリース以来、...

ReactRouterの実装

ReactRouterの実装ReactRouterはReactのコアコンポーネントです。主にReac...

ユーザーエクスペリエンスの76の経験ポイントの要約

ウェブサイト体験の分類1. 感覚体験:快適性を重視した視聴覚体験をユーザーに提供します。 2. イン...

MySQLの基本の共通機能

目次1. 共通機能分類1.1 単一行関数: 1.2 グループ化機能: 2. 単一行関数3. 数学関数...

TypeScript マッピング型の詳細

目次1. マップされた型2. マッピング修飾子3. キーの再マッピング4. さらなる探究序文: Ty...

dockerでデプロイされたjenkinsでgitプログラムを実行する際の問題について

1. まず、gitを関連付けるときにエラーメッセージが報告されます: エラー: ビルドするリビジョン...

Linux jdk のインストールと環境変数の設定チュートリアル (jdk-8u144-linux-x64.tar.gz)

最初にsudo suコマンドを使用して root アカウントに切り替えることをお勧めします。そうしな...

MySQL 8.0.17 のインストールと設定のグラフィックチュートリアル

この記事は、参考のためにMySQL 8.0.17のインストールと設定のグラフィックチュートリアルを記...

Ajax の JavaScript ソリューションにおける parsererror エラー ケースの詳細な説明

ajax の parsererror エラー (バックグラウンドからフロントエンドに送信される js...