微信小程序实现手势滑动卡片效果


Posted in Javascript onAugust 26, 2019

最近工作中有项目要使用微信小程序技术进行开发,其中一项功能困扰了我很久,卡片滑动动效以及手势识别。经过一番研究和参考,现在把成果展示。记录自己踩到的坑,如果大家有需要,也可以帮助到大家。

效果图:

微信小程序实现手势滑动卡片效果

首先是卡片布局的实现:

微信小程序实现手势滑动卡片效果

图片(一)

如图所示,我采用绝对定位absolute的方式,辅助index,可以实现卡片的层叠效果。注意:三张卡片一定都是相同的定位,否则index可能不起作用。

代码:

//设置position: absolute; left:50%;后,再 margin-left:负(一半的width);可以实现水平居中
//同理,设置top:50%;margin-top:负(一半height);可以实现垂直居中
.body-swiper {
 width: 680rpx;//rpx是为了适应屏幕
 height: 900rpx;
 left: 50%;
 position: absolute;
 margin-left: -340rpx;
 z-index: 3;
 box-sizing: border-box;
 -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.62), 0 0 60px rgba(0, 0, 0, 0.06) inset;
 -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.62), 0 0 40px rgba(0, 0, 0, 0.06) inset;
 box-shadow: 0 1px 4px rgba(0, 0, 0, 0.62), 0 0 40px rgba(0, 0, 0, 0.06) inset;
 border-radius: 12px;
}
 
.body-swiper2 {
 width: 640rpx;
 height: 900rpx;
 left: 50%;
 position: absolute;
 margin-left: -320rpx;
 z-index: 2;
 box-sizing: border-box;
 -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.62), 0 0 60px rgba(0, 0, 0, 0.06) inset;
 -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.62), 0 0 40px rgba(0, 0, 0, 0.06) inset;
 box-shadow: 0 1px 4px rgba(0, 0, 0, 0.62), 0 0 40px rgba(0, 0, 0, 0.06) inset;
 border-radius: 12px;
}
 
.body-swiper3 {
 width: 605rpx;
 height: 900rpx;
 left: 50%;
 position: absolute;
 margin-left: -302.5rpx;
 z-index: 1;
 box-sizing: border-box;
 -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.62), 0 0 60px rgba(0, 0, 0, 0.06) inset;
 -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.62), 0 0 40px rgba(0, 0, 0, 0.06) inset;
 box-shadow: 0 1px 4px rgba(0, 0, 0, 0.62), 0 0 40px rgba(0, 0, 0, 0.06) inset;
 border-radius: 12px;
}

接下来,是卡片手势的实现;

上代码:

/**
 * 卡片1手势
 */
 touchstart1: function (event) {
 touchDotX = event.touches[0].pageX; // 获取触摸时的原点
 touchDotY = event.touches[0].pageY;
 console.log("起始点的坐标X:" + touchDotX);
 console.log("起始点的坐标Y:" + touchDotY);
 },
 // 移动结束处理动画
 touchend1: function (event) {
 // 手指离开屏幕时记录的坐标
 let touchMoveX = event.changedTouches[0].pageX;
 let touchMoveY = event.changedTouches[0].pageY;
 // 起始点的坐标(x0,y0)和手指离开时的坐标(x1,y1)之差
 let tmX = touchMoveX - touchDotX;
 let tmY = touchMoveY - touchDotY;
 // 两点横纵坐标差的绝对值
 let absX = Math.abs(tmX);
 let absY = Math.abs(tmY);
 //起始点的坐标(x0,y0)和手指离开时的坐标(x1,y1)之间的距离
 let delta = Math.sqrt(absX * absX + absY * absY);
 console.log('起始点和离开点距离:' + delta + 'px');
 // 如果delta超过60px(可以视情况自己微调),判定为手势触发
 if (delta >= 60) {
 // 如果 |x0-x1|>|y0-y1|,即absX>abxY,判定为左右滑动
 if (absX > absY) {
 // 如更tmX<0,即(离开点的X)-(起始点X)小于0 ,判定为左滑
 if (tmX < 0) {
  console.log("左滑=====");
  // 执行左滑动画
  this.Animation1(-500);
  // 如更tmX>0,即(离开点的X)-(起始点X)大于0 ,判定为右滑
 } else {
  console.log("右滑=====");
  // 执行右滑动画
  this.Animation1(500);
 }
 // 如果 |x0-x1|<|y0-y1|,即absX<abxY,判定为上下滑动
 } else {
 // 如更tmY<0,即(离开点的Y)-(起始点Y)小于0 ,判定为上滑
 if (tmY < 0) {
  console.log("上滑动=====");
  this.setData({
  isFront1: !this.data.isFront1
  });
  // 如更tmY>0,即(离开点的Y)-(起始点Y)大于0 ,判定为下滑
 } else {
  console.log("下滑动=====");
  this.setData({
  isFront1: !this.data.isFront1
  });
 }
 }
 } else {
 console.log("手势未触发=====");
 }
 
 // 让上一张卡片展现正面(如果之前翻转过的话)
 this.setData({
 isFront3: true,
 });
 }

为了更直观的看到手势触发的条件,我画了一张图:

微信小程序实现手势滑动卡片效果

图片(二)

最后是动画的编写;

上代码:

/**
 * 卡片1:
 * 左滑动右滑动动画
 */
 Animation1: function (translateXX) {
 let animation = wx.createAnimation({
 duration: 680,
 timingFunction: "ease",
 });
 this.animation = animation;
 // 如果大于0,判定是右滑动画,否则左滑
 if (translateXX > 0) {
 this.animation.translateY(0).rotate(20).translateX(translateXX).opacity(0).step();
 } else {
 this.animation.translateY(0).rotate(-20).translateX(translateXX).opacity(0).step();
 }
 // 设置10ms,视觉欺骗,直接归位到原来位置
 this.animation.translateY(0).translateX(0).opacity(1).rotate(0).step({
 duration: 10
 });
 
 this.setData({
 animationData1: this.animation.export(),
 });
 // 动画结束后重拍三张卡片
 setTimeout(() => {
 this.setData({
 ballTop1: 220,
 ballLeft1: -302.5,
 ballWidth1: 605,
 index1: 1,
 
 ballTop2: 240,
 ballLeft2: -340,
 ballWidth2: 680,
 index2: 3,
 
 ballTop3: 230,
 ballLeft3: -320,
 ballWidth3: 640,
 index3: 2,
 })
 }, 500);
 }

如此一来,大功告成,我自己测试了几次,暂时没有发现什么大问题。如果你有更好的实现方法,欢迎留言。

代码已上传到github

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
json 定义
Jun 10 Javascript
JS实现可改变列宽的table实例
Jul 02 Javascript
js的匿名函数使用介绍
Dec 11 Javascript
js实现图片拖动改变顺序附图
May 13 Javascript
javascript基于DOM实现省市级联下拉框的方法
May 14 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
Nov 30 Javascript
原生js和jquery分别实现横向导航菜单效果
May 13 Javascript
详谈js中window.location.search的用法和作用
Feb 13 Javascript
微信小程序 页面跳转如何实现传值
Apr 05 Javascript
BootStrap表单控件之文本域textarea
May 23 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
Sep 17 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
Apr 13 Javascript
微信小程序实现左侧滑栏过程解析
Aug 26 #Javascript
vue柱状进度条图像的完美实现方案
Aug 26 #Javascript
React传值 组件传值 之间的关系详解
Aug 26 #Javascript
js实现指定时间倒计时效果
Aug 26 #Javascript
Vue.use()在new Vue() 之前使用的原因浅析
Aug 26 #Javascript
微信小程序事件 bindtap bindinput代码实例
Aug 26 #Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
Aug 26 #Javascript
You might like
说说PHP的autoLoad自动加载机制
2012/09/27 PHP
PHP 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
PHP中把数据库查询结果输出为json格式简单实例
2015/04/09 PHP
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
2016/04/04 PHP
php PDO判断连接是否可用的实现方法
2017/04/03 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
2019/10/17 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
jquery实现垂直手风琴导航栏
2020/02/18 jQuery
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
Python实现拼接多张图片的方法
2014/12/01 Python
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
Python中的self用法详解
2019/08/06 Python
tensorflow如何批量读取图片
2019/08/29 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
试用期转正鉴定评语
2014/01/27 职场文书
合作协议书怎么写
2014/04/18 职场文书
美国留学经济担保书
2014/05/20 职场文书
帮一个朋友写的求职信
2014/08/09 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
春风化雨观后感
2015/06/11 职场文书
初中语文教学随笔
2015/08/15 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书