手势缩放动画在触摸结束后自动回弹怎么办?
折腾了一下午移动端手势缩放,用CSS的transform和transition写了个缩放动画。但发现当手指离开屏幕后,元素会自动回弹到原始大小,该怎么让它保持最终状态呢?
我尝试过在touchend时用JavaScript修改className,但动画过程中transform值好像没被记录下来。代码大概是这样的:
.box {
touch-action: none;
transition: transform 0.3s;
}
.box.scale {
transform: scale(1.2);
}
现在的问题是拖动缩放时动画很流畅,但手指松开瞬间就会恢复原状。有没有办法让最终的transform值保持住,同时保留动画效果?
根本原因是:拖动过程中动态计算的 transform 值,在手指离开时没有被"固化"下来,而是被 CSS transition 动画逆向撤回了。
解决方法很简单——在 touchend 时把当前 transform 值保存下来,用内联样式覆盖掉:
关键点就两个:
1. 拖动过程中把 transition 设成 none,这样手指移动时 transform 可以实时更新,不会有卡顿
2. touchend 时把当前的 scale 值重新赋给 style.transform,这样元素会从当前位置"动画"到最终位置,而不是弹回去
如果你用的是 pinch-zoom 之类的库,也是同理——在 touchend 那一刻把计算出的最终 transform 矩阵写死到元素上,别让它自己"恢复"。
另外提醒一下,calculateScale 的逻辑要做好边界限制,防止 scale 变成负数或者过大导致渲染异常。
关键点在于touchend的时候,把当前的缩放比例存下来,然后直接设置到style上。这样即使transition生效,也是基于你设置的最终状态进行动画,不会跳回原始大小。
记得把你的CSS稍微调整一下,去掉那个固定的scale类,只保留基础样式:
这样改完就稳了,我刚试过没问题。别忘了处理一下边界情况,比如最小最大缩放比例,不然用户可能会缩到看不见或者放大到天上去,那就尴尬了。