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

推薦する

ツールベースのウェブサイトの考察: ツールベースのウェブサイトの定義と典型的なケース分析 (写真とテキスト)

ツール型ウェブサイトについて、まず疑問に思うのは、無数のオンラインウェブサイトの中で、どのようなウェ...

mysql8 共通テーブル式 CTE 使用例の分析

この記事では、例を使用して、MySQL 8 の共通テーブル式 (CTE) の使用方法を説明します。ご...

スタートアップ企業が丹念に作り上げた優れたウェブデザイン17選

スタートアップ企業は、型破りな仕事のやり方、ユニークなビジネスモデル、特徴的な製品やサービス、パーソ...

VMware Workstation 15 Pro に Ubuntu 1804 をインストールするチュートリアル (画像とテキスト付き)

このメモはインストール チュートリアルです。実用的な意味はありません。記録のためだけに書いています。...

JavaScript プログラムのループ構造の詳細な説明

目次構造を選択ループ構造その間…しながらforループ…のために…で…の…のためにまとめループの終了壊...

HTMLの基礎を詳しく解説(第2部)

1. リストリスト ulコンテナーには、一貫した構造とスタイルを持つテキストまたはグラフの形式が読...

MySQLのパスワードを忘れた場合の対処方法

MySQL パスワードを 2 回忘れてしまいましたか?最初、私はアンインストールして再インストールす...

Docker初心者が初めてよく使うコマンドを試してみる練習記録

Docker を正式に使用する前に、まず Docker でよく使用されるコマンドに慣れておきましょう...

見落としがちなMySQLのCOLLATIONの例の詳細な説明

序文MySQL データベースの文字列型は、CHAR、VARCHAR、BINARY、BLOB、TEXT...

HTML における li タグの水平配置の例

ほとんどのナビゲーション バーは、下の図に示すように水平に配置されていますが、これはどのように実現さ...

Vueルーティング相対パスジャンプメソッド

目次Vueルーティング相対パスジャンプ1. 属性の追加2.router.resolveメソッドVue...

SpringBoot のパッケージ化と Docker へのアップロード、およびマルチインスタンス デプロイメントの実装に関する簡単な分析 (IDEA バージョン)

最近友人からDockerを触ったことがあるかと聞かれました。あまり自信がなかったので答えられませんで...

vue3.0 のウォッチ リスナーの例の詳細な説明

目次序文リスナーと計算プロパティの違いvue3 で watch を使用するにはどうすればいいですか?...

Tudou.comのホームページのデザイン方法

<br />私は数年間フロントエンドに取り組んできました。フロントエンドについて完全に理...

PC/Pad/Phoneデバイスに自動的に適応するCSSウェブページレスポンシブレイアウト

序文最近は、PC、iPad、携帯電話、スマートウォッチ、スマートテレビなど、さまざまなデバイスが存在...