微信小程序实现滑动删除效果


Posted in Javascript onMay 19, 2017

最初打算使用scroll-view实现,效果好、流畅、有惯性滑动,但由于滚动条没法去掉、无法实现上下层的帧布局,最终放弃了。

还是自己写个吧,利用手势事件。遗憾的是小程序中目前没有像Android中快速滑动事件,所以,要实现惯性滑动是不可能了。

微信小程序实现滑动删除效果

item的布局:

推荐小程序优先使用flex布局,完全够用。这也是微信推荐的。

<view wx:for="{{cardTeams}}" wx:for-item="cardTeam" id="{{cardTeam.id}}" class="item" bindtouchstart="drawStart" bindtouchmove="drawMove" bindtouchend="drawEnd" style="right:{{cardTeam.right}}px"> 
    <image class="img" src="http://img02.tooopen.com/images/20150928/tooopen_sy_143912755726.jpg" mode="scaleToFill"></image> 
    <view class="number-wrapper"> 
     <text class="name">{{cardTeam.name}}</text> 
     <view class="count-wrapper"> 
      <view class="decrease-btn">-</view> 
      <text class="count">1</text> 
      <view class="increase-btn">+</view> 
     </view> 
     <view class="price-wrapper"> 
      <text class="unit">¥</text> 
      <text class="price">99.80</text> 
     </view> 
    </view> 
    <view class="ok"><view class="inner-ok">确定</view></view> 
    <view class="remove" data-id="{{cardTeam.id}}" bindtap="delItem"><view>删除</view></view> 
   </view>

主要是将删除按钮的设为绝对定位(position: absolute):

.item .remove{ 
  width: 60px; 
  height: 100%; 
  background-color: red; 
  position: absolute; 
  top: 0; 
  right: -60px; 
  display: flex; 
  justify-content: center; 
  align-items: center; 
}
Page({ 
 data: { 
  cardTeams:[{"id":"aaaaa", "name":"android教程", "url":"http://www.see-source.com", "right":0, "startRight":0},{"id":"bbbb", "name":"小程序教程", "url":"http://www.see-source.com", "right":0, "startRight":0}] 
 }, 
 drawStart : function(e){ 
   // console.log("drawStart"); 
  var touch = e.touches[0]; 
  startX = touch.clientX; 
  startY = touch.clientY; 
  var cardTeams = this.data.cardTeams; 
  for(var i in cardTeams){ 
    var data = cardTeams[i]; 
    data.startRight = data.right; 
  } 
  key = true; 
 }, 
 drawEnd : function(e){ 
  console.log("drawEnd"); 
  var cardTeams = this.data.cardTeams; 
  for(var i in cardTeams){ 
    var data = cardTeams[i]; 
    if(data.right <= 100/2){ 
      data.right = 0; 
    }else{ 
      data.right = maxRight; 
    } 
  } 
  this.setData({ 
    cardTeams:cardTeams 
  }); 
 }, 
 drawMove : function(e){ 
   //console.log("drawMove"); 
  var self = this; 
  var dataId = e.currentTarget.id; 
  var cardTeams = this.data.cardTeams; 
  if(key){ 
    var touch = e.touches[0]; 
    endX = touch.clientX; 
    endY = touch.clientY; 
    console.log("startX="+startX+" endX="+endX ); 
    if(endX - startX == 0) 
      return ; 
    var res = cardTeams; 
      //从右往左 
 
      if((endX - startX) < 0){ 
        for(var k in res){ 
          var data = res[k]; 
          if(res[k].id == dataId){ 
            var startRight = res[k].startRight; 
            var change = startX - endX; 
            startRight += change; 
            if(startRight > maxRight) 
              startRight = maxRight; 
            res[k].right = startRight; 
          } 
        } 
      }else{//从左往右 
        for(var k in res){ 
          var data = res[k]; 
          if(res[k].id == dataId){ 
            var startRight = res[k].startRight; 
            var change = endX - startX; 
            startRight -= change; 
            if(startRight < 0) 
              startRight = 0; 
            res[k].right = startRight ; 
          } 
        } 
      } 
      self.setData({ 
        cardTeams:cardTeams 
      }); 
           
  } 
 }, 
 //删除item 
 delItem: function(e){ 
  var dataId = e.target.dataset.id; 
  console.log("删除"+dataId); 
  var cardTeams = this.data.cardTeams; 
  var newCardTeams = [];  
  for(var i in cardTeams){ 
    var item = cardTeams[i]; 
    if(item.id != dataId){ 
     newCardTeams.push(item); 
    } 
  } 
  this.setData({ 
    cardTeams:newCardTeams 
   }); 
 }, 
 onLoad: function () { 
  console.log('onLoad:'+app.globalData.domain) 
   
 } 
})

drawStart用于记录手指触碰时的位置,drawMove记录手指滑动的位置,两者的差值就是删除按钮的偏移量
drawEnd手指抬起时触发,用于设置弹回、摊开效果。目前我的是超过一半自动弹开,不足一半自动收回。

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

Javascript 相关文章推荐
jMessageBox 基于jQuery的窗口插件
Dec 09 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
Mar 14 Javascript
javascript中键盘事件用法实例分析
Jan 30 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
Mar 11 Javascript
JavaScript实现随机数生成器(去重)
Oct 13 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
Oct 15 jQuery
jQuery 导航自动跟随滚动的实现代码
May 30 jQuery
JS回调函数 callback的理解与使用案例分析
Sep 09 Javascript
详解javascript void(0)
Jul 13 Javascript
mapboxgl实现带箭头轨迹线的代码
Jan 04 Javascript
JavaScript组合继承详解
Nov 07 Javascript
React自定义hook的方法
Jun 25 Javascript
微信小程序图片横向左右滑动案例
May 19 #Javascript
layui导航栏实现代码
May 19 #Javascript
详解AngularJS controller调用factory
May 19 #Javascript
layer弹窗插件操作方法详解
May 19 #Javascript
layui选项卡效果实现代码
May 19 #Javascript
bootstrap table单元格新增行并编辑
May 19 #Javascript
layui弹出层效果实现代码
May 19 #Javascript
You might like
php中取得文件的后缀名?
2012/02/20 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
PHP中返回引用类型的方法
2015/04/03 PHP
利用“多说”制作留言板、评论系统
2015/07/14 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
可以用鼠标拖动的DIV实现思路及代码
2013/10/21 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
深入浅出讲解ES6的解构
2016/08/03 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
详解python进行mp3格式判断
2016/12/23 Python
Python变量类型知识点总结
2019/02/18 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
opencv3/C++ 平面对象识别&amp;透视变换方式
2019/12/11 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
2020/07/13 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
大二自我鉴定范文
2013/10/05 职场文书
中学老师的自我评价
2013/11/07 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
读书活动实施方案
2014/03/10 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
人才市场接收函
2015/01/30 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android