微信小程序基于movable-view实现滑动删除效果


Posted in Javascript onJanuary 08, 2020

基于movable-view实现的一种较为完美的滑动删除效果

前言:用了很多去实现滑动删除的效果,都不太尽如人意,最后用小程序官方专用滑动组件来实现,但是这个组件有一点坑,咱们慢慢道来

1、wxml布局

<view class="list">
  <view class="row" wx:for="{{list}}" wx:key="id">
    <movable-area class="list_item">
     <!-- 坑就在这里,当你向右滑动一点点距离的时候它就停住了,不回去。坑 -->
      <movable-view class="itmem_wrap" direction="horizontal" inertia="{{true}}" out-of-bounds="{{true}}" x="{{item.x}}" damping="{{60}}" data-index="{{index}}" bind:touchstart="touchMoveStartHandle" bind:touchend="touchMoveEndHandle">
        {{'滑动删除' + item.id}}
      </movable-view>
      <view class="delete_wrap">
        <view class="delete_btn">删除</view>
      </view>
    </movable-area>
  </view>
</view>

2、wxss(这里我用的less布局,布局很重要)

page {
  background-color: #efefef;
}
 
.list {
  padding: 30rpx 30rpx 0;

  .row {
    width: 100%;
    overflow: hidden;
    margin-bottom: 30rpx;

    .list_item {
      border-radius: 12rpx;
      position: relative;
      left: -120rpx;
      width: calc(100% + 120rpx);
      height: 160rpx;

      .itmem_wrap {
        width: calc(100% - 120rpx);
        height: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        position: relative;
        left: 120rpx;
        z-index: 2;
        background-color: #fff;
      }

      .delete_wrap {
        position: absolute;
        right: 0;
        top: 0;
        width: 50%;
        height: 100%;
        background-color: rgb(219, 54, 54);
        display: flex;
        justify-content: flex-end;
        z-index: 1;

        .delete_btn {
          width: 120rpx;
          height: 100%;
          display: flex;
          justify-content: center;
          align-items: center;
          color: #fff;
        }
      }
    }
  }
}

3、JavaScript

const app = getApp()

Page({
  data: {
    list: [{
        id: 1
      },
      {
        id: 2
      },
      {
        id: 3
      },
      {
        id: 4
      },
      {
        id: 5
      },
      {
        id: 6
      },
      {
        id: 7
      },
      {
        id: 8
      },
      {
        id: 9
      },
      {
        id: 10
      }
    ],
    startX: '',
    startY: ''
  },
  onLoad: function () {
    this.setListX();
  },
  // 给每一项设置x值
  setListX() {
    this.data.list.map(item => {
      item.x = 0;
    })
    this.setData({
      list: this.data.list
    })
  },
  // 开始滑动
  touchMoveStartHandle(e) {
   // 我们要记录滑动开始的坐标点,后面计算要用到
    if (e.touches.length == 1) {
      this.setData({
        startX: e.touches[0].clientX,
        startY: e.touches[0].clientY
      });
    }
  },
  // 滑动事件处理,一次只能滑出一个删除按钮 为了防止滑动出现抖动,我们用滑动结束事件
  touchMoveEndHandle: function (e) {
    var currentIndex = e.currentTarget.dataset.index, //当前索引
      startX = this.data.startX, //开始X坐标
      startY = this.data.startY, //开始Y坐标
      touchMoveEndX = e.changedTouches[0].clientX, //滑动变化X坐标
      touchMoveEndY = e.changedTouches[0].clientY, //滑动变化Y坐标
      //获取滑动角度
      angle = this.angle({
        X: startX,
        Y: startY
      }, {
        X: touchMoveEndX,
        Y: touchMoveEndY
      });
    //滑动超过50度角 return,防止上下滑动触发
    if (Math.abs(angle) > 50) return;
    this.data.list.map((item, index) => {
      if (touchMoveEndX > startX) {
        // 右滑
        if (index == currentIndex) item.x = 0;
      } else {
        // 左滑
        item.x = -120
        if (index != currentIndex) item.x = 0;
      }
    })
    this.setData({
      list: this.data.list
    })
  },
  /**
   * 计算滑动角度
   * start 起点坐标
   * end 终点坐标
   * Math.PI 表示一个圆的周长与直径的比例,约为 3.14159;PI就是圆周率π,PI是弧度制的π,也就是180°
   */
  angle: function (start, end) {
    var _X = end.X - start.X,
      _Y = end.Y - start.Y
    return 360 * Math.atan(_Y / _X) / (2 * Math.PI);
  }
})

4、最终效果预览

微信小程序基于movable-view实现滑动删除效果

总结

以上所述是小编给大家介绍的微信小程序基于movable-view实现滑动删除效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
用javascript替换URL中的参数值示例代码
Jan 27 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
Oct 16 Javascript
jquery操作 iframe的方法
Dec 03 Javascript
javascript定义变量时带var与不带var的区别分析
Jan 12 Javascript
jQuery实现固定在网页顶部的菜单效果代码
Sep 02 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
Jun 03 Javascript
正则中的回溯定义与用法分析【JS与java实现】
Dec 27 Javascript
Vue的Flux框架之Vuex状态管理器
Jul 30 Javascript
详解ES6中的代理模式——Proxy
Jan 08 Javascript
小程序两种滚动公告栏的实现方法
Sep 17 Javascript
在Vue中获取自定义属性方法:data-id的实例
Sep 09 Javascript
浅谈Vue的computed计算属性
Mar 21 Vue.js
小程序自定义模板实现吸顶功能
Jan 08 #Javascript
微信小程序静默登录的实现代码
Jan 08 #Javascript
微信小程序wxs实现吸顶效果
Jan 08 #Javascript
微信小程序实现吸顶特效
Jan 08 #Javascript
nuxt配置通过指定IP和端口访问的实现
Jan 08 #Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
Jan 08 #Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
Dec 24 #Javascript
You might like
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
JavaScript实现数组随机排序的方法
2015/06/26 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
javascript回到顶部特效
2016/07/30 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
2017/12/13 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
2019/01/20 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
详解python中index()、find()方法
2019/08/29 Python
Python调用scp向服务器上传文件示例
2019/12/22 Python
解决Pycharm的项目目录突然消失的问题
2020/01/20 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
能源工程专业应届生求职信
2014/03/01 职场文书
幼儿园教研活动总结
2014/04/30 职场文书
创建青年文明号材料
2014/05/09 职场文书
社区法制宣传月活动总结
2015/05/07 职场文书
北京爱情故事观后感
2015/06/12 职场文书
小学英语听课心得体会
2016/01/14 职场文书
Nginx如何配置Http、Https、WS、WSS的方法步骤
2021/05/11 Servers