微信小程序 向左滑动删除功能

本文介绍了一种基于WXMLTouch实现的滑动删除功能,通过bindtouchstart和bindtouchmove事件结合CSS3动画实现列表项的左滑显示删除按钮效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

wxml touch-item元素绑定了bindtouchstart、bindtouchmove事件

<viewclass="container">
 <viewclass="touch-item {{item.isTouchMove ? 'touch-move-active' : ''}}"data-index="{{index}}"bindtouchstart="touchstart"bindtouchmove="touchmove"wx:for="{{items}}"wx:key="">
  <viewclass="content">{{item.content}}</view>
  <viewclass="del"catchtap="del"data-index="{{index}}">删除</view>
 </view>
</view>

wxss flex布局、css3动画

.touch-item {
 font-size:14px;
 display: flex;
 justify-content: space-between;
 border-bottom:1pxsolid#ccc;
 width:100%;
 overflow:hidden
}
.content {
 width:100%;
 padding:10px;
 line-height:22px;
 margin-right:0;
 -webkit-transition:all0.4s;
 transition:all0.4s;
 -webkit-transform: translateX(90px);
 transform: translateX(90px);
 margin-left:-90px
}
.del {
 background-color: orangered;
 width:90px;
 display: flex;
 flex-direction: column;
 align-items:center;
 justify-content:center;
 color:#fff;
 -webkit-transform: translateX(90px);
 transform: translateX(90px);
 -webkit-transition:all0.4s;
 transition:all0.4s;
}
.touch-move-active .content,
.touch-move-active .del {
 -webkit-transform: translateX(0);
 transform: translateX(0);
}

JS

var app = getApp()
Page({
 data: {
  items: [],
  startX: 0,//开始坐标
  startY: 0
 },
 onLoad:function() {
  for(vari = 0; i < 10; i++) {
   this.data.items.push({
    content: i +" 向左滑动删除哦,向左滑动删除哦,向左滑动删除哦,向左滑动删除哦,向左滑动删除哦",
    isTouchMove:false//默认全隐藏删除
   })
  }
  this.setData({
   items:this.data.items
  })
 },
 //手指触摸动作开始 记录起点X坐标
 touchstart:function(e) {
  //开始触摸时 重置所有删除
  this.data.items.forEach(function(v, i) {
   if(v.isTouchMove)//只操作为true的
    v.isTouchMove =false;
  })
  this.setData({
   startX: e.changedTouches[0].clientX,
   startY: e.changedTouches[0].clientY,
   items:this.data.items
  })
 },
 //滑动事件处理
 touchmove:function(e) {
  varthat =this,
   index = e.currentTarget.dataset.index,//当前索引
   startX = that.data.startX,//开始X坐标
   startY = that.data.startY,//开始Y坐标
   touchMoveX = e.changedTouches[0].clientX,//滑动变化坐标
   touchMoveY = e.changedTouches[0].clientY,//滑动变化坐标
   //获取滑动角度
   angle = that.angle({ X: startX, Y: startY }, { X: touchMoveX, Y: touchMoveY });
  that.data.items.forEach(function(v, i) {
   v.isTouchMove =false
   //滑动超过30度角 return
   if(Math.abs(angle) > 30)return;
   if(i == index) {
    if(touchMoveX > startX)//右滑
     v.isTouchMove =false
    else//左滑
     v.isTouchMove =true
   }
  })
  //更新数据
  that.setData({
   items: that.data.items
  })
 },
 /**
  * 计算滑动角度
  * @param {Object} start 起点坐标
  * @param {Object} end 终点坐标
  */
 angle:function(start, end) {
  var_X = end.X - start.X,
   _Y = end.Y - start.Y
  //返回角度 /Math.atan()返回数字的反正切值
  return360 * Math.atan(_Y / _X) / (2 * Math.PI);
 },
 //删除事件
 del:function(e) {
  this.data.items.splice(e.currentTarget.dataset.index, 1)
  this.setData({
   items:this.data.items
  })
 }
})

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值