vue3 页面左右滑动钩子封装

 

// 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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM8单片机的GPIO口介绍

本篇文章依托于stm8单片机和lora模块 目录 一、GPIO口测试相关硬件电路图 &#xff08;a&#xff09;USB转串口底板PA3控制LED6 (b)Lora模块底板PA3接口 &#xff08;c&#xff09;LED灯电路 二、参考官方例程实现GPIO口的输出 三、GPIO相关函数的了解 &#xff08;1&a…

el-table 固定前n行 配合 max-height 生效

:row-class-name"TableRowClassName" 加上类名 <el-table:data"computedTableList"borderstyle"width: 100%":row-class-name"TableRowClassName"max-height"800"><el-table-column fixed prop"name"…

curl发送邮件需要哪些参数设置?如何配置?

curl发送邮件有哪些认证方式&#xff1f;如何通过curl命令发信&#xff1f; curl是一个命令行工具&#xff0c;用于在网络上传输数据&#xff0c;包括发送电子邮件。要使用curl发送邮件&#xff0c;需要设置一些参数以确保邮件被正确发送到目标收件人。AokSend来介绍一些必需的…

浅谈C++基本框架内涵及其学习路线

目录 一.C的内涵本质 1. 面向对象编程&#xff08;OOP&#xff09; 2. 低级控制 3. 模板编程 4. 标准库&#xff08;STL&#xff09; 5. 多范式支持 二.学习路线 1. 基础阶段 C基础语法 函数 数组和指针 2. 面向对象编程 类和对象 继承和多态 运算符重载 3. 高级…

信息技术课如何禁止学生玩游戏

在信息技术课上禁止学生玩游戏是一个常见的挑战&#xff0c;但可以通过一系列策略和工具来有效地实现。以下是一些建议&#xff1a; 明确课堂规则和纪律&#xff1a; (1)在课程开始时&#xff0c;明确告知学生课堂规则和纪律&#xff0c;包括禁止玩游戏的规定。 (2)强调遵守…

Properties与xml知识点总结

文章目录 一、Properties1.1 构造方法1.2 从Properties文件中获取1.3 向Properties文件中存储 二、xml2.1 XML2.2 特点2.3 规则2.3 抬头声明2.4 特殊字符2.5 CDATA区段2.4 作用和应用场景 三、区别 一、Properties 定义&#xff1a;properties是一个双列集合集合&#xff0c;拥…

神火股份电子商务平台(数字化招采平台),构建企业数字活力

为推进数字化转型升级进程&#xff0c;神火股份携手信源信息建设电子商务平台&#xff0c;近日&#xff0c;该平台已实现验收&#xff0c;为企业高质量发展注入“数字活力”。 河南神火煤电股份有限公司&#xff08;简称“神火股份”&#xff09;是以煤炭、发电、电解铝生产及…

Webmin在EPICS IOC启动中的应用

本文使用webmin启动远程工控机中的EPICS IOC&#xff0c;受控设备使用PI公司的六轴台以及相应的控制器C-887&#xff1a; 1&#xff09;控制器C-887 2) 六轴台&#xff1a; 3&#xff09;在工控机上安装用于与C-887控制器进行通信的EPICS IOC程序&#xff0c;安装结束后&#…

百度文心智能体平台(想象即现实):轻松上手,开启智能新时代!创建属于自己的智能体应用。

目录 1.1、文心智能体平台 1.2、创建智能体 1.3、智能体报名入口 1.4、古诗词小助手 1.5、访问我的智能体 在这个全新的时代里&#xff0c;人工智能技术正以前所未有的速度发展&#xff0c;渗透到我们生活的方方面面。无论是智能家居、自动驾驶&#xff0c;还是医疗诊断、…

Python抓取天气信息

Python的详细学习还是需要些时间的。如果有其他语言经验的&#xff0c;可以暂时跟着我来写一个简单的例子。 2024年最新python教程全套&#xff0c;学完即可进大厂&#xff01;&#xff08;附全套视频 下载&#xff09; (qq.com) 我们计划抓取的数据&#xff1a;杭州的天气信息…

什么品牌洗地机最好?精心挑选四大精品,值得信赖

随着洗地机爆发式的增长&#xff0c;人们对洗地机已经不再感到陌生了&#xff0c;周围很多朋友都纷纷入手了心仪的产品&#xff0c;但是&#xff0c;在激烈竞争的洗地机中&#xff0c;如何选到心仪的洗地机呢&#xff0c;快来深入了解洗地机选购技巧以及热门洗地机的功能特点吧…

基于EasyAnimate模型的视频生成最佳实践

EasyAnimate是阿里云PAI平台自主研发的DiT的视频生成框架&#xff0c;它提供了完整的高清长视频生成解决方案&#xff0c;包括视频数据预处理、VAE训练、DiT训练、模型推理和模型评测等。本文为您介绍如何在PAI平台集成EasyAnimate并一键完成模型推理、微调及部署的实践流程。 …

数据分析-相关性

0、提高数据样本质量 首先是确保数据采集的准确性与可靠性&#xff0c;也就是如何降低数据误差 系统误差是由测量工具不精确和测量方法选择不当造成的。这类误差我们可以通过校准工具或者选择更合适的测量方法来消除&#xff1b;随机误差是由环境因素等外部不可控原因导致的&…

PXE无人值守批量装机操作步骤

目录 PXE PXE所需环境 开机过程 部署PXE有人值守操作步骤 一. 配置环境 FTP DHCP和TFTP 二. 测试 部署无人值守操作步骤 一. 环境配置 二. 测试 总结 1. 实现PXE远程装机所需要的组件 2. PXE网络引导安装过程 PXE PXE&#xff1a;Preboot eXecution Environment…

印刷企业数字工厂管理系统规划方案

一、引言 随着科技的快速发展&#xff0c;数字化、智能化已成为制造业发展的重要趋势。对于印刷企业而言&#xff0c;数字化不仅是提升生产效率、降低成本的关键&#xff0c;更是适应市场变化、增强竞争力的必然选择。因此&#xff0c;本规划方案旨在构建一套完善的印刷企业数…

功能测试 之 单模块测试----抢购模块

1.先测后台&#xff0c;再测前台 面试题1: 当你发现研发实现的结果与需求不一致时怎么办? 需求评审的时候&#xff1a;需要确认所有输入类型的校验是针对单独的输入框做的还是在最终提交时校验 抢购模块&#xff1a;需求跟实现的内容不一致 (跟产品和研发一起确认。研发为什…

现在的ai是否和当年的5g一样被夸大了

AI写作、AI绘画对普通人影响也很大&#xff0c;为此也成就了一大批人。这是一个大趋势&#xff0c;AI能极大提高工作效率&#xff0c;这点毋庸置疑。不仅如此&#xff0c;对于普通人来说AI也对我们有很大的帮助&#xff0c;用AI回答遇到的问题&#xff0c;写一写文章什么的&…

003.Linux SSH协议工具

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

储备教师和正式教师的区别是什么?

当谈论教育行业的未来&#xff0c;是否曾想过&#xff0c;那些被称为"储备教师"的群体&#xff0c;与我们熟知的"正式教师"之间&#xff0c;有何本质的区别&#xff1f; 储备教师&#xff0c;顾名思义&#xff0c;是学校为了应对未来可能的教学需求而提前招…

【C语言 || 排序】希尔排序

文章目录 前言1.希尔排序1.1 直接插入排序1.2 直接插入排序的实现1.2.1 直接插入排序的代码实现 1.3 直接插入排序的时间复杂度1.4 希尔排序1.4.1 希尔排序概念1.4.1 希尔排序的代码实现 前言 1.希尔排序 1.1 直接插入排序 在写希尔排序之前&#xff0c;我们需要先了解直接插入…