移动端捏合缩放手势缩放比例计算不准怎么办?
我在给图片查看器加捏合缩放功能时遇到了问题,用两个手指缩放时比例总是忽大忽小,有时候还会突然跳到奇怪的位置。
尝试用touchstart记录初始触点距离,touchmove计算当前距离差值,然后用transform的scale修改元素大小。但发现每次缩放的基准点不对,比如:
let initialDistance = 0;
function onPinchStart(e) {
const touch1 = e.touches[0];
const touch2 = e.touches[1];
initialDistance = Math.hypot(touch2.clientX - touch1.clientX, touch2.clientY - touch1.clientY);
}
function onPinchMove(e) {
const currentDistance = Math.hypot(e.touches[1].clientX - e.touches[0].clientX, e.touches[1].clientY - e.touches[0].clientY);
const scale = currentDistance / initialDistance;
image.style.transform = `scale(${scale})`; // 这里缩放后图片位置偏移严重
}
这样写的话,缩放后图片会偏离手指中间的位置,而且缩放比例好像和手指移动距离没对上。应该怎样正确计算缩放中心和比例系数?
scale的时候加上transform-origin设置缩放中心。我一般直接这么写:后面的
onPinchMove不用改,加个 CSS 就行:先说缩放中心点,不能单纯靠scale来调整,得结合transform-origin或者手动算出中心点偏移量。再说缩放比例,你现在的写法是每次都重新计算scale,会导致连续缩放时比例不对。
我给个改进版代码:
重点改了三处:
1. 加入了对初始缩放值的记录,保证连续缩放时比例正确
2. 引入了缩放中心点的偏移量计算
3. 把translate和scale组合使用,避免图片位置跳动
试试这个版本,应该能解决你的问题。记得绑定touchend清空相关变量,不然再开始新的手势会有残留数据干扰。