微信小程序基于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获取地址栏中传递的值
Jul 02 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
Sep 26 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
Dec 10 Javascript
jQuery中的pushStack实现原理和应用实例
Feb 03 Javascript
node.js 使用ejs模板引擎时后缀换成.html
Apr 22 Javascript
ECMAScript6块级作用域及新变量声明(let)
Jun 12 Javascript
跟我学习javascript的undefined与null
Nov 17 Javascript
AngularJS中的过滤器filter用法完全解析
Apr 22 Javascript
求js数组的最大值和最小值的四种方法
Mar 03 Javascript
JavaScript实现封闭区域布尔运算的示例代码
Jun 25 Javascript
JavaScript鼠标拖拽事件详解
Apr 03 Javascript
react的hooks的用法详解
Oct 12 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
SONY SRF-40W电路分析
2021/03/02 无线电
php curl 上传文件代码实例
2015/04/27 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
详解PHP素材图片上传、下载功能
2019/04/12 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
为EasyUI的Tab标签添加右键菜单的方法
2012/07/14 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
详解AngularJS中自定义指令的使用
2015/06/17 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
JS中DOM元素的attribute与property属性示例详解
2018/09/04 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
详解Nuxt.js 实战集锦
2019/11/19 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访 VP.no[o]ne心中最强SOLO是谁
2018/04/04 DOTA
python正则表达式中的括号匹配问题
2014/12/14 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
python正则分析nginx的访问日志
2017/01/17 Python
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
python运行其他程序的实现方法
2017/07/14 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
python制作图片缩略图
2019/04/30 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
行政助理岗位职责
2013/11/10 职场文书
理工类毕业自我鉴定
2014/02/20 职场文书
清洁员岗位职责
2015/02/15 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
python入门学习关于for else的特殊特性讲解
2021/11/20 Python