跳转到内容

移动端手势识别

如需安装所有解决方案,请参考全量解决方案安装

监听移动端的特殊手势操作转换为pc端操作(单击、双击、拖动、双指滑动/鼠标滚轮、双指单击/鼠标右键等事件)

单独安装此hook

shell
npm install @havue/use-gesture-2-mouse --save
shell
yarn add @havue/use-gesture-2-mouse
shell
pnpm install @havue/use-gesture-2-mouse

使用

引入

ts
import { useGestrue2Mouse } from 'havue'
// or
import { useGestrue2Mouse } from '@havue/hooks'
// or
import { useGestrue2Mouse } from '@havue/gesture-2-mouse'

示例

下面区域为可操作区域,操作时,页面显示当前操作类型

点我看代码
vue
<template>
  <div ref="operateBoxRef" class="mouse-pass-through">
    {{ stateText }}
    <div class="point" :style="pointStyle"></div>
  </div>
</template>
ts
<script setup lang="ts">
import { ref, reactive, computed, nextTick } from 'vue'
// import { useGestrue2Mouse } from '@havue/use-gesture-2-mouse'
import { useGestrue2Mouse } from '@havue/hooks'

const stateText = ref<string>('')

const originRect = ref({
  width: 1920,
  height: 1080
})

const currentPoint = reactive({
  x: 0,
  y: 0
})

const pointStyle = computed(() => {
  return {
    top: `${(100 * currentPoint.y) / originRect.value.height}%`,
    left: `${(100 * currentPoint.x) / originRect.value.width}%`
  }
})

const { operateBoxRef } = useGestrue2Mouse(undefined, {
  onMouseEvent: (e, button) => {
    Object.assign(currentPoint, {
      x: e.x,
      y: e.y
    })

    if (button) {
      stateText.value =
        button === 'left' ? '左键' : button === 'right' ? '右键' : button === 'middle' ? '鼠标中键' : '未按下键'
    }

    console.log(stateText.value, e)
  },
  onMouseWheel(e, deltaY) {
    Object.assign(currentPoint, {
      x: e.x,
      y: e.y
    })
    nextTick(() => {
      stateText.value = `滚动:deltaY:${deltaY}`
    })

    console.log(stateText.value, e)
  },
  TargetRealSize: originRect
})
</script>
scss
<style lang="scss" scoped>
.mouse-pass-through {
  position: relative;
  width: 480px;
  height: 270px;
  overflow: hidden;
  background-color: rgb(41 109 86);

  .point {
    position: absolute;
    width: 10px;
    height: 10px;
    background-color: #fff;
    border-radius: 50%;
    transform: translate(-50%, -50%);
  }
}
</style>

useOperateTransform函数参数

参数名说明类型默认值
target操作元素,如果不传,函数会返回一个operateBoxRef元素引用供外部使用MaybeRef<HTMLElement | undefined>
options配置Partial<UseGestrue2MouseEventOptions>
options?.targetRealSize目标区域对应现实宽高(非页面元素宽高)MaybeRef<UseGestrue2MouseTargetRealSizeType>
options?.onMouseEvent鼠标点击事件(e: UseGestrue2MouseTargetPositionType, button?: UseGestrue2MouseMouseButtonType) => void
options?.onMouseWheel鼠标滚轮事件(e: UseGestrue2MouseTargetPositionType, deltaY: number) => void
options?.throttlethrottle option-

类型定义

点我看代码
ts
export type UseGestrue2MouseTargetRealSizeType = {
  width: number
  height: number
}

export type UseGestrue2MouseTargetPositionType = {
  elX: number
  elY: number
  x: number
  y: number
}

export type UseGestrue2MouseMouseButtonType = 'left' | 'right' | 'middle'

export type UseGestrue2MouseEventOptions = {
  onMouseEvent?: (e: UseGestrue2MouseTargetPositionType, button?: UseGestrue2MouseMouseButtonType) => void
  onMouseWheel?: (e: UseGestrue2MouseTargetPositionType, deltaY: number) => void
  TargetRealSize?: MaybeRef<UseGestrue2MouseTargetRealSizeType>
  throttle?: {
    wait: number
    leading?: boolean
    trailing?: boolean
  }
}