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


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 一个自定义长度的文本自动换行的函数
Aug 19 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
Nov 23 Javascript
TBCompressor js代码压缩
Jan 05 Javascript
DIV外区域Click后关闭DIV的实现代码
Dec 21 Javascript
Document:getElementsByName()使用方法及示例
Oct 28 Javascript
javascript在子页面中函数无法调试问题解决方法
Jan 17 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
May 10 Javascript
AngularJS中的包含详细介绍及实现示例
Jul 28 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
Aug 18 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
Oct 10 Javascript
checkbox在vue中的用法小结
Nov 13 Javascript
Vue中component标签解决项目组件化操作
Sep 04 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
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
php简单socket服务器客户端代码实例
2015/05/18 PHP
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
jquery.validate使用攻略 第一部
2010/07/01 Javascript
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
常用jQuery代码分享
2015/07/14 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
2019/03/07 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Python写的服务监控程序实例
2015/01/31 Python
python简单实现旋转图片的方法
2015/05/30 Python
python中list常用操作实例详解
2015/06/03 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
Python pymsql模块的使用
2020/09/07 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
餐厅总经理岗位职责
2013/12/31 职场文书
个人求职信范文分享
2014/01/31 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
论文答谢词
2015/01/20 职场文书
故宫导游词
2015/01/31 职场文书
地雷战观后感
2015/06/09 职场文书
导游词之杭州西湖
2019/09/19 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
python实现学生信息管理系统(面向对象)
2022/06/05 Python