首页 > 编程 > JavaScript > 正文

Vue.js移动端左滑删除组件的实现代码

2019-11-19 15:30:44
字体:
来源:转载
供稿:网友

左滑删除在移动端很常见。下面我们一起来封装一下这个简单的小组件。我们想要是:

  • 当滑块没有超过删除按钮的一半时自动回到起点位置。
  • 滑动距离超过一半滑动到最大值(删除按钮宽度)
  • 尽量精简代码

效果如下:

在开始之前,我们先得将 [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>

到这里就全部完成了,希望对大家有帮助!也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表