import { useEffect } from 'react'; const CursorDot = () => { useEffect(() => { // 创建小白点元素 const dot = document.createElement('div'); dot.classList.add('cursor-dot'); document.body.appendChild(dot); // 鼠标坐标和缓动目标坐标 let mouse = { x: -100, y: -100 }; // 初始位置在屏幕外 let dotPos = { x: mouse.x, y: mouse.y }; // 监听鼠标移动 const handleMouseMove = (e) => { mouse.x = e.clientX; mouse.y = e.clientY; }; document.addEventListener('mousemove', handleMouseMove); // 监听鼠标悬停在可点击对象上的事件 const handleMouseEnter = () => { dot.classList.add('cursor-dot-hover'); // 添加放大样式 }; const handleMouseLeave = () => { dot.classList.remove('cursor-dot-hover'); // 移除放大样式 }; // 为所有可点击元素和包含 hover 或 group-hover 类名的元素添加事件监听 const clickableElements = document.querySelectorAll( 'a, button, [role="button"], [onclick], [cursor="pointer"], [class*="hover"], [class*="group-hover"]' ); clickableElements.forEach((el) => { el.addEventListener('mouseenter', handleMouseEnter); el.addEventListener('mouseleave', handleMouseLeave); }); // 动画循环:延迟更新小白点位置 const updateDotPosition = () => { const damping = 0.2; // 阻尼系数,值越小延迟越明显 dotPos.x += (mouse.x - dotPos.x) * damping; dotPos.y += (mouse.y - dotPos.y) * damping; // 更新DOM dot.style.left = `${dotPos.x}px`; dot.style.top = `${dotPos.y}px`; requestAnimationFrame(updateDotPosition); }; // 启动动画 updateDotPosition(); // 清理函数 return () => { document.removeEventListener('mousemove', handleMouseMove); clickableElements.forEach((el) => { el.removeEventListener('mouseenter', handleMouseEnter); el.removeEventListener('mouseleave', handleMouseLeave); }); document.body.removeChild(dot); }; }, []); return ( ); }; export default CursorDot;