移动端捏合缩放怎么实现才不会冲突?
我在做一个图片查看器,想支持双指捏合缩放,但加上手势后和页面本身的滚动、双击缩放老是冲突。
试过用 touch-action: none 禁用默认行为,结果整个页面都不能滑动了。有没有办法只禁用缩放相关的默认手势,保留其他交互?
现在监听的是 gesturechange 事件,但好像在部分安卓机上根本不触发,是不是这个 API 已经被废弃了?
element.addEventListener('gesturechange', (e) => {
e.preventDefault();
scale = e.scale;
// 更新 transform
});
gesturechange了,这玩意儿确实废了,Chrome 里早就不支持了,尤其安卓机上基本没戏。现在标准做法是自己算双指距离,用
touchstart记初始距离,touchmove算实时距离,再结合touchend做最终处理。关键点有三个:
第一,别用
touch-action: none一把梭,这样连滚动都没了。应该只在缩放容器上用touch-action: none,比如你图片外层包个<div class="viewer">,就只给它加touch-action: none,其他区域保持默认,这样页面滚动不受影响。第二,监听
touch事件,手动计算缩放比例。复制这个核心代码:第三,记得给容器加
overflow: hidden和position: relative,防止缩放时内容溢出乱飘。这样写完,页面滚动照常,只在你缩放区域里双指捏合生效,基本所有现代安卓/iOS 机都扛得住。
顺带一提,双击缩放也别指望浏览器默认行为,自己用
dblclick+click时间差判断更稳。