hammerjs是什么

hammer.js初探

  最近觉得自己的进步比较慢了,很有可能是因为中文区的学习和百度的使用极大的限制了自己的视野,所以,以后无论是新技术的学习,还是问题的解决,做到以下几点:

  • 新技术的学习必须通过英文文档,而不是翻译过来的蹩脚的中文文档。
  • 问题的搜寻通过google、通过stackoverflow,如果在知道其局限性的情况下再去百度或者其他方法。 
  • 遇到有问题的词汇就通过Google翻译搜寻,但实际上这时候通过百度也是可以的,因为百度知道的存在也是有用的。

  嗯,第一个完整的英文文档就从hammer.js开始吧! 加油。

     hammer.js官方文档

hammerjs是什么

  hammerjs是一个短小精悍的库,他可以让我们轻松的实现移动端上的手势。 

  hammerjs的两大优势如下:

  1. 为移动端网页添加相关手势。
  2. 去除移动端上的点击事件的300ms延迟。

 

为什么使用hammerjs

  诚然,我们可以通过touch的四个事件等来完成相同的功能,但是不可避免的会比较麻烦,所以既然前人已经造了这个好轮子,为什么不去使用呢? 另外,300ms的延迟有时是我们不需要的,比如,我们在做webapp时,不需要页面的缩放,而300ms的延迟就是为了webapp的缩放而规定的, 因此做webapp时我们就可以使用hammer-time.js来移除300ms的点击延迟。

  另外,hammer.js经过压缩只有7kb,而hammer-time.js经过压缩只有1kb,所以完全不用考虑引入他们之后的性能问题,这简直太棒了!

 

安装

  我们可以直接将hammer.js和hammer-time.js下载下来,然后引入script标签即可。 

  hammer.js

  hammer-time.js

  

 

hammer.js支持的手势

   hammerjs支持下面6种常规的手势,除此之外,我们还可以自定义手势。

  

 

  • rotate 实现旋转效果,如旋转图片
  • pinch/zoom 放大、缩小
  • press  长时间按压触发效果
  • pan 左右滑动
  • tap 点击
  • swipe 滑动

 

 

简单的例子

  使用hammerjs也是非常简单的。

  第一步: 引入hammer.js库。

   <script src="https://hammerjs.github.io/dist/hammer.js"></script>

  第二步:  创建一个用于使用手势的dom元素。

   <div id="myElement">good</div>

  第三步: 创建一个hammer实例。

    var myElement = document.getElementById('myElement');
    var mc = new Hammer(myElement);

  第四步: 添加一个事件,这样我们就可以知道该事件是否被触发了。

 mc.on("panleft panright tap press", function(ev) {
      myElement.textContent = ev.type +" gesture detected.";
  });

  完整的代码如下所示:

 View Code

  这样,当我们使用这些事件时就会触发相应的函数了。 这里有几点需要注意:

  1.  hammer.js依赖于一个dom元素,并需要创建他的实例。
  2.  这里我们直接使用new Hammer()来创建了一个实例,这个实例中就自动帮我们创建了tap、doubletap、pan、swap、press事件,所以我们可以直接通过on来监听这些事件,但是他并没有创建 pinch 事件和 rotate 事件,因为创建这两个事件会将该元素修改为块级元素,当然,我们可以通过设置还使得其支持pinch和rotate事件。如下所示: 
mh.get('pinch').set({ enable: true });
mh.get('rotate').set({ enable: true });

 

 

更多控制

  在上一个例子中,我们使用的时new Hammer创建的hammer实例,它会默认创建包含多种事件的实例(事件中不包括pinch和rotate,因为这会限制元素为块级元素)。 

  这里我们将要介绍的时使用new Hammer.Manager() 创建实例,这样可以自己控制事件,如下所示:

复制代码

 <div id="myElement">good</div>
  <script>
  var myElement = document.getElementById('myElement');
  var mc = new Hammer.Manager(myElement);
  mc.add( new Hammer.Pan({direction: Hammer.DIRECTION_ALL, threshold: 0}) );
  mc.add( new Hammer.Tap({ event: 'quadrupletap', taps: 4 }) );
  mc.on("quadrupletap", function(ev) {
      alert("something");
  });

  mc.on("pan", function(ev) {
    alert("another");
  });

</script>

复制代码

  即通过Hammer.Manager()创建的hammer实例默认是没有任何事件的,接着我们可以使用add来添加事件。 add之后就可以使用on来给该事件绑定函数了。值得注意的是,这里的两个事件一次只能识别一个。 

  那么如果希望可以同时识别,那么应该怎么做呢?

<think>好的,我现在需要帮助用户解决在内网工程中引入Hammer.js手势库的问题,特别是在Vue2项目中的使用。首先,我得回顾一下用户提供的引用内容,看看有没有相关的配置或方法可以借鉴。 用户提到的引用[1]是关于在Vue CLI项目中配置Babel和Element Plus的,这可能涉及到插件配置和按需加载。虽然Hammer.js和Element Plus不同,但配置Babel的部分可能有参考价值,比如如何通过配置文件添加插件。不过Hammer.js本身不需要Babel的特殊处理,所以可能这部分引用用处不大,但需要注意如果内网环境有特殊的Babel配置,可能需要调整。 引用[2]提到在Vue项目中引入Tinymce富文本编辑器,其中涉及到在public/index.html中添加脚本标签。这可能对在内网引入第三方库有帮助,特别是如果Hammer.js需要直接通过script标签引入的话。但通常Hammer.js推荐使用npm安装,但在内网环境中,如果无法访问npm仓库,可能需要手动下载库文件并放到项目中,类似于Tinymce的引入方式。 引用[3]是关于在Vue项目中引入多个iconfont图标库,涉及到CSS文件的引入和配置。这部分可能对资源引入的路径配置有帮助,尤其是在内网环境中如何正确引用本地文件。例如,如果Hammer.js需要手动引入,可能需要类似的方法,将库文件放在特定目录,并在项目中正确引用。 接下来,用户的问题是在内网工程中引入Hammer.js手势库,并如何在Vue2项目中使用。我需要分步骤思考如何实现: 1. **内网环境下如何获取Hammer.js**:用户可能无法直接通过npm安装,所以需要手动下载。需要指导用户如何从官网或其他途径获取hammer.min.js文件,并放置到项目中的静态资源目录,比如public或static文件夹。 2. **引入Hammer.js到Vue2项目**:有两种方式,npm安装或手动引入。在内网中,手动引入更可能,因此需要说明如何通过script标签在index.html中引入,或者在组件中通过import引入本地文件。 3. **Vue2集成Hammer.js的方式**:可能需要创建自定义指令,或者封装成Vue插件,方便全局使用。参考用户之前提供的示例,用户之前使用过Vue.directive来创建指令,可以沿用这种方式。 4. **与Vant组件协同工作**:需要确保手势事件不会与Vant组件(如van-swipe)的原有事件冲突。可能需要事件修饰符,如.stop或.prevent,或者调整Hammer的配置,限制方向以避免冲突。 5. **性能优化和注意事项**:比如事件节流、按需加载、处理移动端的touch-action属性,避免浏览器默认行为干扰手势识别。 在思考过程中,还需要考虑用户可能遇到的问题,比如路径错误、事件冒泡、兼容性问题等,并提供相应的解决方案。同时,结合用户之前的问题,用户对代码示例和配置细节比较关注,所以需要给出具体的代码示例和配置步骤,确保用户能够按步骤操作。 最后,需要验证这些步骤是否在内网环境下可行,比如手动引入库文件是否正确,自定义指令是否生效,以及如何测试手势功能是否正常工作。可能还需要给出常见问题的解决方法,比如手势不触发、方向识别错误等。</think>在内网环境中引入Hammer.js手势库到Vue2项目,可通过以下分步方案实现: ### 一、离线资源获取与部署 #### 1. 获取离线包 ```bash # 外网环境下载(需提前执行) wget https://hammerjs.github.io/dist/hammer.min.js ``` #### 2. 内网工程部署 ``` 项目目录结构 ├── public │ ├── libs │ │ └── hammer.min.js # 手动放置的离线文件 ├── src │ └── directives # 新建目录存放手势指令 ``` ### 二、Vue2项目集成方案 #### 1. 基础引入方式 **方案A:全局脚本引入(推荐)** ```html <!-- public/index.html --> <script src="/libs/hammer.min.js"></script> ``` **方案B:模块化引入(需配置构建工具)** ```javascript // 在vue.config.js中配置 module.exports = { configureWebpack: { externals: { hammerjs: 'Hammer' } } } // 组件内使用 import Hammer from 'hammerjs' ``` #### 2. 创建手势指令 ```javascript // src/directives/hammer.js export default { install(Vue) { Vue.directive('hammer', { inserted(el, binding) { const mc = new Hammer(el) // 配置识别参数 mc.get('pan').set({ direction: Hammer.DIRECTION_ALL }) mc.get('swipe').set({ velocity: 0.5 }) // 动态绑定事件类型 Object.keys(binding.value).forEach(eventName => { mc.on(eventName, binding.value[eventName]) }) } }) } } // main.js注册 import HammerDirective from './directives/hammer' Vue.use(HammerDirective) ``` ### 三、与Vant组件协同实践 #### 1. 嵌套使用示例 ```html <van-swipe v-hammer:swipe.left="handleSwipeLeft" v-hammer:press="handleLongPress" > <van-swipe-item v-for="item in 5" :key="item"> <div class="gesture-area" v-hammer:pinch="handlePinch"> 手势操作区域 </div> </van-swipe-item> </van-swipe> ``` #### 2. 事件冲突解决方案 ```javascript // 在Vant组件容器上限制手势方向 mounted() { const vanSwipeEl = this.$refs.vanSwipe.$el const mc = new Hammer(vanSwipeEl) mc.get('swipe').set({ direction: Hammer.DIRECTION_VERTICAL }) } ``` ### 四、进阶配置技巧 #### 1. 手势识别参数优化 ```javascript const mc = new Hammer(element, { touchAction: 'auto', recognizers: [ [Hammer.Swipe, { direction: Hammer.DIRECTION_HORIZONTAL, threshold: 10, velocity: 0.3 }] ] }) ``` #### 2. 性能优化方案 ```javascript // 手势事件节流处理 import { throttle } from 'lodash' methods: { handleSwipe: throttle(function(e) { console.log('节流处理:', e.direction) }, 100) } ``` ### 五、内网环境特殊处理 #### 1. 离线安装包管理 ```bash # 创建本地npm仓库(需管理员权限) npm set registry http://内网npm镜像地址 npm install --save file:/路径/hammer-2.0.8.tgz ``` #### 2. 构建工具配置 ```javascript // vue.config.js module.exports = { chainWebpack: config => { config.module .rule('hammer') .test(/hammer\.min\.js$/) .use('file-loader') .loader('file-loader') .options({ name: 'libs/[name].[hash:8].[ext]' }) } } ``` ### 六、调试与验证 #### 1. 手势事件监听测试 ```javascript // 在mounted生命周期添加调试代码 mounted() { const testEl = this.$el.querySelector('.gesture-area') const mc = new Hammer(testEl) mc.on('swipe', (e) => { console.log('调试输出:', e) }) } ``` #### 2. 样式冲突处理 ```css /* 修复触摸反馈问题 */ .gesture-container { touch-action: none; user-select: none; } /* Vant组件覆盖 */ .van-swipe-item { touch-action: pan-y !important; } ``` **核心配置要点:** 1. 通过`touch-action`CSS属性控制浏览器默认行为[^2] 2. 使用`recognizers`数组配置多手势识别优先级 3. 动态指令参数实现按需绑定事件类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值