Web Design 演習Ⅱ - 2024 | Logics

Story Image

HOVER

HTML

基本のHTML構造

                <div id="mouse-stalker" class="mouse-stalker">
                    <div id="mouse-stalker-item" class="mouse-stalker-item"></div>
                </div>

CSS

CSSファイルの内容

                .mouse-stalker {
                    position: fixed;
                    top: 0;
                    left: 0;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    width: 1px;
                    height: 1px;
                    z-index: 9999;
                    pointer-events: none;
                    mix-blend-mode: exclusion;
                }
                
                .mouse-stalker-item {
                    width: 50px;
                    height: 50px;
                    border-radius: 50%;
                    background-color: #666666;
                    flex-shrink: 0;
                }
            

Javascript

Javascriptファイルの内容

                export default class MouseStalker {
                    static exec() {
                      this.init();
                      if (!this.mouseStalker || !this.mouseStalkerCircle) return;
                      document.addEventListener("mousemove", (e) => {
                        this.mousePosition.x = e.clientX;
                        this.mousePosition.y = e.clientY;
                      });
                      this.mouseStalkerHovers.forEach((element) => {
                        element.addEventListener("mouseover", () => {
                          this.mouseStalkerCircle.classList.add(
                            "mouse-stalker-item-circle-active"
                          );
                        });
                        element.addEventListener("mouseleave", () => {
                          this.mouseStalkerCircle.classList.remove(
                            "mouse-stalker-item-circle-active"
                          );
                        });
                      });
                      this.update();
                    }
                  
                    static init() {
                      this.mouseStalker = document.querySelector(".mouse-stalker-item");
                      this.mouseStalkerCircle = document.querySelector(
                        ".mouse-stalker-item-circle"
                      );
                      this.mouseStalkerHovers = document.querySelectorAll(".mouse-stalker-hover");
                      this.mousePosition = { x: 0, y: 0 };
                      this.stalkerPosition = { x: 0, y: 0 };
                    }
                  
                    static update() {
                      this.stalkerPosition.x +=
                        (this.mousePosition.x - this.stalkerPosition.x) * 0.1;
                      this.stalkerPosition.y +=
                        (this.mousePosition.y - this.stalkerPosition.y) * 0.1;
                  
                      let x = Math.round(this.stalkerPosition.x * 10) / 10;
                      let y = Math.round(this.stalkerPosition.y * 10) / 10;
                  
                      this.mouseStalker.style.transform = `translate3d(${x}px,${y}px,0)`;
                      window.requestAnimationFrame(this.update.bind(this));
                    }
                  }