博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue2.0自定义指令,用touch事件替换scroll事件
阅读量:6196 次
发布时间:2019-06-21

本文共 2884 字,大约阅读时间需要 9 分钟。

  • 首先取消了默认的scroll事件,然后根据滑动的距离计算scrollTop的大小,对于滑动速度过快的,使用定时器制作了一个减速运动,模拟手指离开屏幕时页面继续滑动的情况。
  • 使用这个指令要求绑定元素必须有高度

下面是代码

Vue.directive('touchMove', {  inserted (el, binding, vnode) {    if (el.style.height === 'auto') return // 当绑定元素height为auto时,直接返回    let start, date, dateStart    let scrollPrevious = 0 // 保存滚动条上次所在位置    let moveSave = []    let dateSave = []    let timmer = null    let scrollNow = 0 // 滚动当前所在位置        el.addEventListener('touchstart', function (e) {      clearInterval(timmer)      moveSave = []      dateSave = []      scrollPrevious = el.scrollTop      start = e.targetTouches[0].clientY // 手指开始接触屏幕时所在屏幕Y轴位置      dateStart = new Date()    })    el.addEventListener('touchmove', function (e) {      e.preventDefault()      let move = e.targetTouches[0].clientY // 手指滑动时所在屏幕Y轴位置      let distance = move - start // 每次滑动的距离      let date = new Date()      if (moveSave.length < 2) {         moveSave.push(move) // 保存最近两次滑动所在的位置跟时间        dateSave.push(date)      } else {        moveSave.shift()        moveSave.push(move)        dateSave.shift()        dateSave.push(date)      }      el.scrollTop = -distance + scrollPrevious      if (moveSave[1] < moveSave[0]) {        if (binding.value && binding.value.upScroll) {          binding.value.upScroll(el, vnode) // 向上滑动时运行的函数        }      } else {        if (binding.value && binding.value.downScroll) {          binding.value.downScroll(el, vnode) // 向下滑动时运行的函数        }      }    })    el.addEventListener('touchend', function (e) {      let speed = 0 // 滑动速度(单位px/ms)      let elementHeight = el.scrollHeight - el.clientHeight // 滚动条最大值      let reduction = 0.01 // 加速度      if (moveSave.length < 2) {        speed = (moveSave[0] - start) / (dateSave[0] - dateStart)      } else {        speed = (moveSave[1] - moveSave[0]) / (dateSave[1] - dateSave[0])      }      if (speed > 5) { // 限制speed的最大值跟最小值        speed = 5      }      if (speed < -5) {        speed = -5      }      if (Math.abs(speed) > .5) { // speed超过某一直后就会持续移动        timmer = setInterval(function() {          if (speed < 0) {            speed = speed + reduction            if (binding.value && binding.value.upScroll) {              binding.value.upScroll(el) // 向上滑动时运行的函数            }            if (speed > 0) {              speed = 0            }            scrollNow += -speed * 16          } else if (speed > 0) {            speed = speed - reduction            if (binding.value && binding.value.downScroll) {              binding.value.downScroll(el) // 向下滑动时运行的函数            }            if (speed < 0) {              speed = 0            }            scrollNow -= speed * 16           }          el.scrollTop = scrollNow          if (speed === 0 || el.scrollTop === 0 || el.scrollTop === elementHeight) {            clearInterval(timmer)          }        }, 16)      }    })  }})复制代码

转载于:https://juejin.im/post/5a51b2235188257322588654

你可能感兴趣的文章
微信支付申请90%的商户都卡在这儿了,申请微信支付,商户功能设置详细说明...
查看>>
计算机网络各层协议
查看>>
[Angular 2] Dispatching Action with Payloads and type to Reducers
查看>>
图片预览
查看>>
CPP复习笔记 3
查看>>
restful架构风格设计准则(一)以资源为中心、自描述的请求响应、资源状态迁移为粒度...
查看>>
mysql 数据表读锁机制详解
查看>>
wpf listbox 选中项 上移下移
查看>>
yum install --downloadonly 下载依赖包到本地 但不安装
查看>>
交换机,路由器,集线器,有什么区别
查看>>
介绍WS Federaion 二:把百度和谷歌和谐起来
查看>>
数学之路(3)-机器学习(3)-机器学习算法-欧氏距离(2)
查看>>
ASP.NET操作服务System.ComponentModel.Win32Exception: 拒绝访问
查看>>
Struts2的OGNL标签详解
查看>>
Django第一步
查看>>
RMQ算法模板
查看>>
thinkpad T420屏幕对比度设置
查看>>
libpopt的使用(译)
查看>>
setOnFocusChangeListener的使用
查看>>
Linux下Shell的复制粘贴快捷键
查看>>