美文网首页
原生实现左滑删除swipeRemove.vue组件

原生实现左滑删除swipeRemove.vue组件

作者: 孙雨乐 | 来源:发表于2019-10-05 20:09 被阅读0次

1、模板HTML结构

<template>
    <div class="delete">
        <div class="slider">
            <div class="content"
                @touchstart='touchStart'
                @touchmove='touchMove'
                @touchend='touchEnd'
                :style="deleteSlider">
                <!-- 插槽中放具体项目中需要内容 -->
                <slot></slot>
            </div>
            <div class="remove" ref='remove'>删除</div>
        </div>
    </div>
</template>

2、css样式,这里使用less,rem适配 1rem = 100px。

.delete {
    border-bottom: #f1f1f1 1px solid;
    background-color: #ffffff;
}
.slider {
    width: 100%;
    height: .7rem;
    position: relative;
    user-select: none;
    .content {
        position: absolute;
        left: 0;
        right: 0;
        top: 0;
        bottom: 0;
        z-index: 100;
        //    设置过渡动画
        transition: 0.3s;
        .remove {
            position: absolute;
            width: 1rem;
            height: .695rem;
            background: #FE3824;
            right: -1rem;
            top: 0;
            color: #fff;
            text-align: center;
            font-size: .12rem;
            line-height: .7rem;
        }
    }
}

3、js部分

<script type="text/ecmascript-6">
export default {
    name: "swipeRemove",
    data() {
        return {
            startX: 0,   //触摸位置
            endX: 0,     //结束位置
            moveX: 0,   //滑动时的位置
            disX: 0,    //移动距离
            deleteSlider: ''//滑动时的效果,使用v-bind:style="deleteSlider"
        };
    },
    methods: {
        touchStart(ev) {
            ev = ev || event;
            //tounches类数组,等于1时表示此时有只有一只手指在触摸屏幕
            if (ev.touches.length === 1) {
                // 记录开始位置
                this.startX = ev.touches[0].clientX;
            }
        },
        touchMove(ev) {
            ev = ev || event;
            //获取删除按钮的宽度,此宽度为滑块左滑的最大距离
            let wd = this.$refs.remove.offsetWidth;
            if (ev.touches.length === 1) {
                // 滑动时距离浏览器左侧实时距离
                this.moveX = ev.touches[0].clientX;
                //起始位置减去 实时的滑动的距离,得到手指实时偏移距离
                this.disX = this.startX - this.moveX;
                console.log(this.disX);
                // 如果是向右滑动或者不滑动,不改变滑块的位置
                if (this.disX < 0 || this.disX === 0) {
                    this.deleteSlider = 'transform:translateX(0px)';
                    // 大于0,表示左滑了,此时滑块开始滑动
                } else if (this.disX > 0) {
                    //具体滑动距离我取的是 手指偏移距离*5。
                    this.deleteSlider = 'transform:translateX(-' + this.disX * 5 + 'px)';
                    // 最大也只能等于删除按钮宽度
                  if (this.disX * 5 >= wd) {
                      this.deleteSlider = 'transform:translateX(-' + wd + 'px)';
                  }
                }
            }
        },
        touchEnd(ev) {
            ev = ev || event;
            let wd = this.$refs.remove.offsetWidth;
            if (ev.changedTouches.length === 1) {
                let endX = ev.changedTouches[0].clientX;
                this.disX = this.startX - endX;
                console.log(this.disX);
                //如果距离小于删除按钮一半,强行回到起点
                if ((this.disX * 5) < (wd / 2)) {
                    this.deleteSlider = 'transform:translateX(0px)';
                } else{
                    //大于一半 滑动到最大值
                    this.deleteSlider = 'transform:translateX(-' + wd + 'px)';
                }
            }
        },
        removeItem() { //向上触发删除事件
            this.$emit('removeItem')
        }
    }
};
</script>

所用到的只是主要是移动端touches事件对象,其中:
touches:当前屏幕上所有触摸点的集合,单手时我们取touches[0]即为当前触摸点的信息,在touchStarttouchMove事件中都是可以获取到该信息的,但当手指离开屏幕时,即touchEnd事件发生时,touches中的元素随之消失。此时要获取手指的位置则要使用changedTouches,代表涉及当前(引发)事件的触摸点的集合

4、效果图

屏幕快照 2019-09-11 下午5.05.45.png
屏幕快照 2019-09-11 下午5.06.00.png

相关文章

网友评论

      本文标题:原生实现左滑删除swipeRemove.vue组件

      本文链接:https://www.haomeiwen.com/subject/qwaiyctx.html