201 lines
4.4 KiB
Vue
Raw Permalink Normal View History

2025-04-09 18:55:14 +08:00
<template>
<view>
<view class="box-slideLeft">
<view class="touch-item touch-slideLeft border-box" @touchstart="touchS" @touchmove="touchM" @touchend="touchE"
:style="item_show.txtStyle">
<slot/>
</view>
<view class="touch-item del-box-touch-slideLeft cf-shuCenter border-box" @click="delItem(item_show)">
<u-icon class="border-box" name="trash" size="44upx" color="#FFFFFF"></u-icon>
<!-- <view>解除绑定</view>-->
</view>
</view>
</view>
</template>
<script>
export default {
components: {},
props: {
data_transit: {
type: Object,
default() {
return {}
}
},
//可不传参
item: {
type: Object,
default() {
return {}
}
},
},
computed: {},
data() {
return {
item_show: {},
delBtnWidth: 60, //删除按钮宽度单位rpx
startX: '',
};
},
created: function () {
//专门处理检查对象中,某字段是否存在的,如果存在返回 true 不存在返回 false
let that = this;
let item = that.item;
if (!item.hasOwnProperty("txtStyle")) {
this.$set(this.item, 'txtStyle', '');//不需要初始化了
}
this.item_show = this.item;
},
watch: {
item(e) {
this.item_show = e;
},
},
methods: {
//点击删除按钮事件
delItem: function (e) {
let that = this;
let data = {
item: e,
data: that.data_transit,
};
this.$emit('delItem', data);
},
touchS: function (e) {
let that = this;
if (e.touches.length == 1) {
//设置触摸起始点水平方向位置
this.startX = e.touches[0].clientX
}
},
touchM: function (e) {
let that = this;
if (e.touches.length == 1) {
//手指移动时水平方向位置
var moveX = e.touches[0].clientX;
//手指起始点位置与移动期间的差值
var disX = this.startX - moveX;
var delBtnWidth = this.delBtnWidth;
var txtStyle = "";
if (disX == 0 || disX < 0) { //如果移动距离小于等于0说明向右滑动文本层位置不变
txtStyle = "left:0px";
} else if (disX > 0) { //移动距离大于0文本层left值等于手指移动距离
txtStyle = "left:-" + disX + "px";
if (disX >= delBtnWidth) {
//控制手指移动距离最大值为删除按钮的宽度
txtStyle = "left:-" + delBtnWidth + "px";
}
}
//获取手指触摸的是哪一项
that.item_show.txtStyle = txtStyle;
}
},
touchE: function (e) {
let that = this;
if (e.changedTouches.length == 1) {
//手指移动结束后水平位置
var endX = e.changedTouches[0].clientX;
//触摸开始与结束,手指移动的距离
var disX = this.startX - endX;
var delBtnWidth = this.delBtnWidth;
//如果距离小于删除按钮的1/2不显示删除按钮
var txtStyle = disX > delBtnWidth / 2 ? "left:-" + delBtnWidth + "px" : "left:0px";
//获取手指触摸的是哪一项
that.item_show.txtStyle = txtStyle;
}
},
}
}
</script>
<style lang="scss">
.box-slideLeft {
.border-box {
box-sizing: border-box;
}
position: relative;
overflow: hidden;
.touch-item {
position: absolute;
top: 0;
padding: 0 0 0 10px;
background-color: #FFFFFF;
overflow: hidden;
}
.touch-slideLeft {
position: relative;
width: 100%;
z-index: 5;
transition: left 0.2s ease-in-out;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.del-box-touch-slideLeft {
right: 2rpx;
float: left;
width: 70px;
height: 100%;
margin: 1px 0;
line-height: 101px;
background-color: #D51A00;
color: #fff;
font-size: 18px;
font-weight: lighter;
text-align: center;
}
.icon-shanchu {
font-size: 44upx;
}
.cf-shuCenter {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
}
:deep(.box-slideLeft .touch-item) {
padding: 0 !important;
}
:deep(.bank-item) {
margin-top: 0 !important;
}
:deep( .box-slideLeft .del-box-touch-slideLeft ){
height: 100% !important;
}
:deep(.box-slideLeft .icon-shanchu){
position: relative;
left: 5px;
}
:deep(.box-slideLeft .touch-item){
border-radius: 10px;
}
</style>