微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能


Posted in Javascript onDecember 06, 2019

实现类似ios端微信的左滑显示置顶、删除按钮的功能,首先需将按钮部分设为绝对定位,并且right设为负值溢出屏幕。利用小程序事件处理的api,分别读取触摸开始,触摸移动时,触摸结束的X/Y坐标,根据差值来改变整个卡片的位置。

这里有一个细节,为了防止按钮的点击干扰到卡片主部分的滑动,需要将整个卡片分为两部分。

<View style={`${positionStyle[index]}`}>
  <View 
    onTouchStart={this.moveTaskStart}
    onTouchMove={this.moveTask}
    onTouchEnd={this.moveTaskEnd}
  >
    这是主要的卡片部分
  </View>

  <View style="right: -260px;">这是滑动后出现的按钮部分</View>
</View>

这里使用的是Taro框架,方法与原生事件api一样,在开始滑动时分别存入X,Y坐标,在手指移动过程中计算移动的距离,当X的移动距离大于整个按钮部分的一班,展开按钮。

核心功能的实现,只需要分析X坐标即可,但因为用户可能在上下滑动过程中x坐标也会偏移造成按钮的展开,所以需要在move与end两部分都计算垂直坐标的改变与水平坐标改变形成的角度,当角度过大,视为上下滑动,按钮不展开。
完整代码如下:

moveTaskStart(e) {
  if (e.touches.length == 1) {
    //触摸屏上只有一个触摸点
    this.setState({
      // 开始触摸屏幕的X坐标
      startX: e.touches[0].clientX,
      startY: e.touches[0].clientY
    });
  }
}

moveTask(e) {
  if (e.touches.length == 1) {
    let moveX = e.touches[0].clientX;
    let moveY = e.touches[0].clientY;
    // 移动距离
    let disX = this.state.startX - moveX;
    let disY = this.state.startY - moveY;
    let angle = disY > 0 ? disY / disX : -disY / disX;
    let btnWidth = this.state.btnWidth;
    let txtStyle = "";
    if (disX == 0 || disX < 30) {
      //右滑动
      txtStyle = "left:0px";
    } else if(angle > 0.5) {
      return;
    } else if (disX > 30 && angle < 0.5) {
      txtStyle = `left: -${disX}px`;
      if (disX >= btnWidth) {
        //距离最大值
        txtStyle = `left: -${btnWidth}px`;
      }
    }
    let index = e.currentTarget.dataset.index;
    let list = this.state.positionStyle;
    this.setState({
      positionStyle: list
    });
  }
}

moveTaskEnd(e) {
  let txtStyle;
  if (e.changedTouches.length == 1) {
    let endX = e.changedTouches[0].clientX;
    let moveY = e.changedTouches[0].clientY;
    //移动距离
    let disX = this.state.startX - endX;
    let disY = this.state.startY - moveY;
    //移动角度
    let angle = disY > 0 ? disY / disX : -disY / disX;
    let btnWidth = this.state.btnWidth;
    //如果距离大于按钮宽度的一半,并且移动角度较小,显示按钮
    if(disX > (btnWidth / 2) && angle < 0.5) {
      txtStyle = `left:-${btnWidth}px`
    }else {
      txtStyle = "left:0px"
    }
    let index = e.currentTarget.dataset.index;
    let list = this.state.positionStyle;
    list[index] = txtStyle;
    this.setState({
      positionStyle: list
    });
  }
}

总结

以上所述是小编给大家介绍的微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
javascript 变量作用域 代码分析
Jun 26 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
Sep 13 Javascript
jquery更换文章内容与改变字体大小代码
Sep 30 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
Oct 09 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
Oct 24 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
Jan 13 Javascript
vue2 中如何实现动态表单增删改查实例
Jun 09 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
JavaScript原型链与继承操作实例总结
Aug 24 Javascript
iphone刘海屏页面适配方法
May 07 Javascript
vue项目中使用bpmn为节点添加颜色的方法
Apr 30 Javascript
使用原生javascript开发计算器实例代码
Feb 21 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
Dec 06 #Javascript
微信小程序激励式视频广告组件使用详解
Dec 06 #Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
Dec 06 #Javascript
vue中监听路由参数的变化及方法
Dec 06 #Javascript
详解ECMAScript2019/ES10新属性
Dec 06 #Javascript
ES6的异步操作之promise用法和async函数的具体使用
Dec 06 #Javascript
原生JavaScript实现滑动拖动验证的示例代码
Dec 06 #Javascript
You might like
php+mysql写的简单留言本实例代码
2008/07/25 PHP
php设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
javascript URL锚点取值方法
2009/02/25 Javascript
JavaScript 学习笔记 Black.Caffeine 09.11.28
2009/11/30 Javascript
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
javascript属性访问表达式用法分析
2015/04/25 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
python通过BF算法实现关键词匹配的方法
2015/03/13 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
python文件选择对话框的操作方法
2019/06/27 Python
多个python文件调用logging模块报错误
2020/02/12 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
介绍一下Mysql的存储引擎
2015/02/12 面试题
自考自我鉴定范文
2013/10/30 职场文书
员工安全责任书范本
2014/07/24 职场文书
军人离婚协议书样本
2014/10/21 职场文书
python如何获取网络数据
2021/04/11 Python
react中props 的使用及进行限制的方法
2021/04/28 Javascript
详解Redis复制原理
2021/06/04 Redis
基于Python实现对比Exce的工具
2022/04/07 Python
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript