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

JS实现跟随鼠标移动的方块——offsetX/offsetY偏移异常问题

解决鼠标移动时方块回到初始位置的问题

我来帮你分析下问题所在,以及如何修复:

问题根源

你当前使用e.offsetX和e.offsetY作为translate()的偏移值,但translate()是基于方块自身的初始位置进行偏移的。也就是说,每次鼠标移动时,都会把方块从它的原始左上角位置,重新偏移e.offsetX和e.offsetY像素,而不是让方块从当前位置跟随鼠标移动。这就导致了看起来方块“回到初始位置”再重新定位的问题。

另外,如果你期望方块的中心跟随鼠标,直接用offsetX/offsetY还会让方块的左上角对准鼠标,视觉上也不符合“跟随”的预期。

修复方案

这里提供两种常用的解决方法,你可以根据需求选择:

方法1:使用绝对定位(推荐,逻辑更直观)

通过给容器设置相对定位,方块设置绝对定位,直接控制方块的left和top属性,让它的中心对准鼠标位置:

修改后的CSS:

.container {
  background-color: red;
  height: 200px;
  width: 400px;
  position: relative; /* 让容器成为绝对定位元素的参考容器 */
}
.square {
  background-color: blue;
  height: 50px;
  width: 50px;
  position: absolute; /* 开启绝对定位 */
}

修改后的JS:

let square = document.querySelector('.square')
let container = document.querySelector('.container')
container.addEventListener('mousemove', movingSquare);

function movingSquare(e) {
  // 减去方块宽高的一半,让鼠标落在方块中心
  const targetLeft = e.offsetX - square.offsetWidth / 2;
  const targetTop = e.offsetY - square.offsetHeight / 2;
  
  // 设置方块的定位
  square.style.left = `${targetLeft}px`;
  square.style.top = `${targetTop}px`;
}

方法2:继续使用translate()

如果坚持用transform: translate(),需要计算出方块左上角相对于容器左上角的正确偏移量(同样让中心对准鼠标):

修改后的JS(CSS不需要改动):

let square = document.querySelector('.square')
let container = document.querySelector('.container')
container.addEventListener('mousemove', movingSquare);

function movingSquare(e) {
  // 计算偏移量:鼠标位置减去方块自身半宽/半高
  const x = e.offsetX - square.offsetWidth / 2;
  const y = e.offsetY - square.offsetHeight / 2;
  
  // 更新transform属性
  square.style.transform = `translate(${x}px, ${y}px)`;
}

这两种方法都能让方块平滑跟随鼠标移动,不会出现“回到初始位置”的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:02:29