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 相关文章推荐
JXTree对象,读取外部xml文件数据,生成树的函数
Apr 02 Javascript
JavaScript 参数中的数组展开 [译]
Sep 21 Javascript
Javascript中3个需要注意的运算符
Apr 02 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
Feb 16 Javascript
javascript 继承学习心得总结
Mar 17 Javascript
jquery实现手机端单店铺购物车结算删除功能
Feb 22 Javascript
React Native预设占位placeholder的使用
Sep 28 Javascript
AngularJS select加载数据选中默认值的方法
Feb 28 Javascript
axios拦截设置和错误处理方法
Mar 05 Javascript
JS面向对象之多选框实现
Jan 17 Javascript
JS异步宏队列微队列原理详解
Sep 09 Javascript
浅谈JSON5解决了JSON的两大痛点
Dec 14 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
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
PHP is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
老版本PHP转义Json里的特殊字符的函数
2015/06/08 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
JS &amp; JQuery 动态添加 select option
2016/06/08 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
微信小程序时间控件picker view使用详解
2018/12/28 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
Python运算符重载用法实例分析
2015/06/01 Python
Python实现的购物车功能示例
2018/02/11 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
Python向excel中写入数据的方法
2019/05/05 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
浅析Python 多行匹配模式
2020/07/24 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
个人简历自我评价
2014/01/06 职场文书
乡镇纠风工作实施方案
2014/03/22 职场文书
实验室标语
2014/06/21 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
创业计划书之酒厂
2019/10/14 职场文书