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 相关文章推荐
基于Jquery的跨域传输数据(JSONP)
Mar 10 Javascript
JavaScript 函数replace深入了解
Mar 14 Javascript
js 判断各种数据类型的简单方法(推荐)
Aug 29 Javascript
微信小程序 wx.request(object) API详解及实例代码
Sep 30 Javascript
Node.js测试中的Mock文件系统详解
Nov 21 Javascript
jQuery实现验证码功能
Mar 17 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
May 03 Javascript
bootstrap响应式表格实例详解
May 15 Javascript
微信小程序中使用ECharts 异步加载数据的方法
Jun 27 Javascript
JS实现打字游戏
Dec 17 Javascript
基于vue实现微博三方登录流程解析
Nov 04 Javascript
JavaScript十大取整方法实例教程
Dec 03 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
php 定界符格式引起的错误
2011/05/24 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
php中array_unshift()修改数组key注意事项分析
2016/05/16 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
学习jquery之一
2007/04/27 Javascript
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
Python装饰器decorator用法实例
2014/11/10 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
Python数据预处理之数据规范化(归一化)示例
2019/01/08 Python
Python 实现微信防撤回功能
2019/04/29 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
2020/06/02 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
Python 随机按键模拟2小时
2020/12/30 Python
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
酒店总经理欢迎词
2014/01/15 职场文书
《中华少年》教学反思
2014/02/15 职场文书
工地质量标语
2014/06/12 职场文书
2014年建筑工作总结
2014/11/26 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
nginx中封禁ip和允许内网ip访问的实现示例
2022/03/17 Servers