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>
|
|||
|
|