拖拽看板时元素位置错乱怎么办?
我在用原生 JS 实现一个看板拖拽功能,但每次拖动卡片后,它总是跑到奇怪的位置,根本不是鼠标放下的地方。我试过用 event.clientX 和 event.clientY 设置位置,但好像没考虑滚动偏移和容器边界。
这是我的拖拽结束处理函数:
function handleDrop(e) {
const card = document.querySelector('.dragging');
card.style.left = e.clientX + 'px';
card.style.top = e.clientY + 'px';
card.classList.remove('dragging');
}
核心问题:当你点击卡片中心时,clientX/clientY 是鼠标的位置,但直接把这个坐标赋给卡片左上角,卡片就会“跳”到鼠标位置,看起来像是位置错乱。
解决办法:在 mousedown 时记录鼠标相对于卡片左上角的偏移量,拖动时用这个偏移量来修正位置。
代码大概这样:
还有个问题:如果你需要把卡片限制在某个容器内,得再算一下容器的边界,用 Math.max/Math.min 限制坐标范围,这块你根据需求加。
性能上这里用 getBoundingClientRect 没问题,因为它本身有缓存机制,触发重排的成本不高。