要素に入ったときにポインターを任意の色の丸に変更してみる(備忘録)

今回は、要素に入ったときにポインターを任意の色の丸に変更してみる実装をしてみました。丸の大きさや色、形はCSSで任意に変更できるようになっています。

個人的には、ホバー時や要素に入ったときにポインターが変わるのは好きではありませんが、結構見かけるため備忘録として残しています。

まずは基本的なパターンになりますが、応用編はまた後日記事にしていけたらと思います。

HTMLの記述について

<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>要素に入ったときにポインターを任意の色の丸に変更してみる(備忘録)</title>
  <link rel="stylesheet" href="../reset.css">
  <link rel="stylesheet" href="./style.css">
</head>

<body>
  <main>
    <div class="pointer-area">
    </div>
  </main>
  <script src="./style.js"></script>
</body>

</html>

HTMLはpointer-areaの要素を用意するためdivタグを設定しているだけです。

CSSの記述について

@charset "utf-8";

/* ==========================
  初期設定
========================== */
*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

body {
  position: relative;
  word-wrap: break-word;
}

img {
  width: 100%;
  vertical-align: bottom;
}

/* レイアウト設定 */
main {
  margin: 80px 0;
}

.pointer-area {
  background-color: #c3512f;
  height: 400px;
  cursor: none;
}

.custom-cursor {
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background-color: #fff;
  position: fixed;
  pointer-events: none;
  display: none;
}

custom-cursorは、JavaScript側でclassが追加される設定になっています。

custom-cursorでポインタの見た目を調整できるため、CSSをあてて設定していきます。

positionをfixedにしているのは、要素内でポインターが動いたときに、ポインターの位置にcustom-cursorで設定した白い丸の位置を合わせるために設定しています。JavaScript側でleftとtopの位置を動かしています。

JavaScriptの記述について

"use strict";

// DOMの読み込み完了後にスクリプトを実行します
document.addEventListener("DOMContentLoaded", () => {
  // .pointer-areaクラスを持つ要素を選択します
  const pointerArea = document.querySelector(".pointer-area");
  // カスタムカーソル用のdiv要素を作成します
  const cursor = document.createElement("div");
  // 作成したdivに'custom-cursor'クラスを追加します
  cursor.classList.add("custom-cursor");
  // 作成したdivをbodyの子要素として追加します
  document.body.appendChild(cursor);

  // pointerAreaにマウスが入った時の処理
  pointerArea.addEventListener("mouseenter", () => {
    cursor.style.display = "block"; // カスタムカーソルを表示します
  });

  // pointerArea上でマウスが動いた時の処理
  pointerArea.addEventListener("mousemove", (e) => {
    // カスタムカーソルの位置をマウスの位置に合わせます
    cursor.style.left = `${e.clientX}px`;
    cursor.style.top = `${e.clientY}px`;
  });

  // pointerAreaからマウスが出た時の処理
  pointerArea.addEventListener("mouseleave", () => {
    cursor.style.display = "none"; // カスタムカーソルを非表示にします
  });
});

詳細はコメントアウトで記載しているとおりです。

bodyの子要素にcustom-cursorのclassがついたdivタグを追加し、要素に入ったとき、動いているとき、出たときで処理をしています。

clientXやclientYについては、MDNで詳細をご確認ください。

以上になります。次回は応用的なものを紹介していけたらと思います。