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


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调用WebService的示例
Apr 07 Javascript
Javascript 匿名函数及其代码模式原理
Mar 19 Javascript
基于insertBefore制作简单的循环插空效果
Sep 21 Javascript
js获取页面及个元素高度、宽度的代码
Apr 26 Javascript
js实现浏览器倒计时跳转页面效果
Aug 12 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
Dec 23 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
Mar 09 Javascript
React中嵌套组件与被嵌套组件的通信过程
Jul 11 Javascript
node.js连接mysql与基本用法示例
Jan 05 Javascript
vue element-ui实现input输入框金额数字添加千分位
Dec 29 Javascript
jQuery 移除事件的方法
Jun 20 jQuery
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
Aug 06 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中explode与split的区别介绍
2012/10/03 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
Git命令之分支详解
2021/03/02 PHP
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
JS正则表达式判断有效数实例代码
2017/03/13 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
JS实现倒计时图文效果
2018/11/17 Javascript
python进阶教程之异常处理
2014/08/30 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
使用python的pexpect模块,实现远程免密登录的示例
2019/02/14 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
小学毕业感言50字
2014/02/16 职场文书
酒店节能降耗方案
2014/05/08 职场文书
超市店庆活动方案
2014/08/31 职场文书
工程承包协议书范本
2014/09/29 职场文书
2014年幼师工作总结
2014/11/22 职场文书
房产销售员2015年终工作总结
2015/10/22 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
python实现自动化群控的步骤
2021/04/11 Python
js基础语法与maven项目配置教程案例
2021/07/15 Javascript
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫