要素に対するマウスの位置を見つける


244

キャンバスを使った小さな絵アプリを作りたいです。だから私はキャンバス上のマウスの位置を見つける必要があります。


2
完全なソリューション:acko.net/blog/...
EDA-QA MORT-ORA-Y

3
私は短いのが大好きですが、この投稿のすべてを説明しています。
dwjohnston 2016

これは本当に古いですが、私はGitHubプロジェクトを始めたばかりです。とりわけ、必要なことを正確に実行します。brainlessdeveloper.com
Fausto NA

回答:


177

JQueryを使用している人向け:

場合によっては、ネストされた要素があり、そのうちの1つにイベントが関連付けられていると、ブラウザが親と見なすものを理解するのが混乱することがあります。ここでは、どの親を指定できます。

マウスの位置を取得し、それを親要素のオフセット位置から差し引きます。

var x = evt.pageX - $('#element').offset().left;
var y = evt.pageY - $('#element').offset().top;

スクロールペイン内のページでマウスの位置を取得しようとしている場合:

var x = (evt.pageX - $('#element').offset().left) + self.frame.scrollLeft();
var y = (evt.pageY - $('#element').offset().top) + self.frame.scrollTop();

または、ページに対する相対的な位置:

var x = (evt.pageX - $('#element').offset().left) + $(window).scrollLeft();
var y = (evt.pageY - $('#element').offset().top) + $(window).scrollTop();

次のパフォーマンス最適化に注意してください。

var offset = $('#element').offset();
// Then refer to 
var x = evt.pageX - offset.left;

このようにして、JQueryは#element各行を検索する必要がありません。

更新

getBoundingClientRect()をサポートするブラウザ用に、以下の@anytimecoderによる新しいJavaScript専用バージョンがあります。


7
それはあなたのために@benのために働きましたか、私は「正しい答え」またはあなたのためにまだうまくいっていないものについてのコメントをいただければ幸いです。多分私はさらに助けることができます。
sparkyspider 2012

8
非常に遅いコードが必要でない限り、イベントハンドラーで$( 'selector')を使用しないでください。要素を事前に選択し、ハンドラーで事前に選択された参照を使用します。$(window)についても同じことを一度実行してキャッシュします。
オースティンフランス

2
これは必要な言及ではありません。上記のコードをコピーして貼り付ける場合は、必ず修正var y = (evt.pageY - $('#element').offset().left) + $(window).scrollTop();してくださいvar y = (evt.pageY - $('#element').offset().top) + $(window).scrollTop();
Raj Nathani

77
質問はjQueryとは何の関係もないので、どうしてそれが答えになるでしょうか?
FlorianB

2
@Blackしかし、jqueryは環境によっては互換性がない可能性があるため、jqueryではなくjavascriptで質問する人もいます。
dbrree

307

コピー/貼り付けできるjQueryなしの回答が見つからなかったため、使用したソリューションは次のとおりです。

function clickEvent(e) {
  // e = Mouse click event.
  var rect = e.target.getBoundingClientRect();
  var x = e.clientX - rect.left; //x position within the element.
  var y = e.clientY - rect.top;  //y position within the element.
}

完全な例のJSFiddle


2
このメソッドで整数値を確保するには、境界の四角形丸める必要があります。
ジェイクコブ

2
新しい編集により、スクロールの問題が修正されます(clientX / Yを使用)
Erik Koopmans

6
この回答は投票する必要があります。anytimecoderと@ErikKoopmansに感謝します。
Ivan

3
PSA:@mpenのコメントは廃止されました。この方法は、スクロールがある場合でも機能します。彼らのフィドルの更新バージョンを見る:jsfiddle.net/6wcsovp2
Xharlie

4
ありがとうございました!注:e.currentTargete.targetではなくが必要です。そうしないと、子要素が影響します
Maxim Georgievskiy

60

次の例では、キャンバス要素に対するマウスの位置関係を計算します。

var example = document.getElementById('example'); 
example.onmousemove = function(e) { 
    var x = e.pageX - this.offsetLeft; 
    var y = e.pageY - this.offsetTop; 
}

この例でthisは、はexample要素を参照し、eonmousemoveイベントです。


83
多分それは私ですが、キーワード「これ」を使用する2行のコードにはコンテキストがありませんか?
Deratrius 2012

9
明らかにコンテキストが不足しています。「e」はイベントであり、「this」はイベントが関連付けられている要素です var example = document.getElementById('example'); example.onmousemove = function(e) { var X = e.pageX - this.offsetLeft; var Y = e.pageY - this.offsetTop; }
Nick Bisby

22
一部の子孫要素が相対位置または絶対位置を使用している場合、これは機能しません。
edA-qa mort-ora-y

12
あなたが出て切り替えることができますthise.currentTarget、それはあなたがにイベントリスナーを追加したことを要素の相対位置を取得します。
LinusUnnebäck2015

2
これは、位置を要素全体ではなく、要素の表示部分に関連付けるようです。要素の一部がビューポートに表示されず、スクロールバーなどがある場合に、それに対応する方法はありますか?
18年

37

参照要素が他の内部にネストされている場合に相対座標を返す純粋なJavaScriptには、絶対配置が可能な回答はありません。このシナリオの解決策は次のとおりです。

function getRelativeCoordinates (event, referenceElement) {

  const position = {
    x: event.pageX,
    y: event.pageY
  };

  const offset = {
    left: referenceElement.offsetLeft,
    top: referenceElement.offsetTop
  };

  let reference = referenceElement.offsetParent;

  while(reference){
    offset.left += reference.offsetLeft;
    offset.top += reference.offsetTop;
    reference = reference.offsetParent;
  }

  return { 
    x: position.x - offset.left,
    y: position.y - offset.top,
  }; 

}

3
html要素のオフセットは考慮されていないと思います
apieceofbart

3
コンテナをスクロールするのに最適ですが、わずかな変更点while(reference !== undefined)がありwhile(reference)ます。をに置き換えてください。少なくともChromeで、offsetParentのは、になってしまうしませんundefined、しかしnullreferenceが真実かどうかを確認するだけで、undefinedとの両方で機能することが保証されnullます。
blex

offsetParentプロパティがあることを知らせたので、できればさらに+1します。これは、他の状況でも非常に役立つことが判明しています!
FonzTech

一般に、未定義に対するチェックは通常悪い考えです
Juan Mendes

スクロールされた子孫を差し引きscrollLeftscrollTop補正する必要があると思います。
ロバート

20

この問題の難しさの良い記事はここにあります:http : //www.quirksmode.org/js/events_properties.html#position

そこで説明されている手法を使用すると、ドキュメント内のマウスの位置を見つけることができます。次に、それが要素の境界ボックス内にあるかどうかを確認します。これはelement.getBoundingClientRect()、次のプロパティを持つオブジェクトを返すを呼び出すことで見つけることができます{ bottom, height, left, right, top, width }。そこから、要素内でイベントが発生したかどうかを判断するのは簡単です。


1
悲しいことに、何らかの回転が行われている場合、これは失敗します
Eric

17

私はこれらすべてのソリューションを試しましたが、マトリックス変換コンテナー(パンズームライブラリ)を使用した特別なセットアップのため、どれも機能しませんでした。これは、ズームしてパンした場合でも正しい値を返します。

mouseevent(e) {
 const x = e.offsetX,
       y = e.offsetY
}

ただし、子要素がない場合のみ。これは、CSSを使用してイベントに対して「非表示」にすることで回避できます。

.child {
   pointer-events: none;
}

3
これは間違いなく2019年にこれを行う方法です。他の答えはすべて古い古い手荷物を積んでいます。
コリンD

1
@ColinDありがとうございます!IE11でも動作することを忘れてしまいました。
Fabian von Ellerts

これでうまくいきました。しかし、私は1)賛成票がほとんどない2)より高い評価の回答の方がはるかに複雑であり、3)欠点が説明されていないことを疑っています。誰かがこのアプローチを使用することの欠点を知っていますか?
マークE

1
@MarkE疑わしいことは何もありません。StackOverflowの多くの障害の1つです。一番上にあるこれらの回答は、この回答の何年も前に投稿されていたため、非常に高い賛成票の勢いを得ました。答えがこの勢いを得ると、それを打ち負かすことはかなり難しく、かなりまれです。
ジャックギフィン

9

私はこの質問に出くわしましたが、(DOM要素でドラッグオーバーを使用して(私の場合はキャンバスではない)使用offsetXoffsetYて)それを機能させるために、ドラッグアンドマウスイベントを使用するだけでよいことがわかりました。

onDragOver(event){
 var x = event.offsetX;
 var y = event.offsetY;
}

2
これは私にとってはうまくいきました。なぜ誰もこれを支持しなかったのですか?落とし穴はないかしら。見つけたら報告します!
シーバス

7
event.offsetXは、ドラッグオーバーリスナーが関連付けられている要素ではなく、マウスポインターが現在置かれている要素を基準にしています。ネストされた要素構造がない場合は問題ありませんが、それがある場合は機能しません。
opsb

7

私は正しい方向にたどり着いたので、Mark van Wykの答えを+1しましたが、私には完全には解けませんでした。別の要素に含まれる要素のペイントについては、まだオフセットがありました。

以下は私のためにそれを解決しました:

        x = e.pageX - this.offsetLeft - $(elem).offset().left;
        y = e.pageY - this.offsetTop - $(elem).offset().top;

言い換えると、ネストされたすべての要素からのすべてのオフセットを単純にスタックします


あなたに+1!これが私が探していた答えです。私は2つのキャンバスを積み重ねていましたが、他のdivのために座標がすべて間違っていました。これが問題であることは知っていましたが、それを補正するための論理/方程式がわかりませんでした。あなたも私の問題を修正しました!= Dありがとう!
Partack 2013年

5

上記の回答のいずれも満足できるIMOではないので、ここで私が使用するものを示します。

// Cross-browser AddEventListener
function ael(e, n, h){
    if( e.addEventListener ){
        e.addEventListener(n, h, true);
    }else{
        e.attachEvent('on'+n, h);
    }
}

var touch = 'ontouchstart' in document.documentElement; // true if touch device
var mx, my; // always has current mouse position IN WINDOW

if(touch){
    ael(document, 'touchmove', function(e){var ori=e;mx=ori.changedTouches[0].pageX;my=ori.changedTouches[0].pageY} );
}else{
    ael(document, 'mousemove', function(e){mx=e.clientX;my=e.clientY} );
}

// local mouse X,Y position in element
function showLocalPos(e){
    document.title = (mx - e.getBoundingClientRect().left)
        + 'x'
        + Math.round(my - e.getBoundingClientRect().top);
}

また、ページの現在のYスクロール位置を知る必要がある場合:

var yscroll = window.pageYOffset
        || (document.documentElement && document.documentElement.scrollTop)
        || document.body.scrollTop; // scroll Y position in page

4

モバイルデバイス用の通常のWebサイトまたはPWA(プログレッシブWebアプリ)および/またはタッチスクリーンを備えたラップトップ/モニターを開発している場合は、マウスイベントに慣れている可能性があり、タッチのときどき痛い経験に慣れていないため、ここに移動しました。イベント...イェイ!

ルールは3つしかありません。

  1. mousemoveまたはtouchmoveイベント中は、できる限り少ないことを行います。
  2. イベント中mousedowntouchstartイベント中はできる限りのことをしてください。
  3. 伝播をキャンセルし、タッチイベントのデフォルトを防止して、ハイブリッドデバイスでマウスイベントも発生しないようにします。

言うまでもなく、touchイベントは複数存在する可能性があり、マウスイベントよりも柔軟(複雑)であるため、イベントはより複雑になります。ここでは、ワンタッチについてのみ説明します。はい、私は怠惰ですが、それは最も一般的なタイプのタッチなので、そこにあります。

var posTop;
var posLeft;
function handleMouseDown(evt) {
  var e = evt || window.event; // Because Firefox, etc.
  posTop = e.target.offsetTop;
  posLeft = e.target.offsetLeft;
  e.target.style.background = "red";
  // The statement above would be better handled by CSS
  // but it's just an example of a generic visible indicator.
}
function handleMouseMove(evt) {
  var e = evt || window.event;
  var x = e.offsetX; // Wonderfully
  var y = e.offsetY; // Simple!
  e.target.innerHTML = "Mouse: " + x + ", " + y;
  if (posTop)
    e.target.innerHTML += "<br>" + (x + posLeft) + ", " + (y + posTop);
}
function handleMouseOut(evt) {
  var e = evt || window.event;
  e.target.innerHTML = "";
}
function handleMouseUp(evt) {
  var e = evt || window.event;
  e.target.style.background = "yellow";
}
function handleTouchStart(evt) {
  var e = evt || window.event;
  var rect = e.target.getBoundingClientRect();
  posTop = rect.top;
  posLeft = rect.left;
  e.target.style.background = "green";
  e.preventDefault(); // Unnecessary if using Vue.js
  e.stopPropagation(); // Same deal here
}
function handleTouchMove(evt) {
  var e = evt || window.event;
  var pageX = e.touches[0].clientX; // Touches are page-relative
  var pageY = e.touches[0].clientY; // not target-relative
  var x = pageX - posLeft;
  var y = pageY - posTop;
  e.target.innerHTML = "Touch: " + x + ", " + y;
  e.target.innerHTML += "<br>" + pageX + ", " + pageY;
  e.preventDefault();
  e.stopPropagation();
}
function handleTouchEnd(evt) {
  var e = evt || window.event;
  e.target.style.background = "yellow";
  // Yes, I'm being lazy and doing the same as mouseout here
  // but obviously you could do something different if needed.
  e.preventDefault();
  e.stopPropagation();
}
div {
  background: yellow;
  height: 100px;
  left: 50px;
  position: absolute;
  top: 80px;
  user-select: none; /* Disable text selection */
  -ms-user-select: none;
  width: 100px;
}
<div 
  onmousedown="handleMouseDown()" 
  onmousemove="handleMouseMove()"
  onmouseout="handleMouseOut()"
  onmouseup="handleMouseUp()" 
  ontouchstart="handleTouchStart()" 
  ontouchmove="handleTouchMove()" 
  ontouchend="handleTouchEnd()">
</div>
Move over box for coordinates relative to top left of box.<br>
Hold mouse down or touch to change color.<br>
Drag to turn on coordinates relative to top left of page.

Vue.jsを使用しますか?私がやります!次に、HTMLは次のようになります。

<div @mousedown="handleMouseDown"
     @mousemove="handleMouseMove"
     @mouseup="handleMouseUp"
     @touchstart.stop.prevent="handleTouchStart"
     @touchmove.stop.prevent="handleTouchMove"
     @touchend.stop.prevent="handleTouchEnd">

3

あなたはそれを手に入れることができます

var element = document.getElementById(canvasId);
element.onmousemove = function(e) {
    var xCoor = e.clientX;
    var yCoor = e.clientY;
}

これはIEで機能しますか、それともIEはイベントをリスナーの最初の引数に渡す代わりにwindow.eventを使用しますか?編集-私は推測IEはバージョン9までとにかくcanvas要素を欠いたが、これはまだおそらくexcanvasのようなものでIEをサポートする必要があります....
Dagg Nabbit

21
これにより、ブラウザーウィンドウを基準にした座標が得られますが、element.getBoundingClientRect()を使用して要素内にあるかどうかを判断する必要があります
David W. Keith

getBoundingClientRectを知らせてくれてありがとう!!!! こんなことがあったなんて、実は思いませんでした!
Gershom 2014年

@ DavidW.Keithコメントは本当に正しい答えと考えるべきです!
Ulrik。S

3

このチュートリアルから引用、トップコメントのおかげで修正が行われました。

function getMousePos( canvas, evt ) {
    var rect = canvas.getBoundingClientRect();
    return {
        x: Math.floor( ( evt.clientX - rect.left ) / ( rect.right - rect.left ) * canvas.width ),
        y: Math.floor( ( evt.clientY - rect.top ) / ( rect.bottom - rect.top ) * canvas.height )
    };
}

次のようにキャンバスで使用します。

var canvas = document.getElementById( 'myCanvas' );
canvas.addEventListener( 'mousemove', function( evt ) {
    var mousePos = getMousePos( canvas, evt );
} );

3

私は少し遅れていることに気づきましたが、これはPURE JavaScriptで動作し、要素がビューポートより大きく、ユーザーがスクロールした場合に、要素内のポインターの座標を提供します。

var element_offset_x ; // The distance from the left side of the element to the left of the content area


....// some code here (function declaration or element lookup )



element_offset_x = element.getBoundingClientRect().left  -  document.getElementsByTagName("html")[0].getBoundingClientRect().left  ;

....// code here 




function mouseMoveEvent(event) 
{
   var pointer_location = (event.clientX + window.pageXOffset) - element_offset_x ; 
}

使い方。

最初に、現在のビューポートを基準にしたHTML要素(コンテンツ領域)の場所を取得します。ページにスクロールバーがあり、スクロールされているgetBoundingClientRect().left場合、htmlタグに対して返される数値は負になります。次に、この数値を使用して、要素とコンテンツ領域の左側との間の距離を計算します。とelement_offset_x = element.getBoundingClientRect().left......;

コンテンツ領域からの要素の距離を知る。event.clientXビューポートからのポインタの距離を与えます。ビューポートとコンテンツ領域は2つの異なるエンティティであることを理解することが重要です。ページがスクロールされると、ビューポートが移動する可能性があります。したがって、ページがスクロールされても、clientXは同じ番号を返します。

これを補正するには、ビューポートのx位置(コンテンツ領域を基準)にポインター(ビューポートを基準)のx位置を追加する必要があります。ビューポートのX位置は、 window.pageXOffset.


1
スクロールについて考える唯一の回答者になっていただきありがとうございます。答えを変更して、y軸も追加することを検討してください。
18年

3

@Spiderのソリューションに基づいて、私の非JQueryバージョンはこれです:

// Get the container element's bounding box
var sides = document.getElementById("container").getBoundingClientRect();

// Apply the mouse event listener
document.getElementById("canvas").onmousemove = (e) => {
  // Here 'self' is simply the current window's context
  var x = (e.clientX - sides.left) + self.pageXOffset;
  var y = (e.clientY - sides.top) + self.pageYOffset;
}

これは、スクロールとズームの両方で機能します(この場合、フロートが返されることがあります)。


私は賛成票を投じますが、それらはページオフセットのマイナス記号であってはなりませんか?それか、2番目の部分を括弧で囲んでいるか?
Chris Sunamiがモニカをサポートする

1

キャンバス内のマウス座標は、event.offsetXとevent.offsetYのおかげで取得できます。これが私のポイントを証明する小さなスニペットです:

c=document.getElementById("c");
ctx=c.getContext("2d");
ctx.fillStyle="black";
ctx.fillRect(0,0,100,100);
c.addEventListener("mousemove",function(mouseEvt){
  // the mouse's coordinates on the canvas are just below
  x=mouseEvt.offsetX;
  y=mouseEvt.offsetY;
  // the following lines draw a red square around the mouse to prove it
  ctx.fillStyle="black";
  ctx.fillRect(0,0,100,100);
  ctx.fillStyle="red";
  ctx.fillRect(x-5,y-5,10,10);
});
  
body {
  background-color: blue;
}

canvas {
  position: absolute;
  top: 50px;
  left: 100px;
}
<canvas id="c" width="100" height="100"></canvas>
    


@opsbが言ったように、別のdivがキャンバスをオーバーレイしている場合は機能しません
David Peicho

1
canvas.onmousedown = function(e) {
    pos_left = e.pageX - e.currentTarget.offsetLeft;
    pos_top = e.pageY - e.currentTarget.offsetTop;
    console.log(pos_left, pos_top)
}

HTMLElement.offsetLeft

HTMLElement.offsetLeft読み取り専用プロパティは、現在の要素の左上隅を内左側にオフセットされていることをピクセルの数を返しますHTMLElement.offsetParentのノード。

ブロックレベル要素の、offsetTopoffsetLeftoffsetWidth、およびoffsetHeightからの相対要素の境界ボックスを記述するoffsetParent

しかしながら、(例えば、インラインレベル要素のspan一列から次へとラップすることができる)offsetTopおよびoffsetLeft(利用第一境界ボックスの位置を記述しElement.getClientRects()、その幅と高さを取得するために)、一方offsetWidth及びoffsetHeight境界境界ボックスの寸法を記載(Element.getBoundingClientRect()その位置を取得するために使用)。そのため、左、上、幅と高さを持つボックスはoffsetLeftoffsetTopoffsetWidthおよびoffsetHeight包まれたテキストを持つスパンのためのバウンディングボックスではありません。

HTMLElement.offsetTop

HTMLElement.offsetTop読み取り専用プロパティは、の先頭に現在の要素の相対的な距離を返しoffsetParentノード。

MouseEvent.pageX

pageX読み取り専用プロパティは、X(水平)は、ドキュメント全体にイベントの相対画素座標を返し。このプロパティは、ページの水平スクロールを考慮します。

MouseEvent.pageY

MouseEvent.pageY読み取り専用プロパティは、Y(垂直)は文書全体に対するイベントの各画素の座標を返し。このプロパティは、ページの垂直スクロールを考慮します。

詳細については、Mozilla Developer Networkを参照してください。

https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/pageX https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/pageY https:// developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetLeft https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetTop


このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
Patrick Hund 2017

将来の読者がこれを計算するJS APIを持っていることを本当に望みます。;-)これはおそらく最も単純で完全な自己完結型の答えです。自明のコードにコメントすることは、無駄をそらすだけです。
lama12345 2017

説明のために@PatrickHundのリクエストを2番目に受け取ります。私は、CSS / JSの専門家ではないよ、と例えば、間の関係についての詳細を知って、pageそしてoffset私にとって非常に役立つだろう。このリクエストを検討していただきありがとうございます!
cxw 2017

@cxw OK、あなたは今2番目の反対投票です(1つの反対投票がありました)...私はここで長い説明を追加しました。4行のコードであれば10倍です。どういたしまして。リクエストを検討しました。:p
lama12345

1
@cxw絶対配置された要素を追加し、キャンバス要素自体もオフスクリーンに強制することで、いじくり回したので、左/上2000pxオフスクリーンのようにスクロールする必要がありました。このコードを壊すことができませんでした。
lama12345 2017

1

私は非常にシンプルだと思う別のソリューションを実装したので、皆さんと共有したいと思いました。

したがって、私にとっての問題は、ドラッグされたdivがマウスカーソルの0,0にジャンプすることでした。したがって、div上のマウスの位置をキャプチャして、divの新しい位置を調整する必要がありました。

divのPageXとPageYを読み取り、それに応じて上と左を設定してから、座標を調整してカーソルをdivの初期位置に保つために値を取得するために、onDragStartリスナーを使用してe.nativeEventを保存します。 .layerXe.nativeEvent.layerYは、最初のトリガーでのみ、ドラッグ可能なdiv内のマウスの位置を示します。

コード例:

 onDrag={(e) => {
          let newCoords;
          newCoords = { x: e.pageX - this.state.correctionX, y: e.pageY - this.state.correctionY };
          this.props.onDrag(newCoords, e, item.id);
        }}
        onDragStart={
          (e) => {
            this.setState({
              correctionX: e.nativeEvent.layerX,
              correctionY: e.nativeEvent.layerY,
            });
          }

これが私が経験したのと同じ問題を経験した人に役立つことを願っています:)


1
function myFunction(e) {
    var x =  e.clientX - e.currentTarget.offsetLeft ; 
    var y = e.clientY - e.currentTarget.offsetTop ;
}

これは大丈夫です!


0

キャンバスがdivの子であり、次に別のdivの子である場合、ページの構造を知っている必要があります...ストーリーはより複雑になります。2レベルのdiv内にあるキャンバスのコードは次のとおりです。

canvas.addEventListener("click", function(event) {
var x = event.pageX - (this.offsetLeft + this.parentElement.offsetLeft);
var y = event.pageY - (this.offsetTop + this.parentElement.offsetTop);
console.log("relative x=" + x, "relative y" + y);

});


0

元の答えは、それをiframeに入れると言いました。より良い解決策は、パディングが0pxに設定されているキャンバスでイベントoffsetXおよびoffsetYを使用することです。

<html>
<body>
<script>

var main=document.createElement('canvas');
main.width="200";
main.height="300";
main.style="padding:0px;margin:30px;border:thick dashed red";
document.body.appendChild(main);

// adding event listener

main.addEventListener('mousemove',function(e){
    var ctx=e.target.getContext('2d');
    var c=Math.floor(Math.random()*0xFFFFFF);
    c=c.toString(16); for(;c.length<6;) c='0'+c;
    ctx.strokeStyle='#'+c;
    ctx.beginPath();
    ctx.arc(e.offsetX,e.offsetY,3,0,2*Math.PI);
    ctx.stroke();
    e.target.title=e.offsetX+' '+e.offsetY;
    });

// it worked! move mouse over window

</script>
</body>
</html>

0

これが私が手に入れたものです。

    $(".some-class").click(function(e) {

    var posx = 0;
    var posy = 0;

    posx = e.pageX;
    posy = e.pageY;

    alert(posx);
    alert(posy);
});

0

親の使用getBoudingClientRect()ができますrelative

document.addEventListener("mousemove", (e) => {
  let xCoord = e.clientX - e.target.getBoundingClientRect().left + e.offsetX
  let yCoord = e.clientY - e.target.getBoundingClientRect().top + e.offsetY
  console.log("xCoord", xCoord, "yCoord", yCoord)
})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.