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 相关文章推荐
js资料toString 方法
Mar 13 Javascript
基于jQuery的日期选择控件
Oct 27 Javascript
Jquery网页出现的乱码问题的三种解决方法
Jun 30 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
Apr 25 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
Oct 10 Javascript
js窗口关闭提示信息(兼容IE和firefox)
Oct 23 Javascript
详解Jquery的事件操作和文档操作
Dec 19 Javascript
node中koa中间件机制详解
Aug 22 Javascript
Vue 2.0入门基础知识之内部指令详解
Oct 15 Javascript
vue数据传递--我有特殊的实现技巧
Mar 20 Javascript
vue单页应用在页面刷新时保留状态数据的方法
Sep 21 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
Feb 20 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脚本的10个技巧(7)
2006/10/09 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
js分页代码分享
2014/04/28 Javascript
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
python绘制散点图并标记序号的方法
2018/12/11 Python
python移位运算的实现
2019/07/15 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
Python Lambda函数使用总结详解
2019/12/11 Python
Python使用Pygame绘制时钟
2020/11/29 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
苹果Mac升级:MacSales.com
2017/11/20 全球购物
师范生实习自我鉴定
2013/11/01 职场文书
认识深刻的检讨书
2014/02/16 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
部队反四风对照检查材料
2014/09/26 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
新郎结婚感言
2015/07/31 职场文书
Docker 镜像介绍以及commit相关操作
2022/04/13 Servers