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


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 相关文章推荐
基于jquery自定义图片热区效果
Jul 21 Javascript
jquery创建并行对象或者合并对象的实现代码
Oct 10 Javascript
Javascript代码实现仿实例化类
Apr 03 Javascript
AngularJS 日期格式化详解
Dec 23 Javascript
使用伪命名空间封装保护独自创建的对象方法
Aug 04 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
Dec 07 Javascript
js数组与字符串常用方法总结
Jan 13 Javascript
原生js封装添加class,删除class的实例
Nov 06 Javascript
浅谈Vue.js路由管理器 Vue Router
Aug 16 Javascript
node.js域名解析实现方法详解
Nov 05 Javascript
js实现数字从零慢慢增加到指定数字示例
Nov 07 Javascript
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 Vue.js
微信小程序添加插屏广告并设置显示频率(一天一次)
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获取网址的顶级域名函数代码
2012/09/24 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
Javascript 继承实现例子
2009/08/12 Javascript
Three.js源码阅读笔记(物体是如何组织的)
2012/12/27 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
JS简单实现数组去重的方法分析
2017/10/14 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
详解Python3中yield生成器的用法
2015/08/20 Python
Python简单实现控制电脑的方法
2018/01/22 Python
python3爬取淘宝信息代码分析
2018/02/10 Python
Python列表(List)知识点总结
2019/02/18 Python
python GUI图形化编程wxpython的使用
2019/07/19 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
解决Firefox下不支持outerHTML问题代码分享
2014/06/04 HTML / CSS
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
Lookfantastic俄罗斯:欧洲在线化妆品零售商
2019/08/06 全球购物
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
应届大学生简历中的自我评价
2014/01/15 职场文书
先进集体获奖感言
2014/02/13 职场文书
党员党性分析材料
2014/02/17 职场文书
励志演讲稿300字
2014/08/21 职场文书
经理岗位职责
2015/02/02 职场文书
会计求职信怎么写
2015/03/20 职场文书
生产车间管理制度
2015/08/04 职场文书
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL