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


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 相关文章推荐
window.open()弹出居中的窗口
Feb 01 Javascript
jquery中对表单的基本操作代码
Jul 29 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
Aug 14 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
Feb 19 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
May 28 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
Jul 27 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
Jul 19 Javascript
基于Vue-cli快速搭建项目的完整步骤
Nov 03 Javascript
Vue中使用matomo进行访问流量统计的实现
Nov 05 Javascript
vue实现购物车的监听
Apr 20 Javascript
JSON stringify方法原理及实例解析
Oct 23 Javascript
JavaScript构造函数原理及实现流程解析
Nov 19 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读写分离
2013/06/28 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
Laravel框架自定义分页样式操作示例
2020/01/26 PHP
JS 图片缩放效果代码
2010/06/09 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
JavaScript中string对象
2015/06/12 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
2016/12/08 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
Node绑定全局TraceID的实现方法
2019/11/14 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
Python CSV模块使用实例
2015/04/09 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
学习新党章思想汇报
2014/01/09 职场文书
十一酒店活动方案
2014/02/20 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
员工自我工作评价
2015/03/06 职场文书
不同意离婚答辩状
2015/05/22 职场文书
催款函范文
2015/06/24 职场文书
装修公司管理制度
2015/08/05 职场文书
2019广播稿怎么写
2019/04/17 职场文书