vue-router的路由变换只存在“变换前”和“变换后”,不存在“切换中”的状态,所以做不到大多数app(微信那样的)在滑动过程中让界面跟随手指移动。但滑动事件还是可以监听的,我们可以在滑动之后再触发路由回退事件。

  微博的滑动返回基本上就是这样的原理:先滑动、再触发返回事件,但用起来很是怪异,有严重的滞后感。夸克浏览器做的就比较好:一是滑动时界面虽然不动,但是界面上有小图标提示,能让用户接受到反馈;二是返回过程很快,没有多余的过渡动画。

  app.vue文件如下:

<template><div id="app" v-on:touchstart="bodyTouchStart" v-on:touchmove="bodyTouchMove" v-on:touchend="bodyTouchEnd"><transition :name="direction"><keep-alive include="home"><router-view class="appView"></router-view></keep-alive></transition></div>
</template><script>
var swidth = document.documentElement.clientWidth;export default {name: 'app',data: () => ({// direction 页面切换的过渡动画,配合transition组件使用direction: "slide-left",// touchLeft 划动起点界限,起点在靠近屏幕左侧时才有效touchLeft: swidth*2/5,// touchStartPoint 记录起始点X坐标touchStartPoint: 0,// distance 记录划动的距离distance: 0,// 回退按钮的dom,根据页面上是否存在此dom来判断该路由是否可回退backBtn: null}),watch: {// 监听路有变化,决定页面过渡动画$route(to, from) {if (from.name == "login" || from.path.indexOf("home") > -1) {this.direction = "slide-left";} else if (to.path.indexOf("home") > -1) {this.direction = "slide-right";} else {const toDepth = to.path.split("/").length;const fromDepth = from.path.split("/").length;this.direction = toDepth < fromDepth ? "slide-right" : "slide-left";}}},methods: {bodyTouchStart: function(event) {this.backBtn = document.getElementById("navback");if (this.backBtn) {// 获得起点X坐标,初始化distance为0this.touchStartPoint = event.targetTouches[0].pageX;this.distance = 0;}},bodyTouchMove: function(event) {if (this.backBtn && this.touchStartPoint < this.touchLeft) {// 只监听单指划动,多指划动不作响应if (event.targetTouches.length > 1) {return;}// 实时计算distancethis.distance = event.targetTouches[0].pageX - this.touchStartPoint;// 根据distance在页面上做出反馈。这里演示通过返回按钮的背景变化作出反馈if (this.distance > 0 && this.distance < 100) {this.backBtn.style.backgroundPosition = ((this.distance - 100) / 100) * 50 + "px 0";} else if (this.distance >= 100) {this.backBtn.style.backgroundPosition = "0 0";} else {this.backBtn.style.backgroundPosition = "-50px 0";}}},bodyTouchEnd: function(event) {if (this.backBtn && this.touchStartPoint < this.touchLeft) {// 划动结束,重置数据this.touchStartPoint = 0;this.backBtn.style.backgroundPosition = "-50px 0";// 当划动距离超过100px时,触发返回事件if (this.distance > 100) {// 返回前修改样式,让过渡动画看起来更快document.getElementById("app").classList.add("quickback");this.$router.back();setTimeout(function(){document.getElementById("app").classList.remove("quickback");},250)}}}}
}
</script><style>
#app {-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;width: 100%;overflow-x: hidden;
}
.appView {position: absolute;width: 100%;background: #fff;min-height: 100vh;transition: transform 0.24s ease-out;
}
#app.quickback .appView{transition-duration: 0.1s;
}
.slide-left-enter {transform: translate(100%, 0);
}
.slide-left-leave-active {transform: translate(-50%, 0);
}
.slide-right-enter {transform: translate(-50%, 0);
}
.slide-right-leave-active {transform: translate(100%, 0);
}
</style>
复制代码

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

vue-router 手势滑动触发返回相关推荐

  1. vue手势滚动_vue-router 手势滑动触发返回功能

    vue-router的路由变换只存在"变换前"和"变换后",不存在"切换中"的状态,所以做不到大多数app(微信那样的)在滑动过程中让界面跟 ...

  2. vue手势滚动_Vue-router 手势滑动触发返回功能_晴枙_前端开发者

    微博的滑动返回基本上就是这样的原理:先滑动.再触发返回事件,但用起来很是怪异,有严重的滞后感.夸克浏览器做的就比较好:一是滑动时界面虽然不动,但是界面上有小图标提示,能让用户接受到反馈:二是返回过程很 ...

  3. vue滑动窗口_vue-floating 浮窗组件、封装基于better-scroll的滑动组件、vue自定义手势指令...

    本篇主要是为了介绍和如何使用之前撸的三个vue在移动端常用的组件,现已开源,欢迎大家使用: 一个基于vue的浮窗组件,可在屏幕内自由拖拽,拖拽后的位置即可不变,也可在移动过程中手指释放浮窗横向贴边. ...

  4. iOS 7的手势滑动返回功能

    之前随手写过一篇<使用UIScreenEdgePanGestureRecognizer实现swipe to pop效果>,挺粗糙的. 现在使用默认模板创建的iOS App都支持手势返回功能 ...

  5. vue router返回到指定的路由

    vue router返回到指定的路由 一.项目场景 二.问题描述 三.原因分析 四.解决方案 一.项目场景 项目场景:示例:A(商品详情)--B(商品购买页面)-C(支付成功页面)--D(订单页面) ...

  6. Android-通过SlidingMenu高仿微信6.2最新版手势滑动返回(二)

    转载请标明出处: http://blog.csdn.net/hanhailong726188/article/details/46453627 本文出自:[海龙的博客] 一.概述 在上一篇博文中,博文 ...

  7. 禁用ios7 手势滑动返回功能

    禁用ios7 手势滑动返回功能   版权声明:本文为博主原创文章,未经博主允许不得转载. [objc] view plaincopy print? 在有的时候,我们不需要手势返回功能,那么可以在页面中 ...

  8. Android-通过SlidingPaneLayout高仿微信6.2最新版手势滑动返回(一)

    最近更新了微信版本到6.2,发现里面有个非常好的体验,就是在第二个页面Activity能手势向右滑动返回,在手势滑动的过程中能看到第一个页面,这种体验非常赞,这里高仿了一下.这里使用的是v4包里面的S ...

  9. Android 12.0 自定义仿小米全面屏手势导航左右手势滑动返回UI效果

    目录 1.概述 2.自定义仿小米全面屏手势导航左右手势滑动返回UI效果的核心类

最新文章

  1. XCTF联赛“出海计划”开启,八月新加坡站国际赛蓄势待发
  2. 一首考研人不得不看的立志诗!!!!!!
  3. c语言 指针函数 详解,[NOTE-C]C语言指针详解(一)
  4. NIPS 2018论文解读 | 基于条件对抗网络的领域自适应方法
  5. 解决.gitgnore加入.idea无效问题
  6. 从uptime、stress、mpstat、pidstat观察CPU密集型、IO密集型、进程密集型切换的系统性能
  7. C# DataGridView属性设置
  8. Python读取文件中汉字方法:导入codecs,添加encoding='utf-8'
  9. java 可见_Java可见性机制的原理
  10. 2021年重庆市高考成绩查询时间复核,2021年重庆高考怎么查询是否被录取,具体录取时间安排...
  11. 解决ajax无法给js全局变量赋值的问题
  12. Java编程:树(基础部分)
  13. C#正则表达式通过HTML提取网页中的图片src
  14. matlab方差 anov,方差分析
  15. 项目的webinf文件在哪_PMP章节练习(第四章:项目整合管理)
  16. Python 音频: sounddevice 使用 左声道/右声道/立体声 --- 播放,录音
  17. 计算机操作系统笔记总结:Part1 计算机系统概述
  18. 全面解析机房综合布线结构、设计方案及未来发展趋势
  19. git clone报错error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly
  20. 华为ensp OSPF单区域配置

热门文章

  1. Git图文教程:从零到上传GitHub项目
  2. MVVM中轻松实现Command绑定任意事件的Command
  3. AHOI2013 Round2 Day2 简要题解
  4. JavaScript 入门基础 (八)
  5. 类成员函数指针的语法
  6. 使用WebBrowser与msHtml开发WinForms下的HtmlEditor控件
  7. 用 Java 实现断点续传 (HTTP)
  8. javascript:document对象的常用属性和方法
  9. 操作系统原理第二章:操作系统结构
  10. 【Linux 内核】进程管理 - 进程优先级 ② ( prio 调度优先级 | static_prio 静态优先级 | normal_prio 正常优先级 | rt_priority 实时优先级 )