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


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 相关文章推荐
用window.location.href实现刷新另个框架页面
Mar 07 Javascript
用 JSON 处理缓存
Apr 27 Javascript
简明json介绍
Sep 28 Javascript
关于JavaScript的一些看法
May 27 Javascript
用js实现计算加载页面所用的时间
Apr 02 Javascript
JS中把字符转成ASCII值的函数示例代码
Nov 21 Javascript
JavaScript iframe数据共享接口实现方法
Jan 06 Javascript
JavaScript实现水平进度条拖拽效果
Jan 18 Javascript
简易Vue评论框架的实现(父组件的实现)
Jan 08 Javascript
浅谈React中的元素、组件、实例和节点
Feb 27 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
Apr 26 jQuery
关于vue 项目中浏览器跨域的配置问题
Nov 10 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下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
php文件操作实例代码
2012/05/10 PHP
php之CodeIgniter学习笔记
2013/06/17 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
js或css实现滚动广告的几种方案
2010/01/28 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
javascript实现在指定元素中垂直水平居中
2015/09/13 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
Javascript刷新页面的实例
2017/09/23 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
Python callable内置函数原理解析
2020/03/05 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
美国女性运动零售品牌:Lady Foot Locker
2017/05/12 全球购物
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
影视艺术学院毕业生自荐信
2013/11/13 职场文书
水污染治理专业毕业生推荐信
2013/11/14 职场文书
教师作风整顿个人剖析材料
2014/10/10 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书