マウス
解説/アルゴリズム
ブラウザでマウスを扱うために、TypeScript からクリックやオーバーのようなイベント、どのボタンが押されたか、キーとの連携などが取得できる。
マウスイベント
イベント名 | 発生する条件 |
---|---|
mousedown | 要素上でマウスボタンが押された |
mouseup | 要素上でマウスボタンが離された |
mouseover | 外から要素内にマウスポイントが入ってきた |
mouseout | 要素内から外にマウスポイントが出た |
mousemove | 要素上でマウスが動かされた |
click | 要素上でマウスボタンがクリックされた |
contextmenu | 要素上で右マウスボタンが押された |
dblclick | 要素上でマウスボタンがダブルクリックされた |
document.addEventListener("mousedown", () => {
// 画面のどこかでマウスボタンが押されたときに呼ばれる
console.log(1);
});
const container = document.getElementById("container");
container.addEventListener("click", () => {
// idがcontainerの要素上でクリックされたときに呼ばれる
console.log(2);
});
マウスイベントを受け取りたい要素に addEventListener
で、イベント名とコールバックで呼ばれる関数を登録する。
on ~
document.onmousedown = () => {
// 画面のどこかでマウスボタンが押されたときに呼ばれる
};
const container = document.getElementById("container");
container.onclick = () => {
// idがcontainerの要素上でクリックされたときに呼ばれる
};
要素には onmousedown
や onclick
のような、 on{イベント名}
というイベントハンドラがあり、これを利用すると addEventListener
を使わず簡潔に記述することができる。
ただしイベントハンドラに指定できる関数は一つだけになる。
<button onclick="alert(123);"></button>
<div class="container" onclick="alert(456);"></div>
on
~系のイベントハンドラは要素の属性でもあるので、HTML から直接記述することができる。
マウスイベントの補足
mouseup
は対象の要素外でマウスボタンが押された状態で、対象の要素上に移動し、そこで離された場合でもイベントが発生する。
click
は対象の要素外でマウスボタンが押された状態で、対象の要素上に移動し、そこで離された場合、イベントが発生しない。
どのボタンが押されたか
document.onmousedown = (event: MouseEvent) => {
console.log(event.which);
};
MouseEvent の which プロパティからどのボタンが押されたかを数値として確認できる。
ボタン | which |
---|---|
左ボタン | 1 |
中央ボタン | 2 |
右ボタン | 3 |
キーとの連動
document.onmousedown = (event: MouseEvent) => {
if (event.shiftKey && event.ctrlKey) {
// ShiftキーとCtrlキーを押しながら該当のマウスイベントが発生した場合
}
};
マウスイベント発生時に特定のキーが押されていたかを確認できる。
プロパティ | キー |
---|---|
shiftKey | Shift キー |
ctrlKey | Ctrl キー |
altKey | Alt キー |
metaKey | Meta キー |
マウス位置
document.onmousemove = (event: MouseEvent) => {
console.log(event.pageX, event.pageY);
console.log(event.clientX, event.clientY);
};
(pageX, pageY)
, (clientX, clientY)
ともにマウス位置を返すプロパティだが、スクロールされているときに返す値の違いが出る。
pageY
はページ最上部からマウスポインタがある位置までの距離だが、 clientY
は今ブラウザに表示されている領域最上部からの距離を返す。
x 軸である pageX
/ clientX
も同様となる。