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


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 相关文章推荐
js 鼠标点击事件及其它捕获
Jun 04 Javascript
jQuery 扩展对input的一些操作方法
Oct 30 Javascript
Javascript load Page,load css,load js实现代码
Mar 31 Javascript
Javascript操作cookie的函数代码
Oct 03 Javascript
js函数排序的实例代码
Jul 01 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
Dec 10 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
Apr 14 Javascript
JS根据生日月份和日期计算星座的简单实现方法
Nov 24 Javascript
微信小程序开发图片拖拽实例详解
May 05 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
Feb 18 jQuery
在Vue mounted方法中使用data变量详解
Nov 05 Javascript
Js on及addEventListener原理用法区别解析
Jul 11 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
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
javascript 全等号运算符使用说明
2010/05/31 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
jquery获取tr中控件值并操作tr实现思路
2013/03/27 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
jQuery实现折叠、展开的菜单组效果代码
2015/09/16 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
2016/06/08 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
vue穿梭框实现上下移动
2021/01/29 Vue.js
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
Python获取时间戳代码实例
2019/09/24 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
如何利用cmp命令比较文件
2013/09/23 面试题
自主招生自荐信指南
2014/02/04 职场文书
期末学生评语大全
2014/04/24 职场文书
2014审计局领导班子民主生活会对照检查材料思想汇报
2014/09/20 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
交通安全教育主题班会
2015/08/12 职场文书
初中历史教学反思
2016/02/19 职场文书
Python字符串的转义字符
2022/04/07 Python