ある案件でマウスストーカーを実装したのですが、その要件にあうようなマウスストーカーが検索しても出てこなかったので備忘録として残しておきます。
要件としては、
- あるエリアでのみ表示
- 美術館のスポットライトのようなボヤっとした光るマウスストーカー
- 背景色は決まっていて、マウスストーカーの周りを暗くはできない
- マウスストーカーなので当たり前ですがPCのみ
という感じです。
周りが暗くなっても良いのであれば、下記が参考になると思います。
https://qiita.com/redrabbit1104/items/0bace17aeaa1cff46127
では早速コードをどうぞ。
まずはコードから。
See the Pen Untitled by 東野江里 (@anyxfbuk-the-scripter) on CodePen.
解説
html
<div id="stkr-area">
<div id="stkr"></div>
<h1 style="color: #fff;">ここがマウスストーカー表示エリア</h1>
</div>
#stkr-area
: マウスストーカーが表示されるエリアで、この範囲内でのみエフェクトが機能します。
#stkr
: マウスストーカーそのもので、カーソルの動きに応じて追従する部分です。
css
#stkr-area {
background-color: #000;
position: relative;
/* これは不要コード */
height: 200vh;
display: flex;
align-items: center;
justify-content: center;
/* 不要コードここまで */
}
#stkr {
position: absolute;
top: 0;
left: 0;
background: radial-gradient(circle at center, rgba(255, 252, 246, 0.35) 0%, rgba(255, 252, 246, 0) 70%);
transition: .2s;
transition-timing-function: ease-out;
z-index: 30;
width: 400px;
height: 400px;
}
#stkr-area
: 背景が黒のエリア。position: relative
により、エリア内で #stkr
を絶対位置で動かすための基準になります。
不要コードは今回のための見た目調整コードなので、実装の際は削除してください。
#stkr
: 初期状態では絶対位置で配置されていますが、JavaScriptで動的に位置を変えてマウスを追いかける仕組みです。
背景が radial-gradient
(放射状グラデーション)になっていて、薄い光が中心に広がるようなデザインで、これがスポットライトっぽくなっています。rgbaの部分で色や透明度は調整できます。transition
により、動きが滑らかに変化するように設定されています。
jQuery
$(document).ready(function(){
const mouseStalker = $("#stkr");
const mouseStalkerArea = $("#stkr-area");
let scale = 1;
// 初期状態ではマウスストーカーを非表示にする
mouseStalker.hide();
ページが読み込まれた時点で、#stkr
(マウスストーカー)は隠れた状態になります(.hide()
)。
mouseStalkerArea.on("mouseenter", function() {
// エリアに入ったらマウスストーカーをフェードインで表示する
mouseStalker.stop(true, true).fadeIn(300);
}).on("mouseleave", function() {
// エリアを出たらマウスストーカーをフェードアウトで非表示にする
mouseStalker.stop(true, true).fadeOut(300);
}).on("mousemove", function(e) {
// マウスストーカーのサイズを取得
let stalkerWidth = mouseStalker.outerWidth();
let stalkerHeight = mouseStalker.outerHeight();
#stkr-area
にマウスが入ったとき (mouseenter
イベント) に #stkr
がフェードインで表示され、出たとき (mouseleave
イベント) にはフェードアウトで非表示になります。
mousemove
イベントでは、マウスがエリア内で動いたときにマウスストーカーの位置を更新します。
// エリア内でのみマウスストーカーを動かす
let x = e.clientX - (stalkerWidth / 2);
let y = e.clientY - (stalkerHeight / 2);
mouseStalker.css({
"transform": "translate(" + x + "px," + y + "px) scale(" + scale + ")",
"position": "fixed",
"pointer-events": "none"
});
});
});
マウスカーソルの位置 (e.clientX
と e.clientY
) からマウスストーカーの中央位置を計算し、#stkr
の位置を更新します。
translate
を使って、#stkr
がマウスの動きに追従するように動かしています。scale
を使って大きさの変化も可能です(現時点では scale = 1
なので変化なし)。
position: fixed
で常に画面内の決まった位置に表示され、pointer-events: none
によってマウスイベントをブロックしないようにしています。
これらのコードで、#stkr-area
にマウスが入ったときに、中心がぼやけた円形のマウスストーカーが出現し、エリア内でマウスカーソルを追従します。エリアを出ると、ストーカーがフェードアウトして消えます。
PCのみを想定しているコードなのでスマホでは動きません。
まとめ
要件にあったマウスストーカーが検索で引っかからなかったので自作した備忘録でした。
ぜひ使ってみてください。
もしわからないことあれば質問ください!
記事にしてほしい・解説してほしい内容のリクエストもお待ちしています。