拖拽元素时位置偏移抖动怎么优化?

书生シ淑宁 阅读 15

用原生JS做列表项拖拽时,拖动元素总会出现几像素的位置偏移,拖动起来特别卡顿。试过设置position: fixed和实时更新top/left,但拖动结束回弹的时候还是会抖一下。

代码是这样写的:


let shiftX = 0;
function handleDrag(e) {
  const offset = {
    left: e.clientX - shiftX,
    top: e.clientY - shiftY
  };
  draggedItem.style.left = <code>${offset.left}px</code>;
  draggedItem.style.top = <code>${offset.top}px</code>;
}

CSS用了:


.draggable-item {
  position: absolute;
  will-change: transform;
  transition: transform 0s;
}

测试发现当快速拖动到页面边缘时偏移更明显,有没有更好的坐标计算方式或者性能优化方法?

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
慕容星光
用 transform 而不是 left/top 改样式,避免重排。shiftX 应该在 mousedown 时计算一次,别拖动时反复算。

draggedItem.style.transform = translate(${offset.left}px, ${offset.top}px);


CSS 去掉 transition: transform 0s,加上 pointer-events: none 防止拖拽时鼠标移出元素,应该能用。
点赞 5
2026-02-13 00:03