vue-router 手势滑动触发返回功能


Posted in Javascript onSeptember 30, 2018

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>

下面看下vue图片左右滑动及手势缩放

引入vue-awesome-swiperimport 'swiper/dist/css/swiper.css';

import { swiper, swiperSlide } from 'vue-awesome-swiper';components: {
 swiper,
 swiperSlide,
},data() {
 return {
 swiperOption: {
  width: window.innerWidth,
  zoom : true,
  initialSlide: 0,
 },
 };
},<swiper :options="swiperOption" ref="imgOverview" style="height: 100%;">
 <swiper-slide v-for="(img, index) in previewImg">
 <div class="swiper-zoom-container">
  <img :src="img" alt="">
 </div>
 </swiper-slide>
</swiper>

代码案例见 https://github.com/yource/VueSPA

总结

以上所述是小编给大家介绍的vue-router 手势滑动触发返回功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
function foo的原型与prototype属性解惑
Nov 19 Javascript
Ajax搜索结果页面下方的分页按钮的生成
Apr 05 Javascript
jQuery随机切换图片的小例子
Apr 18 Javascript
在JavaScript中实现类的方式探讨
Aug 28 Javascript
Jquery方式获取iframe页面中的 Dom元素
May 07 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
Jun 26 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
Jul 20 Javascript
基于Node的React图片上传组件实现实例代码
May 10 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
Apr 29 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
Nov 06 Javascript
jquery ajax 请求小技巧实例分析
Nov 11 jQuery
JQuery事件冒泡和默认行为代码实例
May 13 jQuery
Vue CLI3 开启gzip压缩文件的方式
Sep 30 #Javascript
JS数组实现分类统计实例代码
Sep 30 #Javascript
浅谈微信页面入口文件被缓存解决方案
Sep 29 #Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
Sep 29 #Javascript
vue使用v-for实现hover点击效果
Sep 29 #Javascript
vue 利用路由守卫判断是否登录的方法
Sep 29 #Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
Sep 29 #Javascript
You might like
destoon二次开发常用数据库操作
2014/06/21 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
php集成动态口令认证
2016/07/21 PHP
PHP判断一个数组是另一个数组子集的方法详解
2017/07/31 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
jquery动画效果学习笔记(8种效果)
2015/11/13 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
angularjs下ng-repeat点击元素改变样式的实现方法
2018/09/12 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
python实现下载整个ftp目录的方法
2017/01/17 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
python Gunicorn服务器使用方法详解
2019/07/22 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
SneakerStudio英国:最佳运动鞋商店
2019/05/22 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
五一家具促销方案
2014/01/10 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL