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


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 相关文章推荐
许愿墙中用到的函数
Oct 07 Javascript
Javascript 兼容firefox的一些问题
May 21 Javascript
浅谈javascript六种数据类型以及特殊注意点
Dec 20 Javascript
js正则匹配出所有图片及图片地址src的方法
Jun 08 Javascript
基于javascript制作微博发布栏效果
Apr 04 Javascript
JS检测移动端横竖屏的代码
May 30 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
Dec 04 Javascript
JavaScript、C# URL编码、解码总结
Jan 21 Javascript
基于Bootstrap table组件实现多层表头的实例代码
Sep 07 Javascript
vue动态改变背景图片demo分享
Sep 13 Javascript
JavaScript修改注册表实例代码
Jan 05 Javascript
微前端qiankun改造日渐庞大的项目教程
Jun 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原理之执行周期分析
2016/06/01 PHP
THINKPHP在添加数据的时候获取主键id的值方法
2017/04/03 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
你可能不知道的JSON.stringify()详解
2017/08/17 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
python字符类型的一些方法小结
2016/05/16 Python
20招让你的Python飞起来!
2016/09/27 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
Python爬取微信小程序通用方法代码实例详解
2020/09/29 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
七一表彰活动方案
2014/01/18 职场文书
大学自我评价
2014/02/12 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
学习党代会心得体会
2014/09/05 职场文书
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python
JavaScript实例 ODO List分析
2022/01/22 Javascript
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers