微信小程序基于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 相关文章推荐
JQuery的ajax基础上的超强GridView展示
Sep 18 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
Jan 01 Javascript
jQuery $.data()方法使用注意细节
Dec 31 Javascript
JQuery筛选器全系列介绍
Aug 27 Javascript
yepnope.js使用详解及示例分享
Jun 23 Javascript
document.forms用法示例介绍
Jun 26 Javascript
JavaScript插件化开发教程(六)
Feb 01 Javascript
js实现数组冒泡排序、快速排序原理
Mar 08 Javascript
Webpack的dll功能使用
Jun 28 Javascript
微信小程序调用摄像头隐藏式拍照功能
Aug 22 Javascript
JS实现的小火箭发射动画效果示例
Dec 08 Javascript
微信小程序 WeUI扩展组件库的入门教程
Apr 21 Javascript
小程序自定义模板实现吸顶功能
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
相对路径转化成绝对路径
2007/04/10 PHP
php.ini中date.timezone设置分析
2011/07/29 PHP
第二章 PHP入门基础之php代码写法
2011/12/30 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
vue-router 按需加载 component: () =&gt; import() 报错的解决
2020/09/22 Javascript
使用Python构建Hopfield网络的教程
2015/04/14 Python
Python字符串处理实现单词反转
2017/06/14 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
详解django的serializer序列化model几种方法
2018/10/16 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
python“静态”变量、实例变量与本地变量的声明示例
2020/11/13 Python
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
以下的初始化有什么区别
2013/12/16 面试题
介绍一下JNDI的基本概念
2013/07/26 面试题
大一自我鉴定范文
2013/12/27 职场文书
产品质量保证书
2014/04/29 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
早上好问候语大全
2015/11/10 职场文书
创业计划书之养殖业
2019/10/11 职场文书