vue3 页面左右滑动钩子封装

news2024/11/17 8:29:47

 

// useSwiper.js文件
import { ref, onMounted, onUnmounted } from "vue";
export function useSwiper({
  tabList, //tab数据
  curTabId,// 当前tab id
  curTabIndex,// 当前tab 索引
  tabChange,// tab改变事件
  animation,// 动画
  animationData,// 动画
}) {
  let minOffset = ref(50); //最小偏移量,低于这个值不响应滑动处理
  let maxOffset = ref(200); //最大偏移量,低于这个值不响应滑动处理
  let minTime = ref(60); // 最小时间,单位:毫秒,低于这个值不响应滑动处理
  let startX = ref(0); //开始时的X坐标
  let startY = ref(0); //开始时的Y坐标
  let startTime = ref(0); //开始时的毫秒数
  function touchStart(e) {
    startX.value = e.touches[0].pageX; // 获取触摸时的x坐标
    startY.value = e.touches[0].pageY; // 获取触摸时的y坐标
    startTime.value = new Date().getTime(); //获取毫秒数
  }
  function touchMove(e) {
    animation.translateY(20).step();
    animationData.value = animation.export();
    setTimeout(() => {
      animation.translateY(0).step();
      animationData.value = animation.export();
    }, 150);
  }

  function touchCancel(e) {
    startX.value = 0; //开始时的X坐标
    startY.value = 0; //开始时的Y坐标
    startTime.value = 0; //开始时的毫秒数
  }
  function touchEnd(e) {
    var endX = e.changedTouches[0].pageX;
    var endY = e.changedTouches[0].pageY;
    var touchTime = new Date().getTime() - startTime.value; //计算滑动时间
    //开始判断
    //1.判断时间是否符合
    if (touchTime >= minTime.value) {
      //2.判断偏移量:分X、Y
      var xOffset = endX - startX.value;
      var yOffset = endY - startY.value;
      if (
        Math.abs(xOffset) >= Math.abs(yOffset) &&
        Math.abs(xOffset) >= minOffset.value &&
        Math.abs(yOffset) <= 50 &&
        Math.abs(xOffset) / Math.abs(yOffset) > 3
      ) {
        //左右滑动
        console.log("滑动");
        if (xOffset < 0) {
          // console.log('向左滑动')
          if (curTabIndex.value + 1 < tabList.value.length) {
            curTabIndex.value++;
          } else return;
        } else {
          // console.log('向右滑动')
          if (curTabIndex.value > 0) {
            curTabIndex.value--;
          } else return;
        }
        curTabId.value = tabList.value[curTabIndex.value].id;
        tabChange();
      }
    } else {
      // console.log('滑动时间过短', touchTime)
    }
  }
  return { touchStart, touchMove, touchCancel, touchEnd };
}

页面使用示例:

// vue页面
<template>
  <div
    @touchstart="touchStart"
    @touchmove="touchMove"
    @touchend="touchEnd"
    @touchcancel="touchCancel"
    :animation="animationData"
  >
    // 滑动内容
  </div>
</template>

<script setup>
  import { useSwiper } from "@/utils/useSwiper";

  const tabList = reactive([
    {
      name: "新闻",
      id: '101',
      index: 0,
    },
    {
      name: "动漫",
      id: '102',
      index: 1,
    },
  ]);
  let curTabId = ref(tabList[0].id); // 当前tab的id
  let curTabIndex = ref(tabList[0].index); // 当前tab的索引

  let animation = reactive(uni.createAnimation()); // uni动画(选用)
  let animationData = ref({}); // 动画(选用)

  const { touchStart, touchMove, touchEnd, touchCancel } = useSwiper({
    tabList,
    curTabId,
    curTabIndex,
    tabChange,
    animation,
    animationData,
  });

  // tab切换事件
  function tabChange(item) {
    // do something
  }
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1839260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

具备人工智能标记的书签应用Hoarder

什么是 Hoarder &#xff1f; Hoarder 是一款可自托管的书签应用程序&#xff08;链接、笔记和图像&#xff09;&#xff0c;具有基于人工智能的自动标记和全文搜索功能。适合数据囤积者使用。 软件特点&#xff1a; &#x1f517; 为链接添加书签、做简单的笔记并存储图像。⬇…

Redis学习|Redis 是什么、Redis 能干嘛、Window安装Redis、Linux下安装Redis、Redis测试性能

Redis 是什么? Redis(Remote Dictionary Server)&#xff0c;即远程字典服务! 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API. redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记…

DLP数据防泄密系统有什么功能?四款特别好用的DLP仿泄密系统

DLP&#xff08;Data Loss Prevention&#xff0c;数据丢失防护&#xff09;系统是一类专门用于保护组织内部数据不被非法访问、泄露或误用的安全解决方案。 这类系统通常具备以下关键功能&#xff1a; 1.数据识别与分类&#xff1a;自动发现并分类存储在网络、终端和云环境中…

vue3-openlayers 点击多边形弹框,高亮多边形,自定义属性传递,鼠标悬浮多边形上动态修改鼠标样式

本篇介绍一下使用vue3-openlayers点击多边形弹框&#xff0c;高亮多边形&#xff0c;自定义属性传递&#xff0c;鼠标悬浮多边形上动态修改鼠标样式 1 需求 加载天地图&#xff0c;polygon传递自定义属性标悬浮在polygon上&#xff0c;根据自定义属性&#xff0c;动态修改鼠标…

【Unity】Animator动画倒播,与StartRecording动画录制

一、Animator动画倒播 正常我们修改速度&#xff0c;只需要修改Animator.speed即可&#xff0c;但如果设置为负值&#xff0c;Animator系统会自动将其改为0值。 1.创建动画速度参数 (1)设置动画 我们需要创建表示速度的动画参数Speed&#xff0c;将其付给需要倒播的动画片段…

现货白银买卖分析:如何对买卖时机进行分析

现货白银交易是一种保证金交易品种&#xff0c;而且白银日常的市场波动比较大&#xff0c;所以笔者建议投资者在入场之前要对现货白银买卖进行分析&#xff0c;那具体怎么分析呢&#xff1f;实际上就是对买卖的机会进行分析&#xff0c;下面我们就来介绍具体的分析方法。 看K线…

leetcode:2848. 与车相交的点(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i&#xff0c;nums[i] [starti, endi] &#xff0c;其中 starti 是第 i 辆车的起点&#xff0c;endi 是第 i 辆车的终点。 返回数轴上被车 任意部分 覆盖的整数点的…

移植案例与原理 - HDF驱动框架-OSAL

为了提升驱动代码在不同内核子系统间的可复用能力&#xff0c;OpenHarmony HDF&#xff08;Hardware Driver Foundation&#xff09;驱动框架提供了OSAL(Operating System Abstraction Layer)操作系统抽象层接口。OSAL为驱动程序提供了任务、定时器、互斥锁、信号量等基础库相关…

MFC扩展库BCGControlBar Pro v35.0

LINK : fatal error LNK1104: 无法打开文件“BCGCBPRO2800U140.lib” BCGControlBar v25.0版本 环境VS2015&#xff0c;在运行程序时出现提示错误 &#xff1a;LINK : fatal error LNK1104: 无法打开文件“BCGCBPRO2800U140.lib” 1、需要编译一下BGCControlBar&#xff0c;在…

全国第四轮软件工程学科评估结果

#计算机专业好吗##高考填志愿选择专业##计算机专业还能不能报# 又到了让各位家长头疼的高考填志愿时刻。 前几天的头条&#xff0c;张雪峰直播卖卡3小时入账2亿&#xff0c;为了孩子的前途&#xff0c;家长们确实是不惜重金。 作为毕业如今18个年头一直从事软件领域的老码农&am…

生鲜大单品营销的七项核心工作

生鲜大单品&#xff0c;是指通过选品、采购、营销、门店售卖等环节&#xff0c;达到高销量的单一产品或产品组合。从数据层面上来看&#xff0c;生鲜大单品是指能在该品类中创造20%到50%价值的商品&#xff0c;也就是常说的TOP商品。 做好生鲜大单品&#xff0c;我们需要做到以…

ArcGIS常用操作技巧,快快学起来

ArcGIS 常用操作技巧 快快学起来~ 一、影像格式的转换 例如把jpg格式转换为tiff格式&#xff0c;可以在arctoolbox中的转换工具-->到光栅-->光栅到其他多种格式 (conversiontools-->to Raster-->Raster to Other Format multiple)。 二、矢量化设置捕捉功能 在…

最新版首发 | 手把手教你安装 Vivado2024.1(附安装包)

Q&#xff1a;Vivado出2024版了&#xff01;不知迪普微有没有对应的安装包呢&#xff1f; A&#xff1a;有的&#xff01;回复“Vivado2024.1”即可获得相应安装包哦~ Q&#xff1a;好哒~但是我不会安装&#xff0c;可否安排一期安装教程&#xff1f; A&#xff1a;立马安排&…

Nginx之文件下载服务器

1.概述 在对外分享文件时&#xff0c;利用Nginx搭建一个简单的下 载文件管理服务器&#xff0c;文件分享就会变得非常方便。利 用Nginx的诸多内置指令可实现自动生成下载文件列表 页、限制下载带宽等功能。配置样例如下&#xff1a; server {listen 8080;server_name localhos…

微型导轨的摩擦系数分析!

微型导轨的摩擦力主要包括滑动摩擦力和滚动摩擦力&#xff0c;摩擦系数是一个关键参数&#xff0c;它决定了滑块在导轨上运动时所受到的摩擦力大小&#xff0c;摩擦系数越低&#xff0c;系统的运动效率和精度就越高&#xff0c;而微型导轨的摩擦系数是受多个因素影响的。 微型导…

空间复杂度的相关概念

1. 空间复杂度 空间复杂度&#xff08;space complexity&#xff09;用于衡量算法占用内存空间随着数据量变大时的增长趋势。 统计哪些空间&#xff1a; ● 暂存数据&#xff1a;用于保存算法运行过程中的各种常量、变量、对象等。 ● 栈帧空间&#xff1a;用于保存调用函数…

python学习笔记-08

面向对象基础(OOP)-上 1. 面向对象概述 面向过程&#xff1a;根据业务逻辑从上到下写代码 函数式&#xff1a;将某功能代码封装到函数中&#xff0c;日后便无需重复编写&#xff0c;仅调用函数即可 面向对象(object oriented programming)&#xff1a;将数据与函数绑定到一起…

数据结构---二叉树的性质总结

第i层上的节点数 证明: 二叉树的最大节点数 证明: 第一层对应2^0个节点, 累加得到 这是一个等比数列 求和公式: 那么这里的n指的是一共有多少个相加 根据从b到a一共有b-a1个可推出 有(k-1)-01个相加 那么结果为: 叶节点与度为2的节点关系 证明: 假设二叉树的总节点数为 NNN…

wpfui:一个开源免费具有现代化设计趋势的WPF控件库

wpfui介绍 wpfui是一款开源免费&#xff08;MIT协议&#xff09;具有现代化设计趋势的WPF界面库。wpfui为wpf的界面开发提供了流畅的体验&#xff0c;提供了一个简单的方法&#xff0c;让使用WPF编写的应用程序跟上现代设计趋势。截止写这篇文章&#xff0c;该项目获得了6.7k …

LVGL开发教程-img图片

系列文章目录 知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 1. 显示静态图像 2. 显示动态图像gif 3. 文件系统使用 总结 前言 在嵌入式系统中&#xff0c;使用LVGL&#xff08;Light and Versatile Graphics Library&#xff09;显示静态和动态图像是一…