You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用jQuery或JavaScript实现平滑鼠标光标移动效果?

嘿,这个效果我太熟了!其实它本质上是光标跟随动画,核心是用JavaScript监听鼠标移动,然后让自定义光标元素以平滑的动画追赶真实鼠标位置,而不是直接绑定位置——这就产生了你说的那种略带延迟、顺滑带轨迹的优雅感。下面我一步步拆解实现方法:

实现步骤拆解

1. 隐藏系统默认光标

首先得把浏览器自带的光标藏起来,避免和自定义光标冲突:

body {
  cursor: none; /* 隐藏默认光标 */
}

2. 创建自定义光标元素

在HTML里添加一个用来模拟光标的元素,比如一个简洁的小圆点:

<div class="custom-cursor"></div>

给它加基础样式,确保它能覆盖在所有内容上方且不干扰真实交互:

.custom-cursor {
  position: fixed;
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background-color: #000;
  pointer-events: none; /* 关键!不让自定义光标拦截鼠标事件 */
  z-index: 9999; /* 确保在页面所有元素之上 */
  opacity: 0.8;
}

3. 用JS实现平滑跟随逻辑

核心是缓动函数,让自定义光标逐步逼近真实鼠标位置,而不是瞬间跳转。这里用requestAnimationFrame来实现流畅的动画循环:

// 获取自定义光标元素
const cursor = document.querySelector('.custom-cursor');

// 存储真实鼠标位置和光标当前位置
let mouseX = 0;
let mouseY = 0;
let cursorX = 0;
let cursorY = 0;

// 监听鼠标移动,实时更新真实鼠标坐标
document.addEventListener('mousemove', (e) => {
  mouseX = e.clientX;
  mouseY = e.clientY;
});

// 动画循环:让光标平滑追赶鼠标位置
function animateCursor() {
  // 缓动系数,值越小延迟越高、动画越顺滑(0.1-0.3区间效果最佳)
  const ease = 0.15;
  
  // 计算光标需要移动的距离,逐步逼近真实位置
  cursorX += (mouseX - cursorX) * ease;
  cursorY += (mouseY - cursorY) * ease;
  
  // 更新光标位置
  cursor.style.transform = `translate(${cursorX}px, ${cursorY}px)`;
  
  // 持续执行动画
  requestAnimationFrame(animateCursor);
}

// 启动动画
animateCursor();

4. 进阶优化:添加拖尾效果(可选)

如果想要更贴近你说的“可见轨迹”,可以叠加多个光标元素,给不同元素设置不同的缓动系数,形成拖尾效果:

// 创建拖尾光标元素
const tailCursor = document.createElement('div');
tailCursor.classList.add('custom-cursor', 'cursor-tail');
document.body.appendChild(tailCursor);

// 修改动画函数,同时更新主光标和拖尾
function animateCursor() {
  const mainEase = 0.15;
  const tailEase = 0.08; // 拖尾用更小的系数,延迟更高
  
  // 更新主光标位置
  cursorX += (mouseX - cursorX) * mainEase;
  cursorY += (mouseY - cursorY) * mainEase;
  
  // 更新拖尾光标位置
  let tailX = parseFloat(tailCursor.style.transform.split(',')[0].replace('translate(', '')) || 0;
  let tailY = parseFloat(tailCursor.style.transform.split(',')[1].replace('px)', '')) || 0;
  tailX += (mouseX - tailX) * tailEase;
  tailY += (mouseY - tailY) * tailEase;
  
  // 应用位置变换
  cursor.style.transform = `translate(${cursorX}px, ${cursorY}px)`;
  tailCursor.style.transform = `translate(${tailX}px, ${tailY}px)`;
  
  requestAnimationFrame(animateCursor);
}

给拖尾光标加对应的样式:

.cursor-tail {
  width: 20px;
  height: 20px;
  opacity: 0.3;
  background-color: #000;
}

这种效果的关键就是缓动算法requestAnimationFrame的结合,它让光标移动不是硬邦邦的瞬间到位,而是有一个自然的过渡过程——你说的那种微妙的优雅感,就是这么来的。调整缓动系数就能控制延迟和顺滑程度,完全可以根据自己的需求定制。

内容的提问来源于stack exchange,提问作者user9439693

火山引擎 最新活动