每天学习一个vue插件(7)——hammerjs

3,566 阅读1分钟

如果结果不如你所愿,就在尘埃落定前奋力一搏

前言

1 介绍

常用手势

Tap

// 单击 双击 长按
hammer.on('tap doubletap press', evt => {
  console.log(evt.type, evt)
})

Pan

// 拖拽
// 垂直方向须手动添加
hammer.on('pan panleft panright panup pandown panend', evt => {
  console.log(evt.type, evt)
})

Swipe

// 滑动
// 垂直方向须手动添加
hammer.on('swipe swipeleft swiperight swipeup swipedown', evt => {
  console.log(evt.type, evt)
})

Rotate

// 旋转
// 旋转须手动添加
hammer.on('rotate', evt => {
  console.log(evt.type, evt)
})

Pinch

// 缩放
// 缩放须手动添加
hammer.on('pinch', evt => {
  console.log(evt.type, evt)
})

常用方法

get

// 获取事件
hammer.get('press')
hammer.get('swipe')
hammer.get('pinch')

set

// 设置事件
hammer.get('press').set({time: 500})
hammer.get('swipe').set({direction: Hammer.DIRECTION_VERTICAL})
hammer.get('pinch').set({enable: true})

常用配置项

enable

// 支持与否
enable: true

time

// 时长
time: 500

direction

// 方向
/*
  Hammer.DIRECTION_NONE
  Hammer.DIRECTION_LEFT
  Hammer.DIRECTION_RIGHT
  Hammer.DIRECTION_HORIZONTAL
  Hammer.DIRECTION_UP
  Hammer.DIRECTION_DOWN
  Hammer.DIRECTION_VERTICAL
  Hammer.DIRECTION_ALL
*/
direction: Hammer.DIRECTION_VERTICAL

事件对象

type

// 类型
evt.type

deltaTime

// 时长
evt.deltaTime

deltaX

// 水平位移
evt.deltaX

deltaY

// 垂直位移
evt.deltaY

distance

// 移动距离
evt.distance

angle

// 偏移角度
evt.angle

2 使用

安装

npm install hammerjs -S

.vue

<template>
  <div class="Hammer">
    <div class="box" ref="box"></div>
  </div>
</template>

<script>
import Hammer from 'hammerjs'
export default {
  data() {
    return {
      hammer: null
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      // 默认事件
      // tap doubletap press
      // pan panleft panright panup pandown panend
      // swipe swipeleft swiperight

      // 手动添加
      // swipeup swipedown
      // panup pandown

      // 特殊事件,避免卡死
      // pinch rotate

      this.hammer = new Hammer(this.$refs.box)

      // 需识别事件
      this.hammer.get('swipe').set({ direction: Hammer.DIRECTION_VERTICAL })
      this.hammer.get('pan').set({ direction: Hammer.DIRECTION_ALL })

      // 需特殊处理事件
      this.hammer.get('pinch').set({ enable: true })
      this.hammer.get('rotate').set({ enable: true })

      //   this.hammer.on(
      //     `tap doubletap press
      //      pan panleft panright panup pandown panend
      //      swipe swipeleft swiperight swipeup swipedown
      //      pinch pinchend
      //     `,
      //     evt => {
      //       console.log(evt.type, evt)
      //     }
      //   )
      // }
      this.hammer.on('pan', evt => {
        // deltaTime
        // deltaX deltaY distance
        // angle
        console.log(evt.type, evt)
      })
    }
  }
}
</script>

<style lang="scss" scoped>
.Hammer {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 500px;
  height: 500px;
  border: 1px solid #ccc;
  .box {
    width: 200px;
    height: 200px;
    background: brown;
  }
}
</style>

3.注意

1.事件无法使用时,需要手动添加识别
2.使用manager管理,pan和swipe冲突

尾声

希望是个好东西,也许是世界上做好的东西

晚安 ^_^

参考链接

往期回顾