【JavaScript】hover時にマウスカーソルを変更する方法
- 2020.09.14
- 2022.05.04
- JavaScript

JavaScriptを使用して、hover時にマウスカーソルを変更する方法を知りたい!
こういった疑問に答えていきます。
最近のWebサイトでは、マウスカーソルの形状が変更されているものを多く見かけるようになりました。
今回はこのマウスカーソルを、hover時に変更されるようにJavaScriptで実装していきたいと思います。
では早速やっていきましょう!
hover時にJavaScriptでマウスカーソルを変更する方法
ファイルの準備
では早速実装していきます。
今回使用するHTMLファイル・CSSファイルはGitHubにアップしているので、活用してください。
使用するイベント
今回使用するイベントは下記の3つになります。
- mousemove
→ 対象要素内で、マウスカーソルを動かすたびにイベントが発火 - mouseenter
→ 対象要素内に、マウスカーソルが入ってきた時にイベントが発火 - mouseleave
→ 対象要素内から、マウスカーソルが出た時にイベントが発火
今回は、「mouseenter / mouseleave」を使用していますが、今回の場合では「mouseover / mouseout」でも構いません。
要素の取得
取得する要素は、hover時にマウスカーソルを表示させる領域と、マウスカーソル要素の2つを取得していきます。
const mouseEvent = function () {
let el = document.querySelector(".box"); //hover時にマウスカーソルを表示させる領域
let cursor = document.querySelector(".mouse"); //マウスカーソル要素
};
mouseEvent();
mousemoveイベントの設定
mousemoveイベントの対象要素は、windowで設定します。
CSSの設定で、マウスカーソル要素は常にページの左上にある状態になっています。この状態で、先ほど取得したel(hover時にマウスカーソルを表示させる領域)をmousemoveイベントの対象要素に設定すると、elにhoverした時に、ページの左上から急に移動して表示されることになります。
これだと少しダサいので、windowをmousemoveイベントの対象要素に設定することで、elにhoverせずとも常にマウスカーソルを追随するようになります。この後設定するmouseenter / mouseleaveが発火した時に、より自然にマウスカーソル要素が表示されるようになります。
const mouseEvent = function () {
let el = document.querySelector(".box");
let cursor = document.querySelector(".mouse");
//mousemoveイベントの設定
window.addEventListener("mousemove", function (e) {
});
};
mouseEvent();
引数には「 e 」を設定し、eventオブジェクトを取得するように設定します。ここの引数名はなんでも大丈夫です。
マウスカーソル要素のwidth値を取得
次に、マウスカーソル要素のwidth値を取得していきます。width値の取得は「 getBoundingClientRect().width 」で取得します。
width値を取得する理由は、マウスカーソルをマウスカーソル要素の中央にくるようにするためです。
const mouseEvent = function () {
let el = document.querySelector(".box");
let cursor = document.querySelector(".mouse");
window.addEventListener("mousemove", function (e) {
//マウスカーソル要素のwidth値を取得
let size = cursor.getBoundingClientRect().width;
});
};
mouseEvent();
X座標、Y座標の取得
次に、イベントオブジェクトからマウスカーソルのX座標とY座標を取得します。取得方法は「 引数名.clientX (clientY) 」で取得します。そして先ほど取得したwidth値 / 2した値をマイナスします。
const mouseEvent = function () {
let el = document.querySelector(".box");
let cursor = document.querySelector(".mouse");
window.addEventListener("mousemove", function (e) {
let size = cursor.getBoundingClientRect().width;
//X座標、Y座標の取得
let X = e.clientX - (size / 2);
let Y = e.clientY - (size / 2);
});
};
mouseEvent();
styleの変更
X座標、Y座標の取得ができたら、マウスカーソル要素のX座標、Y座標をtransformを使って設定していきます。今回はtransformを使用していますが、top値、left値を変更しても問題ありません。
const mouseEvent = function () {
let el = document.querySelector(".box");
let cursor = document.querySelector(".mouse");
window.addEventListener("mousemove", function (e) {
let size = cursor.getBoundingClientRect().width;
let X = e.clientX - (size / 2);
let Y = e.clientY - (size / 2);
//styleの変更
cursor.style.transform = "translate(" + X + "px," + Y + "px)";
});
};
mouseEvent();
mouseenterイベントとmouseleaveイベントの設定
最後に、mouseenterイベントとmouseleaveイベントを使用して、マウスカーソル要素のクラス名の付け替えを行います。
基本的にopacityでON/OFFを行っているだけなので、直接styleを操作しても問題ありません。
const mouseEvent = function () {
let el = document.querySelector(".box");
let cursor = document.querySelector(".mouse");
window.addEventListener("mousemove", function (e) {
let size = cursor.getBoundingClientRect().width;
let X = e.clientX - (size / 2);
let Y = e.clientY - (size / 2);
cursor.style.transform = "translate(" + X + "px," + Y + "px)";
});
//mouseenterイベント
el.addEventListener("mouseenter", function () {
cursor.classList.add("show");
});
//mouseleaveイベント
el.addEventListener("mouseleave", function () {
cursor.classList.remove("show");
});
};
mouseEvent();
以上で、実装終了です!
まとめ
今回の応用で、マウスカーソルの形状変化なども実装できると思うので、是非やって見てはいかがでしょうか。
では本日は以上になります。
-
前の記事
【JavaScript】スクロールするとアニメーションしながら要素を表示する方法 2020.09.08
-
次の記事
【JavaScript入門】export / importの使い方 2020.10.24