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——表单应用范例
Feb 20 Javascript
php 中序列化和json使用介绍
Jul 08 Javascript
详细谈谈AngularJS的子级作用域问题
Sep 05 Javascript
使用D3.js制作图表详解
Aug 13 Javascript
浅谈React Native 中组件的生命周期
Sep 08 Javascript
在Vue组件上动态添加和删除属性方法
Feb 23 Javascript
Bootstrap 中data-[*] 属性的整理
Mar 13 Javascript
快速搭建vue2.0+boostrap项目的方法
Apr 09 Javascript
用vue快速开发app的脚手架工具
Jun 11 Javascript
JavaScript的Object.defineProperty详解
Jul 09 Javascript
vuejs选中当前样式active的实例
Aug 22 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
Mar 31 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缩略图生成程式(需要GD库支持)
2007/03/06 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
如何在php中正确的使用json
2013/08/06 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
创业计划书如何吸引他人眼球
2014/01/10 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
应聘教师求职信
2014/07/19 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
感恩教师主题班会
2015/08/12 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
SQL Server2019数据库之简单子查询的具有方法
2021/04/27 SQL Server
Python OpenCV实现图形检测示例详解
2022/04/08 Python