You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决hammer.js与页面正常滚动的冲突问题

解决Hammer.js拖拽绑定导致移动端页面无法滚动的问题

这个问题的核心原因是Hammer.js默认会拦截浏览器的触摸默认行为,包括页面的垂直滚动操作。当你在绑定了drag事件的元素上进行上下滑动时,Hammer.js会优先处理手势事件,直接阻止了浏览器的原生滚动逻辑。

下面给你两个有效的解决方案,你可以根据需求选择:

方案1:通过touchAction配置保留垂直滚动

初始化Hammer实例时,设置touchAction: 'pan-y',明确告诉浏览器我们只需要处理水平方向的拖拽,垂直方向的滚动行为交给浏览器默认处理:

var element = document.getElementById('pinwall-grid');
// 添加touchAction配置,允许垂直滚动
var hammertime = Hammer(element, {
  touchAction: 'pan-y'
}).on("drag", function (event) {
  direction = event.gesture.direction;
  if (direction == 'left') {
    var $meN = $('.pinwall-grid .ctrl a.next');
    if (!$meN.hasClass("nextD")) {
      $meN.trigger('click');
    }
    console.log('left');
  } else if (direction == 'right') {
    var $meP = $('.pinwall-grid .ctrl a.prev');
    if (!$meP.hasClass("prevD")) {
      $meP.trigger('click');
    }
    console.log('right');
  }
  event.gesture.stopDetect();
});

方案2:限制Drag识别器仅响应水平方向

如果你只需要处理左右拖拽,可以直接配置Hammer的drag识别器,让它只监听水平方向的手势,这样垂直滑动不会触发drag事件,自然不会阻止页面滚动:

var element = document.getElementById('pinwall-grid');
var hammertime = Hammer(element);
// 配置drag识别器仅响应水平方向
hammertime.get('drag').set({ direction: Hammer.DIRECTION_HORIZONTAL });

hammertime.on("drag", function (event) {
  direction = event.gesture.direction;
  if (direction == 'left') {
    var $meN = $('.pinwall-grid .ctrl a.next');
    if (!$meN.hasClass("nextD")) {
      $meN.trigger('click');
    }
    console.log('left');
  } else if (direction == 'right') {
    var $meP = $('.pinwall-grid .ctrl a.prev');
    if (!$meP.hasClass("prevD")) {
      $meP.trigger('click');
    }
    console.log('right');
  }
  event.gesture.stopDetect();
});

两种方案都能解决你的问题,个人更推荐方案1,因为它通过标准的touchAction属性明确控制触摸行为,兼容性更好,也更符合现代触摸事件的规范。

内容的提问来源于stack exchange,提问作者user9769696

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:58:10