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为0
this.touchStartPoint = event.targetTouches[0].pageX;
this.distance = 0;
}
},
bodyTouchMove: function(event) {
if (this.backBtn && this.touchStartPoint < this.touchLeft) {
// 只监听单指划动,多指划动不作响应
if (event.targetTouches.length > 1) {
return;
}
// 实时计算distance
this.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://github.com/yource/VueSPA

vue-router 手势滑动触发返回的更多相关文章

  1. vue router.push(),router.replace(),router.go()和router.replace后需要返回两次的问题

    转载:https://www.cnblogs.com/lwwen/p/7245083.html https://blog.csdn.net/qq_15385627/article/details/83 ...

  2. iOS之手势滑动返回功能-b

    iOS中如果不自定义UINavigationBar,通过手势向右滑是可以实现返回的,这时左边的标题文字提示的是上一个ViewController的标题,如果需要把文字改为简约风格,例如弄过箭头返回啥的 ...

  3. 再谈iOS 7的手势滑动返回功能

    本文转载至 http://blog.csdn.net/jasonblog/article/details/28282147  之前随手写过一篇<使用UIScreenEdgePanGestureR ...

  4. iOS之手势滑动返回功能

    iOS中如果不自定义UINavigationBar,通过手势向右滑是可以实现返回的,这时左边的标题文字提示的是上一个ViewController的标题,如果需要把文字改为简约风格,例如弄过箭头返回啥的 ...

  5. iOS 7的手势滑动返回

    如今使用默认模板创建的iOS App都支持手势返回功能,假设导航栏的返回button是自己定义的那么则会失效,也能够參考这里手动设置无效. if ([self.navigationController ...

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

    禁用ios7 手势滑动返回功能 版权声明:本文为博主原创文章,未经博主允许不得转载. 在有的时候,我们不需要手势返回功能,那么可以在页面中添加以下代码: - (void)viewDidAppear:( ...

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

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

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

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

  9. vue router 配合transition 切换动画

    把<router-view>嵌套在<transition>里,路由变化的时候,vue会为包裹页面的div增加动画样式,我们要做的就是监听路由变化.定义这些动画样式,以规定页面到 ...

随机推荐

  1. How To Scan QRCode For UWP (1)

    本文将介绍实现一个类似于微信扫一扫功能的UI界面,后续会再实现具体的识别二维码的功能. 实例使用的Win10 SDK Version是Windows 10 Anniversary Edition(10 ...

  2. Hive中的Row_Number()使用

    语法:row_number() over (partition by 字段a order by 计算项b desc ) rank --这里rank是别名 partition by:类似hive的建表, ...

  3. ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context

    封装Redis发布订阅时,SUB时,又想探测具体Channel的状态,于是执行PUBSUB CHNNALES命令,报 ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / ...

  4. 使用mysql workbench和vscode进行数据库差异比对

    按照如图步骤,导出正式服务器的数据库和测试服务器数据库,并按照指定格式命名. 在vscdoe的文件列表下选中待比较文件1,右键-选择以进行比较. 然后选中第二文件,右键-与已选择文件比较

  5. Quartz.NET基础知识概述

    Quartz.NET是什么 由于我现在使用的Quartz.NET2.2版本,相对2.x变化不大,主要是相对于1.x更新了很多东西,如下基础知识摘录网络. Quartz.NET是一个开源的作业调度框架, ...

  6. MySql中插入乱码问题解决

    今天在使用Java写入数据库时候,发现Insert语句和Update语句在执行过后,数据库中中文显示的是“??”,经过一番查阅,其中关键的问题在于编码格式是否统一. 其中创建表时候,每个关键字的格式都 ...

  7. Go的方法集

    方法集定义了接口的接受规则. package main import "fmt" type notifier interface { notify() } type user st ...

  8. Tomcat学习总结(15)—— Tomcat优化时的参数分析

    (1).maxHttpHeaderSize=”8192” 此选项用于配置:来自于客户端请求的Request和Response的HTTP header 的最大长度,以字节计算.如果不设置,该属性为409 ...

  9. BEA-290074 <Deployment service servlet received file download request for file "security/SerializedSystemIni.dat". The file may exist, but download of this file is not allowed.>

    Bug 19766239 - WLS 12.1.3 - MS NOT STARTING - 'DOWNLOAD OF THIS FILE IS NOT ALLOWED' Issue is fixed ...

  10. Oracle存储过程编译卡死的解决方法

    转自: https://www.cnblogs.com/liang-ling/p/5395249.html 解决方法如下: 1:查V$DB_OBJECT_CACHE SELECT * FROM V$D ...