微信小程序基于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 相关文章推荐
js 模拟实现类似c#下的hashtable的简单功能代码
Jan 24 Javascript
javascript椭圆旋转相册实现代码
Jan 16 Javascript
Javascript合并表格中具有相同内容单元格示例
Aug 11 Javascript
一些老手都不一定知道的JavaScript技巧
May 06 Javascript
javascript实现节点(div)名称编辑
Dec 17 Javascript
利用原生JS自动生成文章标题树的实例
Aug 22 Javascript
node.js + socket.io 实现点对点随机匹配聊天
Jun 30 Javascript
vue.js 实现输入框动态添加功能
Jun 25 Javascript
详解微信小程序调起键盘性能优化
Jul 24 Javascript
vue项目中实现图片预览的公用组件功能
Oct 26 Javascript
利用node.js开发cli的完整步骤
Dec 29 Javascript
绘制微信小程序验证码功能的实例代码
Jan 05 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
目录,文件操作详谈―PHP
2006/11/25 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
javascript 一段左右两边随屏滚动的代码
2009/06/18 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
2015/08/23 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
Vue项目引进ElementUI组件的方法
2018/11/11 Javascript
Koa从零搭建到Api实现项目的搭建方法
2019/07/30 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
[03:11]TI9战队档案 - Alliance
2019/08/20 DOTA
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
python实现同时给多个变量赋值的方法
2015/04/30 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
2018/12/24 Python
解决python 文本过滤和清理问题
2019/08/28 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
农场厂长岗位职责
2013/12/28 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
2014年统计工作总结
2014/11/21 职场文书
以权谋私检举信范文
2015/03/02 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
Nginx源码编译安装过程记录
2021/11/17 Servers
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电