Feylo

デモを見るコードを見る

リンクをホバーしたら大きくなるマウスストーカーの実装方法

マウスストーカー
リンクをホバーしたら大きくなるマウスストーカーの実装方法

素のJavaScriptでリンクをホバーしたら大きくなるマウスストーカーを実装する方法を紹介します。また、ホバーしたリンクの種類によってマウスストーカーの色も変化するような実装にします。

    実装のポイント
  • mouseenter,mouseleaveでリンク内に入ったかを判断。
  • マウスストーカーの色はdata属性で管理

実装の考え方

リンクをホバーしたかを判断するために、JavaScriptのmouseentermouseleaveイベントを利用します。mouseenterでリンク内に入ったら、scaleプロパティで大きくなるようにします。mouseleaveでリンク外に出たら、scaleプロパティを1にし、元の大きさに戻します。

リンクをホバーした際のマウスストーカーの色は、HTML内のリンクにdata属性(data-color)を付与して色を管理しホバーしたらその色に変化するようにします。

マウスストーカー自体の解説はしないので、基本的なマウスストーカーの実装方法を知りたい方は下記を確認してください

実装方法

それでは実際に実装していきましょう。
まずはHTMLになります。

HTML

HTML
<div class="container">
  <div class="grid">
    <ul class="links">
      <li><a href="#" data-color="green">緑リンク01</a></li>
    </ul>
    <!-- リンク続く -->
  </div>
  <div class="mouse-cursor"></div>
</div>

前回同様にマウスストーカーは、mouse-cursorというクラスを付与して作成します。
また先述の通り、リンクをホバーした際のマウスストーカーの色は、HTML内のリンクにdata属性(data-color)を付与しています。

今回のデモでは、green,blue,yellow,orangeの4色を用意しています。

CSS

マウスストーカーに関係があるCSSは下記のようになります。

CSS
:root {
  --green: #53C197;
  --blue: #7A9AC9;
  --yellow: #F3E84D;
  --orange: #F0A15E;
}

.mouse-cursor {
  --mouse-cursor-color: #000;
  position: fixed;
  top: 0;
  left: 0;
  width: 20px;
  aspect-ratio: 1;
  border-radius: 50%;
  opacity: 0.8;
  background-color: var(--mouse-cursor-color);
  pointer-events: none;
  translate: -50% -50%;
  transition-property: background-color, scale;
  transition-duration: 0.3s;
}

ホバーした際の色は4色必要なので、rootに変数を定義しておきます。マウスストーカーの色は--mouse-cursor-colorという変数で管理します。

マウスストーカーのCSSは前回と変更しています。その理由として、scaleで大きくした際に中心から大きくなるようにしたいため、初期状態ではtranslate: -50% -50%として位置しており、JavaScriptではtopleftを変更することでマウスストーカーの位置を更新します。

急な変化にならないように、transition-propertybackground-colorscaleを指定しておくのを忘れないようにしましょう。

JavaScript

最後にJavaScriptになります。前回のマウスストーカーと実装が異なるので、マウスストーカー部分のコードを見ていきましょう。

マウスストーカーの実装

JavaScript
const mouseCursor = document.querySelector('.mouse-cursor');

document.addEventListener('mousemove', (e) => {
  const mouseX = e.clientX;
  const mouseY = e.clientY;

  mouseCursor.style.left = `${mouseX}px`;
  mouseCursor.style.top = `${mouseY}px`;
});

先述の通りに、scaleで大きくした際に、中心から大きくするため、lefttopを変更することでマウスストーカーの位置を更新します。続いて、リンクをホバーした際のコードを実装しましょう。

リンクをホバーしたら、色と大きさを変更する

JavaScript
const links = document.querySelectorAll('a');

links.forEach(link => {
  // リンク内にマウスが入った時の処理
  link.addEventListener('mouseenter', () => {
    const color = link.dataset.color;
    mouseCursor.style.setProperty('--mouse-cursor-color', `var(--${color})`);
    mouseCursor.style.scale = '2';
  });

  // リンクからマウスが離れた時の処理
  link.addEventListener('mouseleave', () => {
    mouseCursor.style.setProperty('--mouse-cursor-color', '#000');
    mouseCursor.style.scale = '1';
  });
});

ここでは簡易的に、aタグを全て取得しています。取得したリンクをforEachで回して、それぞれmouseenterだったらリンク内に入った処理、mouseleaveだったらリンクから出た処理を記述しています。

mouseenterの場合は、link.dataset.colorでリンクのデータ属性から色を取得し、mouseCursor.style.setPropertyでマウスストーカーの色(--mouse-cursor-color)を変更しています。そして、mouseCursor.style.scaleでマウスストーカーの大きさを2倍にしています。

mouseleaveの場合は、マウスストーカーの色と大きさを元に戻しています。

Share