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


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 相关文章推荐
目前流行的JavaScript库的介绍及对比
Sep 29 Javascript
node.js中的fs.futimes方法使用说明
Dec 17 Javascript
js对象基础实例分析
Jan 13 Javascript
JavaScript中继承用法实例分析
May 16 Javascript
js实现YouKu的漂亮搜索框效果
Aug 19 Javascript
Knockoutjs 学习系列(一)ko初体验
Jun 07 Javascript
AngularJS模仿Form表单提交的实现代码
Dec 08 Javascript
JavaScript实现时钟滴答声效果
Jan 29 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
Jul 05 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
Aug 27 Javascript
如何用RxJS实现Redux Form
Dec 29 Javascript
解决vue单页面修改样式无法覆盖问题
Aug 05 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中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
PHP输出缓存ob系列函数详解
2014/03/11 PHP
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
使用控制台破解百小度一个月只准改一次名字
2015/08/13 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
Node.js+ELK日志规范的实现
2019/05/23 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
一个简单的python程序实例(通讯录)
2013/11/29 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
Sanic框架基于类的视图用法示例
2018/07/18 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
在Python dataframe中出生日期转化为年龄的实现方法
2018/10/20 Python
python实现键盘输入的实操方法
2019/07/16 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
澳大利亚优惠网站:Deals.com.au
2019/07/02 全球购物
.NET笔试题(20个问题)
2016/02/02 面试题
质检部岗位职责
2013/11/11 职场文书
员工培训邀请函
2014/01/11 职场文书
人事文员岗位职责
2014/02/16 职场文书
2014年优秀党员材料
2014/12/18 职场文书
2015年环境整治工作总结
2015/05/22 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
Django给表单添加honeypot验证增加安全性
2021/05/06 Python