vue如何实现触摸板双指滑动(非长按滑动)

引入:模仿idea中文网站时,里面出现的一个轮播图,既可以通过按钮点击来实现图片的切换,也可以通过双指滑动来实现切换

我首先实现的是按钮点击来实现图片切换,@click来监听两个按钮

具体代码如下,不过多赘述

接下来写的即是触摸板滑动功能

一开始我写的只有@touchsart和@touchend,以此监听触摸板的滑动,代码如下,这个兼容性比较强,在手机上也可以实现滑动,但是在PC端,只能通过检查,再点击触摸板后滑动才能实现图片切换,具体原因暂时还不清楚。

所以在后面我添加了@mousewheel监听事件,这个方法是监听鼠标滚轮事件,而两个手指滑动触摸板就相当于鼠标滚动事件;

而当鼠标滚轮滚动的时候,e.wheelDeltaX的值会变化,就意味着有了滚动,滚动值最后为负值是向右滚动了,滚动值最后为负值是向左滚动了,以此来写函数changeTouch;

通过使用changeTouch方法调用左右切换,但同时也会出现一个问题,changeTouch被调用了多次,这是由于e.wheelDeltaX的值会多次变化,滚动一小点就会调用changeTouch一次,这个时候想到的就是节流函数throttle了;

提出疑问:为什么节流函数一开始要在组件创建时调用,而不是在toMousewheel里面直接使用节流,换句话说,为什么要在created里面调用changeTouch去节流,而不是去toMousewheel里面节流?

回答:一开始写的时候是在调用节流函数时,直接让节流函数调用changeTouch,从而执行了一次,如下【错误写法】

在toMousewheel方法里,直接调用了this.changeTouch(e),这就使得changeTouch方法会被立即执行,而不是被节流,为什么?

因为changeTouch有参数,加了括号传参,当我们去调用有括号传参的函数时就是被执行了,但changeTouch不能被执行,只能被调用;正确的做法应该是把changeTouch函数本身传递给throttle函数,而非调用它的返回值,所以在created的时候赋值一个新变量,这个变量不是函数,所以不会被调用执行,即只会被调用而不会执行;

综上,节流函数第一参数的函数只能被调用,不能被执行,你可以填写函数名,但是不可以填函数名+括号(实际上是在立即执行这个函数),更不能填函数名+括号里面传参(这个时候这个函数会被立即执行,并且它的返回值【而不是函数本身】会被传递给throttle,这显然不是我们想要得,因为我们希望throttle在合适的时机调用函数,而不是立即执行它);

而对于这个toMousewheel方法里,我们直接去写就可以实现触摸板的双指滑动了,没有用到@touchsart和@touchend,把这两个代码保留的好处:这两个是触摸事件,手机端有触摸滑动事件,【有些电脑的触摸板支持"双击滚动"功能,即先用手指再触摸板上快速点击两次,双击后,触摸板会进入滚动模式,然后用户可以移动手指来模拟鼠标滚轮的滚动操作】,我这个要在检查的时候才可以实现电脑的触摸板"双击滚动功能",具体原因暂时不知;所以保留可以让手机端也能够实现滑动功能。

拓展:(touchstart和mousewheel的区别)

touchstart是触摸事件,属于移动端或触摸设备的输入事件,用于处理触摸操作的初始阶段,例如要做PC端长按类型(长按复制、长按语音)【上面不用到touchstart是因为上面本质是滚轮事件,而不是长按事件,而移动端的长按滑动和滚轮有点类似,这种时候就不用多写一个滚轮事件了】;

mousewheel是鼠标事件,属于桌面端鼠标设备的输入事件。用于处理鼠标滚轮滚动事件,例如控制页面滚动、缩放内容或如上功能。

相关推荐
智商不够_熬夜来凑1 天前
【Picker】单选多选
前端·javascript·vue.js
jaychouchannel1 天前
深入理解 Vue 3 Composition API:为什么它是现代前端的必修课
vue.js
笔优站长1 天前
从 Vue 2 到 Vue 3:我把 vue-aliplayer-v2 重构成了一个更现代的阿里云播放器组件
前端·vue.js
i_am_a_div_日积月累_1 天前
3.contextBridge桥梁
前端·javascript·vue.js·electron
bug-100861 天前
hooks,mixin,pinia,vuex
前端·vue.js
bug-100861 天前
vue2和vue3的路由变化
前端·vue.js
狼丶宇先森1 天前
vue-sign-canvas v2 重构复盘:从 Vue 2 签名板到 Vue 3 + TypeScript 组件库
前端·vue.js·重构·typescript·开源软件·canvas
bug-100861 天前
为什么history模式默认会请求后端资源?
前端·vue.js·nginx
星星~笑笑1 天前
vue 超简单 oss分片上传文件 大文件上传阿里云
前端·javascript·vue.js·uni-app
PieroPc2 天前
通用产品标签打印 (为制衣厂 打印纸箱错印或不足 补打修改纸箱通用程序)html版
前端·javascript·vue.js