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开发规范要求(规范化代码)
Aug 16 Javascript
javaScript函数中执行C#代码中的函数方法总结
Aug 07 Javascript
javascript实现节点(div)名称编辑
Dec 17 Javascript
javascript中Number对象的toString()方法分析
Dec 20 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
Jun 08 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
Jan 07 Javascript
bootstrap网页框架的使用方法
May 10 Javascript
js实现移动端编辑添加地址【模仿京东】
Apr 28 Javascript
详解JS获取HTML DOM元素的8种方法
Jun 17 Javascript
Vue实现移动端左右滑动效果的方法
Nov 27 Javascript
JS算法题之查找数字在数组中的索引位置
May 15 Javascript
JS中循环遍历数组的四种方式总结
Jan 23 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
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
PHP编写简单的App接口
2016/08/28 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
Python3多进程 multiprocessing 模块实例详解
2018/06/11 Python
python实现小世界网络生成
2019/11/21 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
客服文员岗位职责
2013/11/29 职场文书
高二英语教学反思
2014/01/19 职场文书
教师师德反思材料
2014/02/15 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
公安领导班子四风问题个人整改措施思想汇报
2014/10/09 职场文书
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
碧霞祠导游词
2015/02/09 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
Python使用DFA算法过滤内容敏感词
2022/04/22 Python
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript