微信小程序左滑删除效果的实现代码


Posted in Javascript onFebruary 20, 2017

今天我们说下微信小程序左滑删除效果的实现,现在市场上很多APP都在使用这个效果,一个listView页面,向左滑动一条item时,右侧会出现一个删除或者其他的选项,用户体验非常好,操作起来十分方便,今天我们使用微信小程序来实现这个效果.......

先看效果

微信小程序左滑删除效果的实现代码

要实现的效果:

1,当向左滑动时,item跟随手指像左移动,同时右侧出现两个可点击的按钮

2,当滑动距离大于按钮宽度一半松开手指时,item自动滑动到左侧显示出按钮,小于一半时item自动回到原来的位置,隐藏按钮。

思路:

1,首先页面每个item分为上下两层,上面一层放置正常内容,下面一层放置左滑显示出的按钮,这个可以使用z-index来实现分层。
2,item上层使用绝对定位,我们操纵 left 属性的值来实现像左移动。

3,我们通过微信小程序api提供的touch对象和3个有关手指触摸的函数(touchstart,touchmove,touchend)来实现item随手指移动。

微信小程序左滑删除效果的实现代码

微信小程序左滑删除效果的实现代码

由于比较简单,所以直接上代码了,详细的讲解都在代码的注释中,首先看下页面的布局

<!--这是一个item的代码>
  <view class="address-item" wx:for="{{addressList}}" >
  <!--这里绑定了刚才说的3个函数分别为 touchS,touchM touchE-->
  <!--这里注意这个 style="{{item.txtStyle}}" ,这是我们一会再js中 将要设置的样式 -->
    <view style="{{item.txtStyle}}" bindtouchstart="touchS" bindtouchmove="touchM" bindtouchend="touchE" data-index="{{index}}" class="address-item-top" >
     <!--中间无关的代码已被我删除-->
    </view>

     <!--这里是左滑按钮部分----start-->
    <view bindtap="delItem" class="posit">
      <view class="editor" data-addressid="{{item.address.ID}}" catchtap="setDefaultAddress">设为默认地址</view>
      <view class="del" data-addressid="{{item.address.ID}}" data-index="{{index}}" catchtap="delAddress">删除</view>
    </view>
     <!--这里是左滑按钮部分----end-->
  </view>

再看js代码

Page({
 data:{
  addressList:[{"Contact":"钟诚","Mobile":13888888888,"Address":"江苏省苏州市工业园区创意产业园"},
{"Contact":"凹凸曼","Mobile":13666666666,"Address":"江苏省苏州市工业园区独墅湖体育馆"},
{"Contact":"图傲曼","Mobile":13666666666,"Address":"江苏省苏州市工业园区独墅湖体育馆"}],
  editIndex:0,
  delBtnWidth:150//删除按钮宽度单位(rpx)
 },
 onLoad:function(options){},
 //手指刚放到屏幕触发
 touchS:function(e){
  console.log("touchS"+e);
  //判断是否只有一个触摸点
  if(e.touches.length==1){
   this.setData({
    //记录触摸起始位置的X坐标
    startX:e.touches[0].clientX
   });
  }
 },
 //触摸时触发,手指在屏幕上每移动一次,触发一次
 touchM:function(e){
   console.log("touchM:"+e);
  var that = this
  if(e.touches.length==1){
   //记录触摸点位置的X坐标
   var moveX = e.touches[0].clientX;
   //计算手指起始点的X坐标与当前触摸点的X坐标的差值
   var disX = that.data.startX - moveX;
   //delBtnWidth 为右侧按钮区域的宽度
   var delBtnWidth = that.data.delBtnWidth;
   var txtStyle = "";
   if(disX == 0 || disX < 0){//如果移动距离小于等于0,文本层位置不变
    txtStyle = "left:0px";
   }else if(disX > 0 ){//移动距离大于0,文本层left值等于手指移动距离
    txtStyle = "left:-"+disX+"px";
    if(disX>=delBtnWidth){
     //控制手指移动距离最大值为删除按钮的宽度
     txtStyle = "left:-"+delBtnWidth+"px";
    }
   }
   //获取手指触摸的是哪一个item
   var index = e.currentTarget.dataset.index;
   var list = that.data.addressList;
   //将拼接好的样式设置到当前item中
   list[index].txtStyle = txtStyle; 
   //更新列表的状态
   this.setData({
    addressList:list
   });
  }
 },
 touchE:function(e){
   console.log("touchE"+e);
  var that = this
  if(e.changedTouches.length==1){
   //手指移动结束后触摸点位置的X坐标
   var endX = e.changedTouches[0].clientX;
   //触摸开始与结束,手指移动的距离
   var disX = that.data.startX - endX;
   var delBtnWidth = that.data.delBtnWidth;
   //如果距离小于删除按钮的1/2,不显示删除按钮
   var txtStyle = disX > delBtnWidth/2 ? "left:-"+delBtnWidth+"px":"left:0px";
   //获取手指触摸的是哪一项
   var index = e.currentTarget.dataset.index;
   var list = that.data.addressList;
   list[index].txtStyle = txtStyle; 
   //更新列表的状态
   that.setData({
    addressList:list
   });
  }
 }

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

Javascript 相关文章推荐
基于jquery的blockui插件显示弹出层
Apr 14 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
Jan 02 Javascript
用jquery写的一个万年历(自写)
Jan 20 Javascript
让html页面不缓存js的实现方法
Oct 31 Javascript
jQuery动态修改字体大小的方法【测试可用】
Sep 09 Javascript
video.js使用改变ui过程
Mar 05 Javascript
简单的三步vuex入门
May 20 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
Aug 13 jQuery
Vue开发Html5微信公众号的步骤
Apr 11 Javascript
vue cli3.0 引入eslint 结合vscode使用
May 27 Javascript
JS实现可以用键盘方向键控制的动画
Dec 11 Javascript
JavaScript 判断浏览器是否是IE
Feb 19 Javascript
JavaScript轮播图简单制作方法
Feb 20 #Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
Feb 20 #Javascript
原生js实现放大镜
Feb 20 #Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
Feb 20 #Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
Feb 20 #Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
Feb 20 #Javascript
原生node.js案例--前后台交互
Feb 20 #Javascript
You might like
Php+SqlServer实现分页显示
2006/10/09 PHP
PHP统计当前在线用户数实例讲解
2015/10/21 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
基于jquery的多功能软键盘插件
2012/07/25 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
python学生管理系统
2019/01/30 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
在Pandas中处理NaN值的方法
2019/06/25 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
C,C++的几个面试题小集
2013/07/13 面试题
学生会个人自荐书范文
2014/02/12 职场文书
课程改革实施方案
2014/03/16 职场文书
社区党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
工作作风建设心得体会
2014/10/22 职场文书
2015年社区妇联工作总结
2015/04/21 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android