You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决跟随鼠标的图片初始从左上角跳至鼠标位置的问题?

解决鼠标跟随图片首次加载/刷新时的跳变问题

问题:实现了图片跟随鼠标的功能,但页面刷新或首次移动鼠标时,图片会先显示在左上角,随后跳至鼠标位置,需要消除这个过程,让图片直接从鼠标下方显示。

问题原因

当前代码里,元素初始定位在left:0, top:0,首次触发mousemove时,是从这个初始位置通过动画过渡到鼠标位置,同时设置opacity:1,所以会出现先显示左上角再跳转的视觉断层。

解决方法

给首次鼠标移动加个标记,第一次触发时直接把元素定位到鼠标位置(不用动画),之后再执行平滑跟随的动画,彻底跳过从左上角出发的过程。

以下是修改后的完整代码:

HTML

<div id="mouse_trail">
  <img src="https://picsum.photos/200/300" />
</div>

CSS

#mouse_trail {
  height: 20px;
  width: 20px;
  position: fixed;
  left: 0px;
  top: 0px;
  z-index: -1;
  opacity: 0;
  transition: opacity 500ms ease;
}

#mouse_trail img {
  position: absolute;
  height: 80px;
  width: 80px;
  animation: rotate 2.5s infinite linear;
}

@keyframes rotate {
  100% {
    transform: rotate(360deg);
  }
}

JavaScript

const mouse_trail = document.getElementById('mouse_trail');
let isFirstMove = true; // 标记是否为首次鼠标移动

window.onmousemove = e => {
  const x = e.clientX - mouse_trail.offsetWidth / 2,
        y = e.clientY - mouse_trail.offsetHeight / 2;

  if (isFirstMove) {
    // 首次移动:直接定位到鼠标位置,无动画
    mouse_trail.style.transform = `translate(${x}px, ${y}px)`;
    mouse_trail.style.opacity = 1;
    isFirstMove = false;
    return;
  }

  // 非首次移动:执行平滑跟随动画
  const keyframes = {
    transform: `translate(${x}px, ${y}px)`
  }

  mouse_trail.animate(keyframes, {
    duration: 800,
    fill: 'forwards'
  });
}

可选优化

如果希望页面加载后,即使鼠标没动,元素也能定位到当前鼠标位置(比如鼠标已经在页面内),可以在页面加载时主动触发一次鼠标移动事件:

window.addEventListener('load', () => {
  const defaultEvent = new MouseEvent('mousemove', {
    clientX: window.innerWidth / 2,
    clientY: window.innerHeight / 2
  });
  window.dispatchEvent(defaultEvent);
});

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:10:34