import { reactive } from "vue" /** * @description 触碰屏幕钩子函数 * @return { Function } 暴露钩子 */ export function useTouch () { // 最小移动距离 const MIN_DISTANCE = 10; const touch = reactive({ direction: '', deltaX: 0, deltaY: 0, offsetX: 0, offsetY: 0 }) /** * @description 计算距离 * @return { string } 空字符串 */ const getDirection = (x: number, y: number) => { if (x > y && x > MIN_DISTANCE) { return 'horizontal'; } if (y > x && y > MIN_DISTANCE) { return 'vertical'; } return ''; } /** * @description 重置参数 */ const resetTouchStatus = () => { touch.direction = ''; touch.deltaX = 0; touch.deltaY = 0; touch.offsetX = 0; touch.offsetY = 0; } /** * @description 触发 */ const touchStart = (event: any) => { resetTouchStatus(); const events = event.touches[0]; touch.startX = events.clientX; touch.startY = events.clientY; } /** * @description 移动 */ const touchMove = (event: any) => { const events = event.touches[0]; touch.deltaX = events.clientX - touch.startX; touch.deltaY = events.clientY - touch.startY; touch.offsetX = Math.abs(touch.deltaX); touch.offsetY = Math.abs(touch.deltaY); touch.direction = touch.direction || getDirection(touch.offsetX, touch.offsetY); } return { touch, resetTouchStatus, touchStart, touchMove } }