微信小程序滑动删除效果

来源:互联网 发布:mac lr怎么导入照片 编辑:程序博客网 时间:2024/04/19 12:53

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


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




item的布局:

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

[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. <view wx:for="{{cardTeams}}" wx:for-item="cardTeam" id="{{cardTeam.id}}" class="item" bindtouchstart="drawStart" bindtouchmove="drawMove" bindtouchend="drawEnd" style="right:{{cardTeam.right}}px">  
  2.         <image class="img" src="http://img02.tooopen.com/images/20150928/tooopen_sy_143912755726.jpg" mode="scaleToFill"></image>  
  3.         <view class="number-wrapper">  
  4.           <text class="name">{{cardTeam.name}}</text>  
  5.           <view class="count-wrapper">  
  6.             <view class="decrease-btn">-</view>  
  7.             <text class="count">1</text>  
  8.             <view class="increase-btn">+</view>  
  9.           </view>  
  10.           <view class="price-wrapper">  
  11.             <text class="unit">¥</text>  
  12.             <text class="price">99.80</text>  
  13.           </view>  
  14.         </view>  
  15.         <view class="ok"><view class="inner-ok">确定</view></view>  
  16.         <view class="remove" data-id="{{cardTeam.id}}" bindtap="delItem"><view>删除</view></view>  
  17.       </view>  


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


[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. .item .remove{  
  2.     width: 60px;  
  3.     height: 100%;  
  4.     background-color: red;  
  5.     position: absolute;  
  6.     top: 0;  
  7.     right: -60px;  
  8.     display: flex;  
  9.     justify-content: center;  
  10.     align-items: center;  
  11. }  

[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. Page({  
  2.   data: {  
  3.     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}]  
  4.   },  
  5.   drawStart : function(e){  
  6.      // console.log("drawStart");  
  7.     var touch = e.touches[0];  
  8.     startX = touch.clientX;  
  9.     startY = touch.clientY;  
  10.     var cardTeams = this.data.cardTeams;  
  11.     for(var i in cardTeams){  
  12.         var data = cardTeams[i];  
  13.         data.startRight = data.right;  
  14.     }  
  15.     key = true;  
  16.   },  
  17.   drawEnd : function(e){  
  18.     console.log("drawEnd");  
  19.     var cardTeams = this.data.cardTeams;  
  20.     for(var i in cardTeams){  
  21.         var data = cardTeams[i];  
  22.         if(data.right <= 100/2){  
  23.             data.right = 0;  
  24.         }else{  
  25.             data.right = maxRight;  
  26.         }  
  27.     }  
  28.     this.setData({  
  29.         cardTeams:cardTeams  
  30.     });  
  31.   },  
  32.   drawMove : function(e){  
  33.       //console.log("drawMove");  
  34.     var self = this;  
  35.     var dataId = e.currentTarget.id;  
  36.     var cardTeams = this.data.cardTeams;  
  37.     if(key){  
  38.         var touch = e.touches[0];  
  39.         endX = touch.clientX;  
  40.         endY = touch.clientY;  
  41.         console.log("startX="+startX+" endX="+endX );  
  42.         if(endX - startX == 0)  
  43.            return ;  
  44.         var res = cardTeams;  
  45.            //从右往左  
  46.   
  47.             if((endX - startX) < 0){  
  48.                 for(var k in res){  
  49.                     var data = res[k];  
  50.                     if(res[k].id == dataId){  
  51.                         var startRight = res[k].startRight;  
  52.                         var change = startX - endX;  
  53.                         startRight += change;  
  54.                         if(startRight > maxRight)  
  55.                             startRight = maxRight;  
  56.                         res[k].right = startRight;  
  57.                     }  
  58.                 }  
  59.             }else{//从左往右  
  60.                 for(var k in res){  
  61.                     var data = res[k];  
  62.                     if(res[k].id == dataId){  
  63.                         var startRight = res[k].startRight;  
  64.                         var change = endX - startX;  
  65.                         startRight -change;  
  66.                         if(startRight < 0)  
  67.                             startRight = 0;  
  68.                         res[k].right = startRight ;  
  69.                     }  
  70.                 }  
  71.             }  
  72.             self.setData({  
  73.                 cardTeams:cardTeams  
  74.             });  
  75.                       
  76.     }  
  77.   },  
  78.   //删除item  
  79.   delItem: function(e){  
  80.     var dataId = e.target.dataset.id;  
  81.     console.log("删除"+dataId);  
  82.     var cardTeams = this.data.cardTeams;  
  83.     var newCardTeams = [];   
  84.     for(var i in cardTeams){  
  85.         var item = cardTeams[i];  
  86.         if(item.id != dataId){  
  87.           newCardTeams.push(item);  
  88.         }  
  89.     }  
  90.     this.setData({  
  91.         cardTeams:newCardTeams  
  92.      });  
  93.   },  
  94.   onLoad: function () {  
  95.     console.log('onLoad:'+app.globalData.domain)  
  96.       
  97.   }  
  98. })  


drawStart用于记录手指触碰时的位置,drawMove记录手指滑动的位置,两者的差值就是删除按钮的偏移量

drawEnd手指抬起时触发,用于设置弹回、摊开效果。目前我的是超过一半自动弹开,不足一半自动收回。