JavaScirpt でマウス座標(位置)を取得する
JavaScirpt でマウス座標(位置)を取得する
JavaScirpt でマウス座標(位置)を取得方法をメモ。取得する方法は2 種類あるようです。
(clientX, clientY) と (pageX, pageY) の違いと、 (getBoundingClientRect().left[top], getBoundingClientRect().top) と (offsetLeft, offsetTop) の違いをまとめておきます。
サンプル
ドラッグでCanvas 上に線を引けるサンプルです。その下にマウスの座標値が表示されます。
コード
JavaScript でマウス座標を取得し、Canvas上に線を描画
clientX[Y] と getBoundingClientRect().left[top]
Canvas 上の座標を求めるコードを以下に示します(サンプルではこちらを使用)。
canvas.addEventListener("mousemove", function(e){
//2.マウスが動いたら座標値を取得
var rect = e.target.getBoundingClientRect();
mouse.x = e.clientX - rect.left;
mouse.y = e.clientY - rect.top;
}
clientX, clientY では、ページのスクロール関係なく、ページ左上部を0 とし、マウスの位置を取得します。 そのため、スクロールして、ページ左上部の座標clientY の値は0 になります。
参考リンク:MouseEvent.clientX - Web API インターフェイス | MDN
getBoundingClientRect().left getBoundingClientRect().top では、 任意のevent が起きたtarget(要素)のBoundingBoxの位置(top, left, right, bottom)を取得できます。 これらの値は、ページのスクロールを考慮した位置です。そのため、スクロールして画面からはみ出た.top の値はマイナス(-)になります。
参考リンク:element.getBoundingClientRect - Web API インターフェイス | MDN
getBoundingClientRect().left[top] の値がスクロールを考慮しているので、 スクロールしてあるcanvas 上でも正しい座標位置が取れ、マウスで描画することができます。
pageX[Y] と offsetLeft[Top]
結論からいうと、MDNでpageX[Y] のページ[UIEvent.pageX - Web API インターフェイス | MDN]を見ると、 unstandard になっているので、使わないほうが良さそうです。
pageX[Y] と offsetLeft[Top] での場合のコードを以下に示します。
canvas.addEventListener("mousemove", function(e){
//2.マウスが動いたら座標値を取得
mouse.x = e.pageX - canvas.offsetLeft;
mouse.y = e.pageY - canvas.offsetTop;
}
pageX, pageY は、clientX[Y] とは逆で、スクロールを考慮します。 そのため、スクロールすると左上部のPageY の値は0 とはならず、スクロールする度に大きくなっていきます。
参考リンク:
UIEvent.pageX - Web API インターフェイス | MDN
offsetLeft, offsetTop では、こちらもgetBoundingClientRect().left[top] とは逆で、スクロールを考慮しません。そのため、スクロールしてもoffsetTop の値は変わりません。
参考リンク:Element.offsetLeft - Web API インターフェイス | MDN
まとめ
マウス座標(位置)を取得する場合は、 clientX, clientY と getBoundingClientRect().left, getBoundingClientRect().top の組み合わせを使用するのが良さそうです。