移动端触摸拖动元素时位置不准怎么办?
我在给移动端页面做一个图片拖动功能,用touch事件监听。当手指拖动图片时,发现元素移动的位置总是比手指慢半拍,有时候还会出现偏移。试过用touchmove事件获取clientX/Y计算位移,但效果很怪异。
这是我的CSS样式,设置了绝对定位应该可以拖动啊:
.draggable-item {
position: absolute;
width: 150px;
height: 150px;
touch-action: none; /* 尝试阻止默认手势 */
user-select: none;
transition: transform 0.1s;
}
在touchstart里记录了初始坐标,touchmove里用pageX减去初始值设置translate,但移动时元素总比手指位置滞后,特别是在快速滑动时偏差更大。是不是坐标计算方式有问题?
pageX做位移计算,但元素本身可能已经被 transform 移动过了;二是你没有在每次 touchmove 中基于当前 transform 的值做增量更新,而是基于初始值,导致位移跟不上。更优雅的做法是:
在
touchstart里记录初始的 touch 位置和元素当前的 transform 值(translateX 和 translateY),然后在touchmove中根据手指的位移增量,不断更新 transform。这样即使用户快速滑动,也能实时追上手指位置。
示例代码如下:
另外,你 CSS 里加了
transition: transform 0.1s;,这个会导致拖动不跟手,建议在拖动过程中临时去掉过渡效果,释放后再加上。更进一步的优化可以考虑使用
requestAnimationFrame或引入类似transformjs这样的库,让动画更流畅。总之,关键点在于:**不要基于初始位置做位移计算,而是每次基于当前 transform 值。**