43

Vue.js移动端左滑删除组件

clipboard.png

左滑删除在移动端很常见。下面我们一起来封装一下这个简单的小组件。我们想要是:
 
  • 当滑块没有超过删除按钮的一半时自动回到起点位置。
  • 滑动距离超过一半滑动到最大值(删除按钮宽度)
  • 尽量精简代码

在开始之前,我们先得将 [touchEventApi][1]弄清楚了。这个小组件中,用到了:

1.  TouchEvent.touches (表示一 个 TouchList 对象,包含了所有当前接触触摸平面的触点的Touch对象)

2.  TouchEvent.changedTouches (一个 TouchList 对象,包含了代表所有从上一次触摸事件到此次事件过程中,
    状态发生了改变的触点的 Touch 对象。)



话不多说,直接上代码:

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

然后是css,这里我使用的是less

<style scoped lang="less" scoped>
    .slider{
        width: 100%;
        height:200px;
        position: relative;
         user-select: none;
        .content{
            position: absolute;
            left: 0;
            right: 0;
            top: 0;
            bottom: 0;
            background:green;
            z-index: 100;
            //    设置过渡动画
            transition: 0.3s;
             
        }
        .remove{
            position: absolute;
            width:200px;
            height:200px;
            background:red;
            right: 0;
            top: 0;
            color:#fff;
            text-align: center;
            font-size: 40px;
            line-height: 200px;
        }
    }
 
</style>
<script type="text/ecmascript-6">
  export default {
     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)";
                        }
                    }
                }      
     }
     }
</script>

到这里就全部完成了,希望对大家有帮助!不足的希望大家能够指出来!


水水
202 声望4 粉丝