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 相关文章推荐
浅析jQuery的链式调用之each函数
Dec 03 Javascript
获取当前点击按钮的id用this.id实现
Mar 17 Javascript
js控制iframe的高度/宽度让其自适应内容
Apr 09 Javascript
jQuery实现跨域iframe接口方法调用
Mar 14 Javascript
基于jquery插件编写countdown计时器
Jun 12 Javascript
JavaScript 字符串常用操作小结(非常实用)
Nov 30 Javascript
bootstrap提示标签、提示框实现代码
Dec 28 Javascript
微信小程序将字符串生成二维码图片的操作方法
Jul 17 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
Jul 25 Javascript
vue根据值给予不同class的实例
Sep 29 Javascript
详解element-ui中form验证杂记
Mar 04 Javascript
vue-next/runtime-core 源码阅读指南详解
Oct 25 Javascript
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
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
ajax在joomla中的原生态应用代码
2012/07/19 PHP
PHP读取文件的常见几种方法
2016/11/03 PHP
PHP输出多个元素的排列或组合的方法
2017/03/14 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
jquery 锁定弹出层实现代码
2010/02/23 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
jQuery中$.ajax()方法参数解析
2016/10/22 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
python一键升级所有pip package的方法
2017/01/16 Python
Python中整数的缓存机制讲解
2019/02/16 Python
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
python实现的分层随机抽样案例
2020/02/25 Python
物流专业毕业生推荐信范文
2013/11/18 职场文书
个人教师自我评价范文
2013/12/02 职场文书
元旦联欢会感言
2014/03/04 职场文书
汉语言文学毕业求职信
2014/07/17 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
导游欢迎词范文
2015/01/23 职场文书
采购员岗位职责
2015/02/03 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js