小程序滴滴车主板块的银行卡管理左滑删除编辑
最近在类似于滴滴软件的一款小程序,工程确实有点大,很多东西都是第一次做。这次记录一下关于左滑删除的一个代码记录。主要的思想就是计算滑动距离的大小来使用css中的 transition 控制滑动的效果,主流的都是控制边距margin来达到左滑的效果。
根据我所拿到的ui,我所运用的是使用宽度和radius来达到左滑的效果,造一个属性值,并塞进遍历数组进行判断是true还是false来控制样式。
完成效果:
html
/* pages/my_GLYHK/my_GLYHK.wxss */ page{ background-color: #f4f6f7; } .content{ width: 690rpx; overflow: hidden; margin: 34rpx 30rpx 0 30rpx; } .item-box{ font-size: 28rpx; color: #ffffff; margin: 0 30rpx 20rpx 0; width: 930rpx; overflow: hidden; white-space:nowrap; display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex; -webkit-box-orient:vertical;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row; -webkit-flex-wrap:nowrap;-webkit-box-lines:multiple;-moz-flex-wrap:nowrap;flex-wrap:nowrap; -webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start; -webkit-box-align:top;-webkit-align-items:top;-ms-flex-align:top;align-items:top; -webkit-box-content:center;-webkit-align-content:center;-ms-flex-content:center;align-content:center; } .item-box .card-item{ font-size: 28rpx; color: #ffffff; /* width: 660rpx; border-radius: 10rpx; */ /* width: 470rpx; border-radius: 10rpx 0px 0px 10rpx; */ padding-left: 30rpx; padding-top: 40rpx; padding-bottom: 16rpx; transition:width 0.2s ease-in-out; -moz-transition:width 0.2s ease-in-out; /* Firefox 4 */ -webkit-transition:width 0.2s ease-in-out; /* Safari and Chrome */ -o-transition:width 0.2s ease-in-out; /* Opera */ } .item-box .txtStyleTrue{ width: 660rpx !important;border-radius: 10rpx !important; } .item-box .txtStyleFalse{ width: 470rpx !important;border-radius: 10rpx 0px 0px 10rpx !important; } .item-box:nth-child(1) .card-item{ background-color: #366ec1; } .item-box:nth-child(2) .card-item{ background-color: #ef4f4f; } .bank{ margin-bottom: 16rpx; } .names{ margin-bottom: 20rpx; } .card-num{ font-size: 34rpx; } .handle{ white-space:nowrap; } .handle .edit{ padding: 68rpx 28rpx; writing-mode: vertical-lr; text-align: center; background-color: #a8a8a8; } .handle .delect{ padding: 68rpx 28rpx; writing-mode: vertical-lr; text-align: center; background-color: #bdbdbd; border-radius: 0px 10rpx 10rpx 0px; }
js
/** * 页面的初始数据 */ data: { bankList:[ { 'bank':'中国建设银行(建安支行)', 'names':'章三', 'cardNum':'***** ******* ***** ***0910' }, { 'bank': '中国工商银行(建安支行)', 'names': '章三', 'cardNum': '***** ******* ***** ***0910' }, ], editIndex: 0, delBtnWidth:180//删除按钮宽度单位(rpx) }, /*自定义方法--start */ // touchS: function (e) { if (e.touches.length == 1) { this.setData({ stX: e.touches[0].clientX }); } }, touchM: function (e) { console.log("touchM:" + e); var that = this if (e.touches.length == 1) { //记录触摸点位置的X坐标 var moveX = e.touches[0].clientX; //计算手指起始点的X坐标与当前触摸点的X坐标的差值 var disX = that.data.stX - moveX; //delBtnWidth 为右侧按钮区域的宽度 var delBtnWidth = that.data.delBtnWidth; var txtStyle = "true"; if(disX == 0 || disX < 0){ //如果移动距离小于等于0,文本层位置不变 width: 660rpx;border-radius: 10rpx; // txtStyle = "left:0px"; txtStyle = "true"; }else if(disX > 0 ){ //移动距离大于0,文本层left值等于手指移动距离 width: 470rpx;border-radius: 10rpx 0px 0px 10rpx; // txtStyle = "left:-"+disX+"px"; txtStyle = "false"; // if(disX>=delBtnWidth){ // //控制手指移动距离最大值为删除按钮的宽度 // txtStyle = "left:-"+delBtnWidth+"px"; // } } //获取手指触摸的是哪一个item var index = e.currentTarget.dataset.index; var list = that.data.bankList; //将拼接好的样式设置到当前item中 list[index].txtStyle = txtStyle; //更新列表的状态 this.setData({ bankList:list }); // console.log(this.data.bankList) } }, touchE: function (e) { console.log("touchE" + e); var that = this if (e.changedTouches.length == 1) { //手指移动结束后触摸点位置的X坐标 var endX = e.changedTouches[0].clientX; //触摸开始与结束,手指移动的距离 var disX = that.data.stX - endX; var delBtnWidth = that.data.delBtnWidth; //如果距离小于删除按钮的1/2,不显示删除按钮 var txtStyle = disX > delBtnWidth/2 ? "true":"false"; //获取手指触摸的是哪一项 var index = e.currentTarget.dataset.index; var list = that.data.bankList; list[index].txtStyle = txtStyle; //更新列表的状态 that.setData({ bankList:list }); } }, /*自定义方法--end */
感谢博文:https://www.jianshu.com/p/07c4ddf8a3d3
提供的思路和方法,以上多数js方法摘自此博文。当然css的控制也是很重要的