手势滑动时如何实现平滑的跟随动画效果?

静云 Dev 阅读 30

我在用 Hammer.js 做一个图片滑动组件,手指拖动时想让图片实时跟着手势位置走,但目前动画很卡顿,感觉不是流畅跟随。

我试过直接在 pan 事件里改 transform: translateX(),也试过用 requestAnimationFrame 包裹,但还是不够顺滑,是不是哪里写错了?

const hammer = new Hammer(element);
hammer.on('pan', (e) => {
  element.style.transform = <code>translateX(${e.deltaX}px)</code>;
});
我来解答 赞 7 收藏
二维码
手机扫码查看
1 条解答
ლ红芹
ლ红芹 Lv1
直接在 pan 事件里改 transform 虽然看起来简单,但确实可能会导致性能问题。你提到已经尝试了用 requestAnimationFrame 包裹,这是个好方向。不过可能还需要优化一下。你可以试试下面这种方式:

首先确保你在处理事件时避免了不必要的计算和 DOM 操作。然后可以这样写:

let isAnimating = false;
const hammer = new Hammer(element);

hammer.on('pan', (e) => {
if (!isAnimating) {
isAnimating = true;
requestAnimationFrame(() => {
// 这里使用 e.deltaX 直接更新 transform 是没问题的,但是要注意防止注入,虽然在这个上下文中不太可能发生,但养成好习惯总是好的
element.style.transform = translateX(${e.deltaX}px);
isAnimating = false;
});
}
});


这样做可以让浏览器在下一帧渲染之前只处理一次变换,减少重绘重排的次数。另外,确保你的 element 在 CSS 中设置了 will-change: transform; 这样也能帮助浏览器更好地优化渲染过程。希望这能解决你的卡顿问题。
点赞
2026-03-22 22:01