当前位置:   article > 正文

微信小程序———同一页面内左右滑动切换内容显示_微信小程序左右滑动切换页面

微信小程序左右滑动切换页面

一、微信小程序事件

 由于首先介绍一下微信小程序中的事件,可选择快速略过或者直接进去之后的重点内容

一、什么是事件
  • 事件是视图层到逻辑层的通讯方式。
  • 事件可以将用户的行为反馈到逻辑层进行处理。
  • 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
  • 事件对象可以携带额外信息,如 id, dataset, touches。
 二、事件的使用方式

1、在组件中绑定一个事件处理函数,如bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数。

<view id="tapTest" data-hi="Weixin" bindtap="tapName"> Click me! </view>

2、在相应的Page定义中写上相应的事件处理函数,参数是event

  1. Page({
  2. tapName: function(event) {
  3. console.log(event)
  4. }
  5. })

 3、可以看到控制台上打印出来的事件信息

  1. {
  2. "type":"tap",
  3. "timeStamp":895,
  4. "target": {
  5. "id": "tapTest",
  6. "dataset": {
  7. "hi":"Weixin"
  8. }
  9. },
  10. "currentTarget": {
  11. "id": "tapTest",
  12. "dataset": {
  13. "hi":"Weixin"
  14. }
  15. },
  16. "detail": {
  17. "x":53,
  18. "y":14
  19. },
  20. "touches":[{
  21. "identifier":0,
  22. "pageX":53,
  23. "pageY":14,
  24. "clientX":53,
  25. "clientY":14
  26. }],
  27. "changedTouches":[{
  28. "identifier":0,
  29. "pageX":53,
  30. "pageY":14,
  31. "clientX":53,
  32. "clientY":14
  33. }]
  34. }
三、事件的分类

事件分为冒泡事件和非冒泡事件:

1、冒泡事件:当一个组件上的事件被触发后,该事件会像父节点传递

冒泡事件列表:

        touchstart:手指触摸动作开始

        touchmove:手指触摸后移动

        touchcantel:手指触摸动作被打断,如来电提醒弹窗

        touchend:手指触摸动作结束

        tap:手指触摸后马上离开

2、非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递

        form的submit事件

        input的input事件

        scroll-view的scroll事件

四、事件的绑定

事件绑定的写法类似于组件的属性,

  1. <view bindtap="handleTap">
  2. Click here!
  3. </view>

当用户点击页面中的这个view的时候,页面中的handleTap函数就会被调用,除此之外,事件绑定函数也可以是一个数据绑定,比如:

  1. <view bindtap="{{ handlerName }}">
  2. Click here!
  3. </view>

此时,当用户点击页面中的这个view的时候,首先获取js中this.data.handleName的值即为要调用的函数名。若该值为空字符串的话,则点击view后不触发函数。

二、在同一页面左右滑动切换页面内容

现在我们就要进入正题了,此次我们需要用到的事件,为上面所提到的touchstart    touchend   touchmove三个事件,下面对这三个事件简要介绍,根据官方文档描述,自基础库版本1.5.0起,触摸类事件支持捕获阶段,捕获阶段位于冒泡阶段之前,且在捕获阶段中,事件到达节点的顺序与冒泡阶段恰好相反,需要在捕获阶段监听事件时,可以采用capture-bind或者capture-catch关键字,后者将中断捕获阶段和取消冒泡阶段。

 ========================================================================

==============================项目开始啦==================================

 =========================================================================

实现内容:手指触摸手机屏幕左右滑动切换同一页面中显示内容(有一个tab栏可以进行切换的同时,加做一个左右滑动也能进行切换显示内容的功能)旨在增强用户的体验感。

1、实现一个tab栏

html代码:

  1. <scroll-view class="swiper-tab">
  2. <view class="swiper-tab-list {{currentTab==0 ? 'on' : ''}}" data-current="0" bindtap="swichNav">男生头像</view>
  3. <view class="swiper-tab-list {{currentTab==1 ? 'on' : ''}}" data-current="1" bindtap="swichNav">女生头像</view>
  4. <view class="swiper-tab-list {{currentTab==2 ? 'on' : ''}}" data-current="2" bindtap="swichNav">情侣头像</view>
  5. </scroll-view>

css代码:

  1. .swiper-tab{
  2. width: 100%;
  3. text-align: center;
  4. line-height: 80rpx;
  5. }
  6. .swiper-tab-list{
  7. font-size: 30rpx;
  8. display: inline-block;
  9. width: 33.33%;
  10. border-bottom: 2rpx solid #777777;
  11. color: #777777;
  12. }
  13. .on{
  14. color: red;
  15. border-bottom: 5rpx solid red;
  16. }

js代码:

在Page中的data中增加一条currentTab : 0,即初始状态男生头像默认被选中,并且男生头像标签的类名on被激活,除此之外还要写一个函数,作用就是点击其他tab切换被选中的

  1. swichNav: function( e ) {
  2. var that = this;
  3. if( this.data.currentTab === e.target.dataset.current ){
  4. return false;
  5. }
  6. else {
  7. that.setData({
  8. currentTab: e.target.dataset.current
  9. })
  10. }
  11. },

初始状态:

到这里tab栏就已经实现完成了,总共写了三个部分,当点击任意一部分时,就可以切换被选中的,接下来我们来实现左右滑动的部分。

2、左右滑动部分切换页面内容实现

大体思路:通过开始触摸的的落点和结束触摸的落点的坐标进行运算,以此来判断到底是向左滑动还是向右滑动了,接着通过改变currentTab的值来控制页面内容的显示。

在Page中的data中增加几条,js中会用到,

    flag:0, 用来记录是否需要重新滑动 不然会导致滑动过程中会一直触发touchmove

    lastX:0,//手指起点位置

    lastY:0,

html代码:

  1. <!--男生头像部分-->
  2. <view bind:touchmove="handleTouchmove" bind:touchstart="handleTouchstart" bind:touchend="handleTouchend" wx:if="{{currentTab==0 ? true : false}}">
  3. <text>这里是男生头像</text>
  4. </view>
  5. <!--女生头像部分-->
  6. <view bind:touchmove="handleTouchmove" bind:touchstart="handleTouchstart" bind:touchend="handleTouchend" wx:elif="{{currentTab==1 ? true : false}}">
  7. <text>这里是女生头像</text>
  8. </view>
  9. <!--情侣头像部分-->
  10. <view bind:touchmove="handleTouchmove" bind:touchstart="handleTouchstart" bind:touchend="handleTouchend" wx:else="{{currentTab==2 ? true : false}}">
  11. <text>这里是情侣头像</text>
  12. </view>

js代码

  1. handleTouchstart:function (e) {
  2. this.data.flag = 0;
  3. this.data.lastX = e.changedTouches[0].pageX;
  4. this.data.lastY = e.changedTouches[0].pageY;
  5. },
  6. handleTouchmove:function (e) {
  7. if (this.data.flag !== 0) {
  8. return;
  9. }
  10. let currentX = e.changedTouches[0].pageX;
  11. let currentY = e.changedTouches[0].pageY;
  12. let tx = currentX - this.data.lastX;
  13. let ty = currentY - this.data.lastY;
  14. //左右方向偏移大于上下偏移认为是左右滑动
  15. if (Math.abs(tx) - Math.abs(ty) > 5) {
  16. console.log("cc")
  17. // 向左滑动
  18. if (tx < 0) {
  19. // 如果到最右侧
  20. console.log('向左滑动');
  21. this.data.flag = 1;
  22. if(this.data.currentTab===2){
  23. this.setData({
  24. currentTab:0
  25. })
  26. }else{
  27. this.setData({
  28. currentTab:this.data.currentTab+1
  29. })
  30. }
  31. }
  32. // 向右滑动
  33. else if (tx > 0) {
  34. // 如果到最左侧
  35. this.data.flag = 2;
  36. console.log('向右滑动');
  37. if(this.data.currentTab===0){
  38. this.setData({
  39. currentTab:2
  40. })
  41. }else{
  42. this.setData({
  43. currentTab:this.data.currentTab-1
  44. })
  45. }
  46. }
  47. }
  48. //上下方向滑动
  49. else {
  50. if (ty < 0) {
  51. //向上滑动
  52. console.log("向上滑动")
  53. this.data.flag = 3;
  54. } else if (ty > 0) {
  55. //向下滑动
  56. console.log("向下滑动")
  57. this.data.flag = 4;
  58. }
  59. }
  60. //将当前坐标进行保存以进行下一次计算
  61. this.data.lastX = currentX;
  62. this.data.lastY = currentY;
  63. },
  64. handleTouchend:function (e) {
  65. this.data.flag=0
  66. },
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/730732
推荐阅读
相关标签
  

闽ICP备14008679号