微信小程序 - 实现左滑动删除功能
生活随笔
收集整理的這篇文章主要介紹了
微信小程序 - 实现左滑动删除功能
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
微信小程序 - 實(shí)現(xiàn)左滑動刪除功能
效果圖:
實(shí)現(xiàn)過程:
一、wxml布局
這里我是先用了一個大盒子包裹小盒子,然后小盒子里面進(jìn)行左右布局(左邊為內(nèi)容部分,右邊為刪除按鈕)的方式實(shí)現(xiàn)的
<view class="cart"><view class="content"><!-- 通過 isTouchMove 的值來對應(yīng)移動位置--><view class="item {{item.isTouchMove ? 'touch-move-active' : ''}}" wx:for="{{dataList}}" wx:key="item.id"><view class="item-left" data-index="{{index}}" bindtouchstart="touchStart" bindtouchmove="touchMove"><view class="icon-check"><image src="{{noCheck}}"></image></view><view class="imgs"><image src="{{item.img}}"></image></view><view class="context"><view class="title">{{item.title}}</view><view class="bottoms"><view class="price">¥{{item.price}}</view><view class="num"><view class="opare">-</view><view class="opare nums">{{item.num}}</view><view class="opare">+</view></view></view></view></view><view class="delete" data-id="{{item.id}}" bindtap="delItem">刪除</view></view></view><view class="footer"></view> </view>二、wxss的寫法
wxss是用了flex布局,然后讓左邊的內(nèi)容部分的寬度占100%,左外邊距為刪除按鈕的寬度,右邊設(shè)置固定寬度,通過動畫的方式將右邊的刪除按鈕往右偏移刪除按鈕的寬度,使之看不到,最后通過 動態(tài)設(shè)置 .touch-move-active 實(shí)現(xiàn)滑動效果。
.cart {width: 100%;height: 100%;box-sizing: border-box; }.item {margin-bottom: 15rpx;background-color: #fff;padding: 20rpx 10rpx;padding-right: 0;display: flex;box-sizing: border-box;height: 220rpx; }/* 除刪除按鈕之外的其他部分 */ .item-left {display: flex;justify-content: start;align-items: center;/* 關(guān)鍵代碼 start */width: 100%;margin-left: -140rpx;transform: translateX(140rpx);-webkit-transition: all 0.4s;transition: all 0.4s;-webkit-transform: translateX(140rpx);/* 關(guān)鍵代碼 end */ }.item-left .icon-check {width: 80rpx;height: 80rpx;display: flex;justify-content: center;align-items: center; }.icon-check image {width: 45rpx;height: 45rpx;display: block; }.imgs {width: 200rpx;height: 200rpx;display: flex;justify-content: center;align-items: center; }.imgs image {width: 200rpx;height: 200rpx;display: block; }.context {padding-left: 20rpx; }.context .title {color: #333;font-size: 34rpx; }.context .bottoms {display: flex;padding-top: 20rpx; }.bottoms .price {width: 36rpx;color: #FD5761;padding-right: 100rpx;display: flex;justify-content: center;align-items: center; }.bottoms .num {display: flex;justify-content: start;align-items: center; }.bottoms .num .opare {padding: 10rpx 24rpx;border: 1rpx solid #ccc; }.num .nums {margin: 0 10rpx; }/* 刪除按鈕 */ .delete {height: 100%;width: 140rpx;background-color: rgb(241, 81, 81);display: flex;justify-content: center;align-items: center;font-size: 36rpx;color: #fff;/* 關(guān)鍵代碼 start */transform: translateX(150rpx);-webkit-transition: all 0.4s;transition: all 0.4s;-webkit-transform: translateX(150rpx);/* 關(guān)鍵代碼 end */ }/* 關(guān)鍵代碼 start --> 向左滑動 */ .touch-move-active .item-left, .touch-move-active .delete {-webkit-transform: translateX(0);transform: translateX(0); } /* 關(guān)鍵代碼 end */三、js的寫法
通過小程序自帶的touchStart和touchMove實(shí)現(xiàn)的,我就不一一解釋了,直接上代碼(ps:代碼中有對應(yīng)的注釋)
// pages/cart/cart.js Page({/*** 頁面的初始數(shù)據(jù)*/data: {dataList: [{id: 1,img: "https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/50649d7b5706f4cd9f658e93db6b6564.jpg?thumb=1&w=200&h=200&f=webp&q=90",title: "小米真無線藍(lán)牙耳機(jī) Air 2",price: 278,num: 1,isTouchMove: false, //默認(rèn)隱藏刪除checked: false},{id: 2,img: "https://cdn.cnbj0.fds.api.mi-img.com/b2c-mimall-media/321610e787393c42e5cb2e5730a7681d.jpg?thumb=1&w=200&h=200",title: "小米小愛藍(lán)牙音箱 隨身版",price: 49,num: 1,isTouchMove: false, //默認(rèn)隱藏刪除checked: false},{id: 3,img: "https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/1f32af53d1ad60f4980146f6a2b81019.jpg?thumb=1&w=200&h=200&f=webp&q=90",title: "小米無線充電寶青春版10000mAh",price: 129,num: 1,isTouchMove: false, //默認(rèn)隱藏刪除checked: false},{id: 4,img: "https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/c149537ebb0c2cdb977ddd93200074f4.jpg?thumb=1&w=200&h=200&f=webp&q=90",title: "小米旅行箱 20英寸 布朗熊限量版",price: 149,num: 1,isTouchMove: false, //默認(rèn)隱藏刪除checked: false}],// 設(shè)置開始的位置startX: 0,startY: 0,},// 開始滑動touchStart(e) {console.log('touchStart=====>', e);let dataList = [...this.data.dataList]dataList.forEach(item => {if (item.isTouchMove) {item.isTouchMove = !item.isTouchMove;}});this.setData({dataList: dataList,startX: e.touches[0].clientX,startY: e.touches[0].clientY})},touchMove(e) {console.log('touchMove=====>', e);let moveX = e.changedTouches[0].clientX;let moveY = e.changedTouches[0].clientY;let indexs = e.currentTarget.dataset.index;let dataList = [...this.data.dataList]let angle = this.angle({X: this.data.startX,Y: this.data.startY}, {X: moveX,Y: moveY});dataList.forEach((item, index) => {item.isTouchMove = false;// 如果滑動的角度大于30° 則直接return;if (angle > 30) {return}if (indexs === index) {if (moveX > this.data.startX) { // 右滑item.isTouchMove = false;} else { // 左滑item.isTouchMove = true;}}})this.setData({dataList})},/*** 計算滑動角度* @param {Object} start 起點(diǎn)坐標(biāo)* @param {Object} end 終點(diǎn)坐標(biāo)*/angle: function (start, end) {var _X = end.X - start.X,_Y = end.Y - start.Y//返回角度 /Math.atan()返回數(shù)字的反正切值return 360 * Math.atan(_Y / _X) / (2 * Math.PI);},// 刪除delItem(e) {let id = e.currentTarget.dataset.id;let dataList = [...this.data.dataList];console.log('id--->', id);for (let i = 0; i < dataList.length; i++) {const item = dataList[i];item.isTouchMove = false;if (item.id === id) {dataList.splice(i, 1);break;}}this.setData({dataList})} })總結(jié)
以上是生活随笔為你收集整理的微信小程序 - 实现左滑动删除功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现JavaScript数组拍平/扁平化
- 下一篇: 微信小程序长按保存图片