# any-touch [![NPM Version][npm-image]][npm-url] [![NPM Downloads][downloads-image]][downloads-url] [![size-image]][size-url] [![codecov](https://codecov.io/gh/any86/any-touch/branch/master/graph/badge.svg)](https://codecov.io/gh/any86/any-touch) [![CircleCI](https://circleci.com/gh/any86/any-touch.svg?style=svg)](https://circleci.com/gh/any86/any-touch) [size-image]: https://badgen.net/bundlephobia/minzip/@any-touch/core [size-url]: https://bundlephobia.com/result?p=@any-touch/core [npm-image]: https://badgen.net/npm/v/any-touch [npm-url]: https://npmjs.org/package/any-touch [downloads-image]: https://badgen.net/npm/dt/any-touch [downloads-url]: https://npmjs.org/package/any-touch ![6类手势](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/102a244991064824900ac45efeb9251d~tplv-k3u1fbpfcp-zoom-1.image) - 支持 PC 端 / 移动端 / [微信小程序](docs/wx.CN.md). - **默认加载6 个手势识别器**, 也可[按需加载](docs/optional.CN.md), 核心**1kb**, 完整**5kb**. - **无依赖, 不限于 Vue / React / Angular 等...** ## 语言 **中文** | [English](README.CN.md) ## 演示
查看二维码
[简单演示](https://any86.github.io/any-touch) [衍生产物: any-scroll(虚拟滚动)](https://github.com/any86/any-scroll) ## 安装 ```javascript npm i -S any-touch ``` ## CDN ```html ``` ## 目录 [⚡ 快速开始](#快速开始) - [👋 手势事件](#-手势事件) - [🍭 事件对象](#lollipop-事件对象event) - [🔹 Typescript](#Typescript) [🌱 vue&指令](docs/vue.CN.md) [🍀 微信小程序](docs/wx.CN.md) [📐 按需加载](docs/optional.CN.md) [🌈 进阶使用](docs/advanced.CN.md) - [阻止默认事件](docs/advanced.CN.md#阻止默认事件) - [双击(doubletap)](https://github.com/any86/any-touch/tree/master/packages/doubletap) [:bulb: API](docs/API.CN.md) [🍳 常见问题](docs/question.CN.md) ## 快速开始 ```javascript import AnyTouch from 'any-touch'; // 被监视的元素 const el = document.getElementById('box'); // 开始监视el上的手势变化 const at = new AnyTouch(el); // 当拖拽的时候pan事件触发 at.on('pan', (e) => { // e包含位移/速度/方向等信息 console.log(e); }); ``` 这里的`pan`叫做[手势事件](#-手势事件). `e`是[事件对象](#lollipop-事件对象event), 其包含"位置/速度/缩放/角度"等数据, ### 👋 手势事件 每个手势的不同状态都对应一个事件.
手势 事件名 说明
pan 拖拽时持续触发
panstart 拖拽开始
panmove 拖拽中
panstart 拖拽停止(离开屏幕)
panup / pandown / panright / panleft 不同方向的拖拽事件
press press 按压
press 按压释放(离开屏幕)
tap tap 点击
swipe swipe 快划
swipeup / swipedown / swiperight / swipeleft 不同方向快划
pinch pinch 缩放
pinchstart 缩放开始
pinchmove 缩放中
pinchend 缩放结束(离开屏幕)
pinchin 放大
pinchout 缩小
rotate rotate 旋转
rotatestart 旋转开始
rotatemove 旋转中
rotateend 旋转结束(离开屏幕)
#### 组合事件 可以通过数组监听多个事件, 比如同时监听`panleft`和`panright`, 这样就实现监听"x 轴拖拽". ```javascript at.on(['panleft', 'panright'], () => { console.log('x轴拖拽'); }); ``` [:rocket: 返回目录](#目录) ### :lollipop: 事件对象(event) 事件触发的时候, 可以获取"位置/速度/缩放/角度"等数据. ```javascript at.on('pan', (event) => { // event包含速度/方向等数据 }); ``` #### event | 名称 | 数据类型 | 说明 | | --------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------ | | name | `String` | **识别器名**, 如:pan/tap/swipe等. | | type | `String` | **事件名**,如 tap/panstart 等,他比`name`字段范围大,如:当`type`是 panstart 或 panmove, 而`name`返回的都是 pan | | phase | `String` | 当前触碰状态: start \| move \|end \| cancel 对应: 第一下触碰 \| 屏幕上移动 \| 离开屏幕 \| 非正常离开 \"可 anyTouch\"元素 | | x | `Number` | **当前触点中心**x 坐标 | | y | `Number` | **当前触点中心**y 坐标 | | deltaX | `Number` | **当前触点**和**前触点**的 x 轴偏移距离 | | deltaY | `Number` | **当前触点**和**前触点**的 y 轴偏移距离 | | displacementX | `Number` | **当前触点**与**起始触点**的 x 位移(矢量) | | displacementY | `Number` | **当前触点**与**起始触点**的 y 位移(矢量) | | distanceX | `Number` | displacementX 的绝对值 | | distanceY | `Number` | displacementY 的绝对值 | | distance | `Number` | **当前触点**与**起始触点**的距离(标量) | | deltaTime | `Number` | **当前时间**与**起始触碰时间**的差值 | | velocityX | `Number` | 当前 x 轴速度 | | velocityY | `Number` | 当前 y 轴速度 | | direction | `Number` | **前触点**与**当前触点**的方向,可以理解为瞬时方向 | | angle | `Number` | 多点触摸时,**起始触点**与**当前触点**的旋转角度 | | deltaAngle | `Number` | 多点触摸时,**前触点**与**当前触点**的旋转角度 | | scale | `Number` | 多点触摸时,**起始触点**与**当前触点**的缩放比例 | | deltaScale | `Number` | 多点触摸时,**前触点**与**当前触点**的缩放比例 | | maxPointLength | `Number` | 本轮识别周期出现过的最大触点数 | | isStart | `Boolean` | 是否当前识别周期的开始, 规律为从 touchstart->touchend 即是一个周期, 即便多点触碰, 有一个点离开,本轮识别结束 | | isEnd | `Boolean` | 是否当前识别周期的结束 | | target | `EventTarget` | 绑定事件的元素 | | targets | `EventTarget[]` | 对应多个触点会存储 touches 中的每一个 target | | currentTarget | `EventTarget` | 实际触发绑定事件的元素 | | **nativeEvent** | `TouchEvent` | 原生事件对象 | [:rocket: 返回目录](#目录) ## Typescript 如果在 vue 模板中绑定事件函数, 那么事件对象的类型是没法推导的, 所以需要我们自己手动标注. ```html
``` ```typescript // xxx.vue import type { AnyTouchEvent } from 'any-touch'; function onTap(e: AnyTouchEvent) { // 可以正确推导出e上有x属性 console.log(e.x); } ``` [:rocket: 返回目录](#目录)