效果展示

组件地址

组件已上传至码云,需要可自行下载码云地址

解析需求

  • WXML结构由一个大盒子包裹两个小盒子 分别为承载数据的展示盒子以及删除盒子
  • WXSS样式由大盒子负责整体定位居中 给一个相对定位,两个子盒子用绝对定位相对于父盒子布局
  • JS需要给展示盒子绑定三个事件 以达到监听所有的触摸滑动操作做出响应,分别为bindtouchstart,bindtouchmove,bindtouchend,通过滑动的x轴的像素点决定调用创建动画方法将盒子位移到目标位置(实现动画的方式由两种 一种是用css3的动画,还有就是就是js创建动画,这里选用js的方式创建动画并绑定到dom中的方式实现的原因是css3对于动态数据进行动画方面不如js,如果用css3,那么将会大量的使用setDate刷新dom,在js上只需要重新创建动画即可,性能更佳,同时过渡顺滑)非常优雅~

开始撸代码

这个项目我封装成了一个组件 ,一方面是方便复用,二是抽离解耦内聚方便维护

这里使用一个block遍历 list 以index为key循环渲染卡片,item盒子作为父盒子包裹 box以及delete盒子作为结构,box盒子与item盒子等大,这样修改层级将可以让item盒子覆盖delete盒子

WXML代码部分

<block wx:for="{{list}}" wx:key="index"><view class="item"><view class="box" data-index="{{index}}" bindtouchstart='touchstart' bindtouchmove='touchmove' bindtouchend='touchend' animation="{{item.aniMation}}"><image class="img" mode="aspectFit" src="{{item.src}}"></image><view class="msgBox"><view class="name">{{item.name}}<text class="dutyName">-{{item.dutyName}}</text></view><view>{{item.phone}}</view></view></view><view class="delete" data-index="{{index}}" bindtap="delete">删除</view></view>
</block>

WXSS代码部分

page给个背景色让卡片由对比 这里统一使用rpx布局 可以适应不同分辨率的设备,主要采用margin+子绝父相的形式布局,注意的是用z-index控制层级 box层级需要大于delete盒子

page {background-color: #F5F5F7;
}.box {width: 702rpx;height: 180rpx;display: flex;position: absolute;top: 0;left: 0;z-index: 2;align-items: center;padding: 0 24rpx;box-sizing: border-box;border-radius: 20rpx;background-color: #fff;border: 1rpx solid #fff;
}.delete {position: absolute;top: 0rpx;right: 0rpx;z-index: 1;width: 180rpx;height: 180rpx;border-radius: 0 20rpx 20rpx 0;background-color: #cd4525;color: #fff;text-align: center;line-height: 180rpx;
}.img {width: 120rpx;height: 120rpx;border-radius: 8rpx;margin-right: 20rpx;}.msgBox {display: flex;flex-direction: column;height: 120rpx;justify-content: center;color: #333333;font-size: 28rpx;
}.name {margin-bottom: 10rpx;
}.dutyName {font-size: 24rpx;color: #666666;
}.item {position: relative;width: 702rpx;height: 180rpx;margin: 0 auto 20rpx auto;display: flex;flex-direction: row;
}

JSON代码部分

开启微信的组件功能

{"component": true,"usingComponents": {}
}

JS代码部分

该组件接受一个list用于循环渲染卡片列表,当点击删除的时候会返回一个delete方法并将删除的数据传递回去供父页面做操作,同时监听了box盒子的三个事件 (坐标是基于左上角为0 ,0 原点开始的)

  • bindtouchstart -> 触摸开始事件 在这个时候记录可能会滑动的卡片index值以及开始触摸点x轴的坐标
  • bindtouchmove -> 触摸滑动事件 当手指按住滑动的时候 会触发这个事件返回最新的x轴坐标 我们要将事件返回的x轴坐标存储起来同时我们判断滑动的值如果大于0那么我们让卡片做一个跟手的动画 将值传递给创造动画的方法中,这里获取到的是px值所以传递createAnimationPX方法让box盒子向左滑动
  • touchend -> 触摸结束事件 当手指离开屏幕的时候会返回离开屏幕的时候最后的坐标 根据坐标计算出移动的距离,通过移动的距离来判断是左移还是复位
// shipment/components/staffBox/staffBox.js
Component({/*** 组件的属性列表*/properties: {list: {type: Array,value: [{src: 'https://img2.baidu.com/it/u=2783448435,3957437405&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500',name: '老张',dutyName: '调度',phone: '13197372226',id: 1},{src: 'https://img2.baidu.com/it/u=2783448435,3957437405&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500',name: '老王',dutyName: '调度',phone: '13197372226',id: 2},{src: 'https://img2.baidu.com/it/u=2783448435,3957437405&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500',name: '老李',dutyName: '调度',phone: '13197372226',id: 3},]},},/*** 组件的初始数据*/data: {index: -1,Xstart: 0,isAnimation: false,aniMation: {},id: -1},/*** 组件的方法列表*/methods: {getPx(rpx) {let pxwx.getSystemInfo({success(res) {px = rpx * (res.windowWidth / 750)}})return Number(px)},touchstart(e) {if (this.data.isAnimation) {this.createAnimationPX(0)}this.setData({index: e.currentTarget.dataset.index,Xstart: e.changedTouches[0].pageX});},touchmove(e) {//  从右往左的移动距离 = 触摸初始位置x坐标 - 当前位置的x坐标let move = this.data.Xstart - e.changedTouches[0].pageX;// 当从右往左位移大于0px的时候 调用方法创建动画if (move > 0) {this.createAnimationPX(-move)} else {// 当从左往右滑动的时候将让卡片复位this.createAnimationPX(0)}},touchend(e) {//  从右往左的移动距离 = 触摸初始位置x坐标 - 当前位置的x坐标let move = this.data.Xstart - e.changedTouches[0].pageX;// 当位移大于50px的时候认为展示删除按钮if (move > 50) {this.createAnimation(-160)} else {// 复位this.createAnimation(0)}},// 创建一个左滑动画基于 rpx单位createAnimation(changeX) {let list = this.properties.list;if (list.length != 0) {let ani = wx.createAnimation({delay: 0,timingFunction: 'ease',}).translateX(this.getPx(changeX)).step().export()list[this.data.index].aniMation = anithis.setData({list,isAnimation: true})}},// 创建一个左滑的动画 基于px单位createAnimationPX(changeX) {let list = this.properties.list;if (list.length != 0) {let ani = wx.createAnimation({delay: 0,timingFunction: 'linear',duration: 45}).translateX(changeX).step().export()list[this.data.index].aniMation = anithis.setData({list,isAnimation: true})}},delete(e) {let itemIndex = e.currentTarget.dataset.indexlet arr = []let list = this.properties.listlist.map((item, index) => {if (index != itemIndex) {arr.push(item)}})this.setData({list: arr,isAnimation: true})wx.showToast({title: '已成功删除' + list[itemIndex].name,})this.createAnimation(0)this.triggerEvent('delete', {date: this.properties.list[itemIndex],index: itemIndex,list: arr})}}
})

论如何优雅的实现左滑删除(微信小程序)相关推荐

  1. 如何让小程序页面更顺滑_微信小程序|实现界面滑动切换

    问题描述 在许多用户体验效果较好的微信小程序中,用户通过左右滑动界面也能实现页面的切换,方便了用户使用,那它们是如何实现的呢? 解决方案 图 1   标签页切换 在图1中,顶部的 3 个标签页标题用  ...

  2. 小程序怎么清服务器缓存,怎么清理微信小程序缓存 微信小程序缓存删除的方法...

    微信小程序上线之后,关注的小程序越多,哪么将占用的手机空间就越大,这些程序会产生一定的缓存,那么怎么清理小程序缓存呢?微信小程序内的缓存到底如何清除?和小编一起来看看删除微信小程序缓存的方法吧. 一些 ...

  3. 微信小程序左滑删除效果的实现完整源码附效果图

    效果图: 功能描述,小程序列表左滑删除功能的实现完整源代码实现: <view wx:for='{{friends}}' wx:key="" wx:if='{{groupTyp ...

  4. html仿微信滑动删除,使用Vue实现移动端左滑删除效果附源码

    左滑删除在移动端是很常见的一种操作,常见于删除购物车中的商品,删除收藏夹中文章等等场景.我们只需要手指按住要删除的对象,然后轻轻向左滑动,便会出现删除按钮,然后点击删除按钮即可删除对象. 点击下载源码 ...

  5. Android开发学习之路-PopupWindow和仿QQ左滑删除

    这周作业,要做一个类似QQ的左滑删除效果的ListView,因为不想给每个item都放一个按钮,所以决定用PopupWindow,这里记录一下 先放一下效果图: 先说明一下这里面的问题: ①没有做到像 ...

  6. 微信小程序独家秘笈之左滑删除

    代码地址如下: http://www.demodashi.com/demo/14056.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...

  7. android listview标题置顶,Android仿QQ左滑删除置顶ListView操作

    最近闲来无事,于是研究了一下qq的左滑删除效果,尝试着实现了一下,先上效果图: 大致思路原理: - 通过设置margin实现菜单的显示与隐藏 - 监听onTouchEvent,处理滑动事件 上代码 i ...

  8. android 自定义 滑动删除,Android_Android ListView实现仿iPhone实现左滑删除按钮的简单实例,需要自定义ListView。这里就交Fl - phpStudy...

    Android ListView实现仿iPhone实现左滑删除按钮的简单实例 需要自定义ListView.这里就交FloatDelListView吧. 复写onTouchEvent方法.如下: @Ov ...

  9. 小程序uniapp实现左滑删除效果

    小程序uniapp实现左滑删除效果 实现效果 1,列表中侧滑删除 2,删除不同时存在 3,上下滑动与侧滑删除不影响 在本页面引入组件并使用 (文件在文章的最下方附上) 在需要左滑删除的地方使用 < ...

最新文章

  1. python程序设计 清华大学出版社 pdf下载-清华大学出版社-图书详情-《Python 程序设计》...
  2. 求水仙花数 以及 最大公约数最小公倍数 以及 冒泡法 以及字母大小写的转换 以及简单选择排序法 以及斐波那契数列
  3. linux执行指定程序的命令,linux 下使用指定的用户来执行命令
  4. matplotlib tricks(一)—— 多类别数据的 scatter(cmap)
  5. 使用frp通过ssh访问公司内网机器
  6. GitHub 标星 8w!这个开源面试总结屌爆了!
  7. html 高度塌陷,CSS之高度塌陷问题解决方案
  8. JavaScript内置对象之Array对象总结(附实例)
  9. Docker安装Tomcat7
  10. 使用winpcap开发网络抓包工具
  11. visio安装问题总结
  12. c++ 计算多图形面积
  13. C# winform excel根据当前选中内容,自动插入/编辑批注
  14. 四月之 诗四首和五十六句话
  15. 关于不同局域网内经Internet的P2P通信技术
  16. Windows 连接 手机Termux 无需root 详细教程【橘小白】
  17. TCPC-可用于笔记本,平板等HOST端的解决方案
  18. Mac下手动安装Tex/Latex Package
  19. Ubuntu16.04 安装 CUDA、CUDNN、OpenCV 并用 Anaconda 配置 Tensorflow 和 Caffe 详细过程
  20. JS的3种加密方式:base64编码、md5加密及sha加密

热门文章

  1. 第二次作业——个人项目实战:数独
  2. 用千千静听修改mp3的属性
  3. 使用python爬取猫眼电影、房王、股吧论坛、百度翻译、有道翻译、高德天气、华夏基金、扇贝单词、糗事百科(猫眼电影)
  4. 管理类联考——英语——趣味篇——不择手段——a开头单词
  5. 如何查看Linux 硬件配置信息
  6. Leetcode第239场周赛 总结 + 补题
  7. OSPF高级特性——快速收敛与网络稳定性
  8. java面试题及答案(练习使用)
  9. H5 在ios上自动播放视频
  10. html图片如何转换成word文档格式,怎么将Word文档里的图片格式改成文字格式?