html・css js・jquery

周りが暗くなくても使える、スポットライトのような光のぼやっとしたマウスストーカー

ある案件でマウスストーカーを実装したのですが、その要件にあうようなマウスストーカーが検索しても出てこなかったので備忘録として残しておきます。

要件としては、

  • あるエリアでのみ表示
  • 美術館のスポットライトのようなボヤっとした光るマウスストーカー
  • 背景色は決まっていて、マウスストーカーの周りを暗くはできない
  • マウスストーカーなので当たり前ですが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.clientXe.clientY) からマウスストーカーの中央位置を計算し、#stkr の位置を更新します。

translate を使って、#stkr がマウスの動きに追従するように動かしています。scale を使って大きさの変化も可能です(現時点では scale = 1 なので変化なし)。

position: fixed で常に画面内の決まった位置に表示され、pointer-events: none によってマウスイベントをブロックしないようにしています。

これらのコードで、#stkr-area にマウスが入ったときに、中心がぼやけた円形のマウスストーカーが出現し、エリア内でマウスカーソルを追従します。エリアを出ると、ストーカーがフェードアウトして消えます。

PCのみを想定しているコードなのでスマホでは動きません。

まとめ

要件にあったマウスストーカーが検索で引っかからなかったので自作した備忘録でした。

ぜひ使ってみてください。

もしわからないことあれば質問ください!

記事にしてほしい・解説してほしい内容のリクエストもお待ちしています。

プログラミングに興味がある方へ

プログラミングに興味があるけど踏み出すのに勇気がいる…
始めてみたけど進め方がわからない、誰かに質問したい…
ネットの教材は高くて手が出ない…
案件を取ってみたけど納品までたどり着けない…

家庭教師の経験を活かし、そんな方のお手伝いをしたいと思っています。

30万もする悪質で高額なコンテンツマーケティングに騙される前に、相談してみませんか?
相談はもちろん無料です。

こちらから、ぜひお気軽にお問い合わせください。
お仕事のご相談や記事にしてほしい内容のリクエストもお待ちしています!

-html・css, js・jquery