JavaScriptでページのスクロール量を含めた マウスポインタの座標を取得するコードを紹介します。
概要
こちらの記事で紹介した、マウスポインタの座標値を取得するコードを紹介しました。
マウスポインタの座標値を取得できますが、ページがスクロールする場合は、ページのスクロール量を考慮しないため、画面上の座標を返します。
利用用途によっては、ページのスクロール量を考慮した座標値が欲しい場合があります。
この記事では、ページのスクロール量を考慮したマウスポインタの座標値を取得するコードを紹介します。
書式
ページのスクロール量を考慮したマウスポインタの座標値を取得する場合は、pageX, pageY プロパティを利用します。
ページX座標
ページY座標
例:縦方向
コード
以下のHTMLファイルを作成します。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style>
.InfoFrame {
position:fixed;
left:2rem;
top:2rem;
border:1px solid #1e2793;
}
#Frame1 {
height:8rem;
background-color:#ffa4a4;
}
#Frame2 {
height: 8rem;
background-color: #ffda73;
}
#Frame3 {
height: 8rem;
background-color: #ceff7d;
}
#Frame4 {
height: 8rem;
background-color: #7aff8d;
}
#Frame5 {
height: 8rem;
background-color: #86ffd6;
}
#Frame6 {
height: 8rem;
background-color: #9dbaff;
}
#Frame7 {
height: 8rem;
background-color: #e897ff;
}
#Frame8 {
height: 8rem;
background-color: #ffa4c8;
}
</style>
<script type="text/javascript">
function init() {
window.onmousemove = handleMouseMove;
function handleMouseMove(event) {
event = event || window.event; // IE対応
target = document.getElementById("output_page");
target.innerHTML = "Page X:" + event.pageX + ", Page Y:" + event.pageY;
target = document.getElementById("output_client");
target.innerHTML = "Client X:" + event.clientX + ", Client Y:" + event.clientY;
target = document.getElementById("output_screen");
target.innerHTML = "Screen X:" + event.screenX + ", Screen Y:" + event.screenY;
}
}
</script>
</head>
<body>
<body onload="init();">
<div class="InfoFrame">
<div id="output_page"></div>
<div id="output_client"></div>
<div id="output_screen"></div>
</div>
<div id="Frame1"></div>
<div id="Frame2"></div>
<div id="Frame3"></div>
<div id="Frame4"></div>
<div id="Frame5"></div>
<div id="Frame6"></div>
<div id="Frame7"></div>
<div id="Frame8"></div>
</body>
</body>
</html>
解説
こちらの記事で紹介した、マウスポインタの座標値を取得するコードと同様です。
handleMouseMove 関数に以下のコードを追加して、pageX, pageY の値を画面に表示しています。
target = document.getElementById("output_page");
target.innerHTML = "Page X:" + event.pageX + ", Page Y:" + event.pageY;
実行結果
上記のHTMLページをWebブラウザで表示します。下図のページが表示されます。
マウスポインタをページ内に移動させると、座標値が左上に表示されます。
マウスポインタを左上に移動します。PageX, PageY, ClientX, ClientYの値が0になります。
ページを下にスクロールします。
ページを下にスクロールした状態で、マウスポインタをページの左上に移動します。
ClientX, ClientYの値は両方とも 0になりスクロールを考慮しない、Webブラウザの画面上の座標を表しています。
一方、PageYの値はスクロール量を考慮した値になっています。
例:横方向
横方向のスクロールの動作を確認します。
コード
以下のHTMLファイルを作成します。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style>
.InfoFrame {
position:fixed;
left:2rem;
top:2rem;
border:1px solid #1e2793;
}
#Frame1 {
width: 2480px;
height: 8rem;
background: linear-gradient(to right, #ffa4a4, #ff3131);
}
#Frame2 {
width: 2480px;
height: 8rem;
background: linear-gradient(to right, #ffda73, #e5b01c);
}
#Frame3 {
width: 2480px;
height: 8rem;
background: linear-gradient(to right, #ceff7d, #90cf28);
}
#Frame4 {
width: 2480px;
height: 8rem;
background: linear-gradient(to right, #7aff8d, #1cb532);
}
#Frame5 {
width: 2480px;
height: 8rem;
background: linear-gradient(to right, #73fbff, #19b7bb);
}
#Frame6 {
width: 2480px;
height: 8rem;
background: linear-gradient(to right, #9dbaff, #2052ca);
}
#Frame7 {
width: 2480px;
height: 8rem;
background: linear-gradient(to right, #e897ff, #a625cb);
}
#Frame8 {
width: 2480px;
height: 8rem;
background: linear-gradient(to right, #ffa4c8, #e0377a);
}
</style>
<script type="text/javascript">
function init() {
window.onmousemove = handleMouseMove;
function handleMouseMove(event) {
event = event || window.event; // IE対応
target = document.getElementById("output_page");
target.innerHTML = "Page X:" + event.pageX + ", Page Y:" + event.pageY;
target = document.getElementById("output_client");
target.innerHTML = "Client X:" + event.clientX + ", Client Y:" + event.clientY;
target = document.getElementById("output_screen");
target.innerHTML = "Screen X:" + event.screenX + ", Screen Y:" + event.screenY;
}
}
</script>
</head>
<body>
<body onload="init();">
<div class="InfoFrame">
<div id="output_page"></div>
<div id="output_client"></div>
<div id="output_screen"></div>
</div>
<div id="Frame1"></div>
<div id="Frame2"></div>
<div id="Frame3"></div>
<div id="Frame4"></div>
<div id="Frame5"></div>
<div id="Frame6"></div>
<div id="Frame7"></div>
<div id="Frame8"></div>
</body>
</body>
</html>
実行結果
上記のHTMLファイルをWebブラウザで表示します。下図のページが表示されます。
マウスポインタをページ内に移動させると、マウスポインタの座標値が左上に表示されます。
マウスポインタをぺージの左上に移動します。PageX, PageY, ClientX, ClientYの値が0になります。
ページを右にスクロールします。
ページを右にスクロールした状態で、マウスポインタをページの左上に移動します。
ClientX, ClientYの値は両方とも 0になり、スクロールを考慮しないWebブラウザの画面上の座標を表しています。
一方、PageXの値はスクロール量を考慮した値になっています。
下にスクロールします。
マウスポインタをページ左上に移動します。
ClientX, ClientYの値は0になりますが、PageX, PageYの値はスクロール量を考慮したページ全体の位置の座標値となります。
ページのスクロール量を含めた マウスポインタの座標を取得できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2023-04-12
作成日: 2023-04-12