当前位置:首页 > 行业动态 > 正文

hammer.js

Hammer.js是轻量级跨平台JavaScript库,专注处理触摸手势(点击/滑动/缩放等),兼容移动端与桌面端,可识别复杂手势组合,简化开发者事件监听逻辑,提升

Hammer.js 简介

Hammer.js 是一个轻量级的 JavaScript 库,专为处理移动设备上的触摸手势而设计,它支持多种常见的手势操作(如点击、滑动、缩放、旋转等),并能兼容不同设备和浏览器,其核心目标是简化开发者在 Web 应用中实现复杂手势交互的过程,同时提供高度可定制的配置选项。


Hammer.js 的核心功能

手势类型 触发条件 典型应用场景
tap 轻点屏幕后快速抬起 替代鼠标点击,触发按钮或链接
doubletap 连续两次轻点屏幕 双击放大图片或执行二次确认操作
pan 单指滑动(横向或纵向) 滚动页面、拖拽元素
swipe 单指快速滑动(超过阈值) 滑动删除、轮播图切换
pinch 双指收缩或扩张 缩放图片、地图
rotate 双指绕某一点旋转 旋转图像、3D 模型操控
press 持续按压(需支持压感的设备) 长按菜单、压力感应绘图
hold 长按屏幕超过指定时间 触发上下文菜单、预览模式

关键特性:

  1. 多手势识别:支持同时监听多种手势,并区分主次优先级。
  2. 惯性与动量:可模拟物理效果(如快速滑动后的惯性滚动)。
  3. 自定义手势:允许开发者定义复杂手势(如三指滑动+旋转)。
  4. 事件防抖:避免手势冲突(panswipe 同时触发)。
  5. 压力敏感支持:兼容 Pencil 或压感笔设备(如 iPad)。

快速上手指南

安装方式

  • 直接引入脚本
    <script src="https://hammerjs.github.io/dist/hammer.min.js"></script>
  • 通过 npm 安装
    npm install hammerjs
  • 模块化导入
    import Hammer from 'hammerjs';

基础用法示例

<div id="target" style="width: 200px; height: 200px; background: #ccc;">
  触摸区域
</div>
<script>
  const target = document.getElementById('target');
  const hammer = new Hammer(target);
  // 监听 tap 事件
  hammer.on('tap', function(e) {
    alert('Tapped!');
  });
  // 监听 swipe 事件
  hammer.on('swipe', function(e) {
    console.log('Swiped! Direction: ' + e.direction);
  });
</script>

配置选项

选项 默认值 说明
recognizers 全部手势 指定需要启用的手势列表(如仅启用 pan
threshold 0 手势触发的最小移动距离(像素)
velocity 1 手势触发的最小速度阈值
inputClass (自动检测) 强制指定输入类型(如 touchmouse

高级特性与场景

自定义手势识别

const customRecognizer = new Hammer.Recognizer({
  eventType: Hammer.EVENT_TYPE_TOUCH,
  requireFailure: [new Hammer.Pan()], // 确保 pan 手势未触发时才匹配
  recognizeWith: function(otherRecognizer) {
    // 自定义逻辑判断是否与其他手势冲突
    return !(otherRecognizer instanceof Hammer.Pan);
  }
});
customRecognizer.callback = function(event) {
  console.log('Custom Gesture Detected!');
};
hammer.add(customRecognizer);

惯性与动量模拟

hammer.on('panend', function(e) {
  const velocity = e.velocityX > 0.5 || e.velocityY > 0.5; // 判断是否有惯性
  if (velocity) {
    console.log('惯性滑动触发!');
    // 根据速度计算动画效果
  }
});

压力敏感支持(需设备支持)

hammer.on('press', function(e) {
  const pressure = e.pointerEvent.pressure; // 压力值(0~1)
  if (pressure > 0.8) {
    console.log('高压检测!');
  }
});

兼容性与性能优化

浏览器支持

浏览器 版本要求 备注
Chrome v31+ 推荐使用最新版
Firefox v36+
Safari v9+
Edge v12+
Mobile Safari iOS 8+
Android Browser Android 4.4+

性能优化建议

  • 按需加载手势:禁用不必要的手势以减少计算开销。
  • 事件节流:对高频触发的事件(如 pan)使用节流函数。
  • DOM 优化:将手势绑定到父容器而非深层子元素。
  • 防抖处理:避免手势冲突导致的重复触发。

Hammer.js 的优缺点分析

优点 缺点
轻量级(核心库仅 ~8KB) 依赖浏览器 API,低版本 IE 不兼容
支持链式调用与 Promise 复杂手势需手动配置优先级
活跃维护与社区支持 移动端优化需额外适配(如 Passive Event)
丰富的扩展插件生态

实际应用场景

  1. 图片编辑器:通过 pinch 缩放、rotate 旋转调整图片。
  2. 地图交互pan 平移地图,doubletap 重置缩放。
  3. 游戏控制swipe 滑动攻击,press 蓄力技能。
  4. 电商应用pan 横向滑动查看商品详情,tap 加入购物车。
  5. 在线教育press 启动白板绘图,rotate 调整画布方向。

实际案例:电商商品预览交互

<div id="product-view" style="width: 300px; height: 400px;">
  <img src="product.jpg" alt="Product" />
</div>
<script>
  const productView = document.getElementById('product-view');
  const hammer = new Hammer(productView);
  // 双指缩放图片
  hammer.get('pinch').set({ enable: true });
  hammer.on('pinchmove', function(e) {
    productView.style.transform = `scale(${e.scale})`;
  });
  // 双击重置缩放
  hammer.on('doubletap', function(e) {
    productView.style.transform = 'scale(1)';
  });
</script>

相关问答FAQs

Q1:Hammer.js 与原生 touch 事件有什么区别?

A1:原生 touch 事件需手动计算坐标、速度和手势状态,而 Hammer.js 提供了标准化的手势识别和回调机制,支持多手势组合与冲突处理,大幅降低开发复杂度,原生实现 swipe 需判断触摸起点、终点和速度,而 Hammer.js 可直接通过 swipe 事件获取方向和距离。

Q2:如何处理 Hammer.js 的性能瓶颈?

A2:可通过以下方式优化:

  1. 按需启用手势:仅开启业务需要的手势(如禁用 rotate)。
  2. 事件节流:对高频事件(如 pan)使用 throttle
  3. 减少DOM层级:将手势绑定到顶层容器而非深层元素。
  4. 关闭被动监听器:在移动端设置 { passive: true } 避免
0