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


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 纠正 cleanWhitespace函数
Mar 11 Javascript
JS分页控件 可用于无刷新分页
Jul 23 Javascript
js通过iframe加载外部网页的实现代码
Apr 05 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
Sep 11 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
Oct 16 Javascript
JavaScript获取各大浏览器信息图示
Nov 20 Javascript
JavaScript实现公历转农历功能示例
Feb 13 Javascript
JS控制鼠标拒绝点击某一按钮的实例
Dec 29 Javascript
Node.js 使用axios读写influxDB的方法示例
Oct 26 Javascript
vue轻量级框架无法获取到vue对象解决方法
May 12 Javascript
JavaScript this在函数中的指向及实例详解
Oct 14 Javascript
javascript json对象小技巧之键名作为变量用法分析
Nov 11 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
编译问题
2006/10/09 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
PHP Curl多线程原理实例详解
2013/11/06 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
php中namespace及use用法分析
2016/12/06 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
jQuery回车实现登录简单实现
2013/08/20 Javascript
jQuery基于ajax实现星星评论代码
2015/08/07 Javascript
深入理解JavaScript中的浮点数
2016/05/18 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
js弹出窗口简单实现代码
2017/03/22 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
python清除字符串里非字母字符的方法
2015/07/02 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
python3的输入方式及多组输入方法
2018/10/17 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
文秘专业大学生求职信
2013/11/10 职场文书
学生党支部先进事迹
2014/02/04 职场文书
个人授权委托书
2014/04/03 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
爱情保证书大全
2014/04/29 职场文书
会议通知
2015/04/15 职场文书
爱心捐助活动总结
2015/05/09 职场文书
交通事故被告代理词
2015/05/23 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
《去年的树》教学反思
2016/02/18 职场文书