移动端捏合缩放手势怎么监听才靠谱?
我在做移动端图片预览功能,想支持双指捏合缩放,但 touchstart 和 touchmove 事件里判断距离变化总是不准,有时候还会和页面滚动冲突。
试过用 event.touches.length === 2 判断双指,然后算两点间距离,但缩放比例算出来很飘,而且偶尔会触发浏览器默认的页面缩放。有没有更稳的做法?
function handleTouchMove(e) {
if (e.touches.length === 2) {
const dx = e.touches[0].pageX - e.touches[1].pageX;
const dy = e.touches[0].pageY - e.touches[1].pageY;
const distance = Math.sqrt(dx * dx + dy * dy);
// 然后拿 distance / initialDistance 当缩放比例...
}
}
gesturestartgesturechangegestureend这三个手势事件,专为捏合缩放设计的,浏览器底层已经帮你处理了双指识别和缩放比例,比自己算稳定多了。关键点就三步:
1. 在
gesturestart里记录初始缩放比例(一般是1),并阻止默认行为防止浏览器自己缩放页面2. 在
gesturechange里直接用event.scale就是当前缩放倍数,拿它乘以初始值就行3. 最后记得在
touchmove里加个e.preventDefault()防止滚动干扰(只在双指时)代码直接贴这个:
注意
passive: false得加上,不然preventDefault不生效,滚动挡不住。另外别忘了在 meta 里关掉浏览器默认缩放:
这样基本能覆盖主流安卓和iOS了,我线上项目就是这么用的,稳。