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


Posted in Javascript onSeptember 08, 2017

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

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

效果如下:

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

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

到这里就全部完成了,希望对大家有帮助!也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 类与静态类的实现
Apr 01 Javascript
js动态加载以及确定加载完成的代码
Jul 31 Javascript
javascript parseInt() 函数的进制转换注意细节
Jan 08 Javascript
js replace替换所有匹配的字符串
Feb 13 Javascript
JQuery异步加载无限下拉框级联功能实现示例
Feb 19 Javascript
DOM基础教程之使用DOM设置文本框
Jan 20 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
Aug 27 Javascript
jQuery实用技巧必备(下)
Nov 03 Javascript
JavaScript 随机验证码的生成实例代码
Sep 22 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
Jul 19 Javascript
在vue中阻止浏览器后退的实例
Nov 06 Javascript
解决vue中el-tab-pane切换的问题
Jul 19 Javascript
javascript将list转换成树状结构的实例
Sep 08 #Javascript
浅谈Angular4实现热加载开发旅程
Sep 08 #Javascript
js匿名函数使用&amp;传参(实例)
Sep 08 #Javascript
js HTML5 canvas绘制图片的方法
Sep 08 #Javascript
WebStorm ES6 语法支持设置&amp;babel使用及自动编译(详解)
Sep 08 #Javascript
React如何将组件渲染到指定DOM节点详解
Sep 08 #Javascript
javascript获取指定区间范围随机数的方法
Sep 08 #Javascript
You might like
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
在JavaScript中调用php程序
2009/03/09 PHP
在PHP中养成7个面向对象的好习惯
2010/01/28 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
php生成RSS订阅的方法
2015/02/13 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
2015/10/16 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
儿童编程python入门
2018/05/08 Python
解决csv.writer写入文件有多余的空行问题
2018/07/06 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
化验室技术员岗位职责
2013/12/24 职场文书
物业工作计划书
2014/01/10 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
宣传口号大全
2014/06/16 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
关于环保的宣传稿
2015/07/23 职场文书
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android