前言:实现小程序滑动删除有几种方式,文章会简单列举两种实现,先看效果。
一、使用movable-view实现滑动
先看官方文档
简单解读一下movable-area
标签的基本概念。movable-area
标签就是定义了一个可移动的视图容器,支持在页面中拖拽滑动,跟普通的view
容器是一样的,但是也有不同之处,movable-area
必须设置width和height属性,不设置默认为10px;movable-view
默认为绝对定位,top和left属性为0px。
<movable-area> <movable-view out-of-bounds="true" direction="horizontal" inertia="true"> </movable-view> </movable-area>
我们需要用的一些属性out-of-bounds
,给他定义true
,让我们的容器超过可移动区域后,movable-view还可以移动,direction
属性是定义我们滑动的方向,vertical
是垂直滑动,horizontal
是水平滑动。
二、使用Touch事件实现滑动
1.bindtouchstart
函数,手指触摸动作开始
2.bindtouchmove
函数,手指触摸后移动
3.bindtouchend
函数,手指触摸动作结束
实现思路:
1.页面上的容器分为上下两层,上面一层显示正常加载无动作的内容,下面一层显示容器触发事件后展示的内容,例如删除、置顶、标为未读等按钮。
2.每个容器上面那一层容器我们通过css使用定位来固定,通过操纵事件来实现向需要移动的方向移动。
3.通过官方文档提供的API来实现容器随着方向移动。
完整代码如下
1.wxml
<view class=""> <view class="containerTitle">使用movable-view实现左滑</view> <view class="list"> <view class="product-item" wx:for="{{productList}}" wx:for-index="index" wx:key="{{item.id}}" > <movable-area> <movable-view out-of-bounds="true" direction="horizontal" x="{{item.xmove}}" inertia="true" data-productIndex="{{index}}" bindtouchstart="handleTouchStart" bindtouchend="handleTouchEnd" bindchange="handleMovableChange"> <view class="product-item-wrap"> <view class="product-movable-item"> <view class="product-movable-item-name">{{item.name}}</view> <view class="product-movable-item-code">{{item.code}}</view> </view> <view class="product-movable-item product-movable-item-amount"> <text class="amount">{{item.amount}}</text> <text class="unit">万</text> </view> </view> </movable-view> </movable-area> <view class="delete-btn" data-id="{{item.id}}" bindtap="handleDeleteProduct">删除</view> </view> </view> <view class="containerTitle">使用Touch事件实现左滑</view> <view class="list"> <view class="product-item" wx:for="{{slideProductList}}" wx:for-index="index" wx:key="{{item.id}}"> <slide-delete pid="{{item.id}}" bindaction="handleSlideDelete" wx:key="{{item.id}}"> <view class="product-item-wrap"> <view class="product-movable-item"> <view class="product-movable-item-name">{{item.name}}</view> <view class="product-movable-item-code">{{item.code}}</view> </view> <view class="product-movable-item product-movable-item-amount"> <text class="amount">{{item.amount}}</text> <text class="unit">万</text> </view> </view> </slide-delete> </view> </view> </view>
2.wxss
.containerTitle { margin: 60rpx 0 30rpx; font-size: 40rpx; text-align: center; font-weight: bold; color: #383A3D; } .list .product-item { position: relative; width: 100vw; border-bottom: 2rpx solid #E9E9E9; box-sizing: border-box; background: #fff; z-index: 999; } .slide-product-list .slide-product-item { position: relative; width: 100vw; border-bottom: 2rpx solid #E9E9E9; box-sizing: border-box; background: #fff; z-index: 999; } .list .product-item movable-area { height: 120rpx; width: calc(100vw - 120rpx); } .list .product-item movable-view { height: 120rpx; width: 100vw; background: #fff; z-index: 999; } .list .product-item .delete-btn { position: absolute; top: 0; bottom: 0; right: 0; width: 120rpx; font-family: PingFangSC-Regular; font-size: 24rpx; color: #FFFFFF; line-height: 120rpx; z-index: 1; background: red; text-align: center; } .list .product-item-wrap { position: relative; display: flex; align-items: center; padding: 8rpx 0 20rpx 20rpx; box-sizing: border-box; } .list .product-item-wrap .product-movable-item { flex: 1; overflow: hidden; } .list .product-item-wrap .product-movable-item-name { font-family: PingFangSC-Regular; font-size: 28rpx; color: #71747A; line-height: 60rpx; margin-right: 10rpx; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .list .product-item-wrap .product-movable-item-code { font-family: PingFangSC-Regular; font-size: 24rpx; color: #969AA3; } .list .product-item-wrap .product-movable-item-amount { flex: 0 0 auto; padding-right: 80rpx; position: relative; } .list .product-item-wrap .product-movable-item-amount .amount { width: 120rpx; font-size: 28rpx; color: #383A3D; line-height: 60rpx; } .list .product-item-wrap .product-movable-item-amount .unit { position: absolute; top: 0; right: 30rpx; font-size: 28rpx; color: #969AA3; line-height: 60rpx; }
3.js代码
//获取应用实例 const app = getApp() Page({ data: { productList: [ { id: 1, name: '31省市区新增境外输入13例', code: 'Jin日头条', amount: 5 }, { id: 2, name: '饲养员遭熊攻击身亡', code: 'bai度新闻', amount: 4 }, { id: 3, name: '安倍晋三参拜靖国神社', code: '日媒', amount: 10 } ], slideProductList: [ { id: 4, name: '老兵回忆参加抗美援朝说今生无悔', code: 'xin微博', amount: 101 }, { id: 5, name: '女子下楼时玩手机踩空摔伤', code: 'zz资讯', amount: 500 }, { id: 6, name: '杨紫为离线庆生', code: 'xx新闻', amount: 110 } ] }, onLoad: function () { }, /** * 显示删除按钮 */ showDeleteButton: function (e) { let productIndex = e.currentTarget.dataset.productindex this.setXmove(productIndex, -65) }, /** * 隐藏删除按钮 */ hideDeleteButton: function (e) { let productIndex = e.currentTarget.dataset.productindex this.setXmove(productIndex, 0) }, /** * 设置movable-view位移 */ setXmove: function (productIndex, xmove) { let productList = this.data.productList productList[productIndex].xmove = xmove this.setData({ productList: productList }) }, /** * 处理movable-view移动事件 */ handleMovableChange: function (e) { if (e.detail.source === 'friction') { if (e.detail.x < -30) { this.showDeleteButton(e) } else { this.hideDeleteButton(e) } } else if (e.detail.source === 'out-of-bounds' && e.detail.x === 0) { this.hideDeleteButton(e) } }, /** * 处理touchstart事件 */ handleTouchStart(e) { this.startX = e.touches[0].pageX }, /** * 处理touchend事件 */ handleTouchEnd(e) { if(e.changedTouches[0].pageX < this.startX && e.changedTouches[0].pageX - this.startX <= -30) { this.showDeleteButton(e) } else if(e.changedTouches[0].pageX > this.startX && e.changedTouches[0].pageX - this.startX < 30) { this.showDeleteButton(e) } else { this.hideDeleteButton(e) } }, /** * 删除产品 */ handleDeleteProduct: function ({ currentTarget: { dataset: { id } } }) { let productList = this.data.productList let productIndex = productList.findIndex(item => item.id === id) productList.splice(productIndex, 1) this.setData({ productList }) if (productList[productIndex]) { this.setXmove(productIndex, 0) } }, /** * slide-delete 删除产品 */ handleSlideDelete({ detail: { id } }) { let slideProductList = this.data.slideProductList let productIndex = slideProductList.findIndex(item => item.id === id) slideProductList.splice(productIndex, 1) this.setData({ slideProductList }) } })
总结
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]