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


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 26 Javascript
javascript 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
js 巧妙去除数组中的重复项
Jan 25 Javascript
分享bootstrap学习笔记心得(组件及其属性)
Jan 11 Javascript
基于复选框demo(分享)
Sep 27 Javascript
原生JS实现ajax与ajax的跨域请求实例
Dec 01 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
Aug 29 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
Nov 30 Javascript
vue接入腾讯防水墙代码
May 07 Javascript
Vue+Vuex实现自动登录的知识点详解
Mar 04 Javascript
vue组件是如何解析及渲染的?
Jan 13 Vue.js
JS+CSS实现动态时钟
Feb 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序列号生成函数和字符串替换函数代码
2012/06/07 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
如何使用Gitblog和Markdown建自己的博客
2015/07/31 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
深入理解PHP之源码目录结构与功能说明
2016/06/01 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
jQuery在ul中显示某个li索引号的方法
2015/03/17 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
CSS3实现类似翻书效果的过渡动画的示例代码
2019/09/06 HTML / CSS
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
大专自我鉴定范文
2013/10/01 职场文书
团购业务员岗位职责
2014/03/15 职场文书
合作意向协议书范本
2014/03/31 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
安全生产宣传标语
2014/06/06 职场文书
建筑学专业自荐书
2014/07/09 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
高中语文教学反思范文
2016/02/16 职场文书
MySQL库表名大小写的选择
2021/06/05 MySQL