Hammer.js #
hammerjs 在拙劣的搜索之后,才发现了这个库。虽然有 一个 Vue 的封装库 vue-touch,但是它年久失修,而且其组件名称v-touch
与 Vuetify 的某组件重名。。。
使用 #
文档非常简单,提几点需要注意的地方
Vue 引用 DOM 元素 #
配合$ref
食用更佳
<template>
<div ref="container">
</div>
</template>
<script>
export default {
mounted() {
let ele = this.$refs.container
}
}
</script>
Vue
做主人 #
通过new Hammer(myElement, myOptions)
创建的事件监听默认开启了tap
, doubletap
, press
, horizontal pan
和 swipe
,并且加上了禁用了的pinch
和 rotate
。
所以使用new Hammer.Manager(myElement, myOptions)
更加舒服。
理解get
#
为什么用Hammer
创建的对象可以随便get
然后设置enable: false
,而Hammer.Manager
出来是null
呢?
如上所述,Hammer
创建的默认加上了全套事件监听,而Hammer.Manager
出来是白板一块,自然不能get
没有加入的事件了。
大坑一个 #
文档里的确说了pinch
和 rotate
会阻塞元素的事件响应,但没想到有点愚蠢和暴力:启用了pinch
之后,scroll
就不行了?!一个手指的滑动和两个手指的缩放有关系?
还好找到了解决方案:https://stackoverflow.com/a/27550784/8810271
由于hammerjs
2.x 版本不允许绑定touchstart
and touchend
,可以直接绑 DOM 元素上啊!
于是解决如下:
<template>
<div ref="container" class="container" @touchstart="touchStart" @touchend="touchEnd">
</div>
</template>
<script>
import Hammer from 'hammerjs'
let originZoom
export default {
mounted() {
hammer = new Hammer.Manager(this.$refs.container)
hammer.add(new Hammer.Swipe({ direction: Hammer.DIRECTION_HORIZONTAL }))
hammer.add(new Hammer.Pinch({ enable: false }))
hammer.on('pinchstart', this.pinchStart)
hammer.on('pinchmove', this.pinchMove)
},
methods: {
pinchStart(e) {
originZoom = this.zoom
},
pinchMove(e) {
this.zoom = originZoom * e.scale
},
touchStart(e) {
if (e.touches.length > 1) {
hammer.get('pinch').set({ enable: true })
}
},
touchEnd(e) {
hammer.get('pinch').set({ enable: false })
}
}
}
</script>
Vue