201 lines
4.4 KiB
Vue
201 lines
4.4 KiB
Vue
<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>
|
||
|