vue3 实现点击可左右滑动

2023-10-26

具体代码如下

<template>
  <div>
    <div
      class="ProgressBoxTool"
      v-if="state.progressList && state.progressList.length"
    >
      <div class="processBox">
        <div
          :class="state.currentClickNumber > 0 ? 'arrow' : 'arrow arrowOpacity'"
          @click="fnPrev()"
        >
          <img :src="arrowL" alt="" />
        </div>
        <div class="fixedBox" ref="fixedBox">
          <div
            class="centerScroll"
            :style="`width:${
              state.signleWidth * state.progressList.length
            }px;transform:translate(${
              state.scrollResultWidth
            }px,0);transition:1s;`"
          >
            <div
              class="signleTab"
              v-for="(itemP, indexP) in state.progressList"
              :key="indexP + 'progress'"
            >
              <div class="leftIcon">
                <img class="pregressIcon" :src="icon" alt="" />
              </div>
              <!-- 最后一个不展示箭头 -->
              <img
                v-if="state.progressList.length > indexP + 1"
                :src="iconArrow"
                alt=""
                class="arrowSquare"
              />
            </div>
          </div>
        </div>

        <div
          :class="state.noScrollRight ? 'arrow' : 'arrow arrowOpacity'"
          @click="fnNext()"
        >
          <img :src="arrowR" alt="" />
        </div>
      </div>
    </div>
  </div>
</template>

<script lang="ts" setup>
import { reactive, ref, onMounted } from "vue";
import arrowL from "../../assets/images/arrow.png";
import arrowR from "../../assets/images/arrow.png";
import icon from "../../assets/images/icon.png";
import iconArrow from "../../assets/images/arrow.png";
const state = reactive({
  progressList: [
    { type: "1" },
    { type: "2" },
    { type: "1" },
    { type: "2" },
    { type: "1" },
    { type: "2" },
    { type: "1" },
    { type: "2" },
    { type: "1" },
    { type: "2" }
  ],
  currentProgressId: "",
  scrollResultWidth: 0, //transform滚动的距离
  signleWidth: 215, //单个流程的宽度
  activeName: 0,
  currentClickNumber: 0,
  noScrollRight: true
});
const fixedBox = ref();
const initgoRightArrow = () => {
  const currentScrollWidth = fixedBox.value.clientWidth;
  const canNumber = Math.floor(currentScrollWidth / state.signleWidth); //可以放下的个数
  //如果最后一个流程图标已经展示出来,则停止滚动
  if (state.currentClickNumber + canNumber >= state.progressList.length) {
    state.noScrollRight = false;
    return;
  }
};
onMounted(() => {
  initgoRightArrow();
});
const fnPrev = () => {
  //如果右点击的次数大于0,才可以左滚
  if (state.currentClickNumber > 0) {
    state.currentClickNumber -= 1;
    state.noScrollRight = true;
    fnScrollWidth("reduce");
  } else {
    return false;
  }
};
const fnNext = () => {
  const currentScrollWidth = fixedBox.value.clientWidth;
  const canNumber = Math.floor(currentScrollWidth / state.signleWidth); //可以放下的个数
  //如果最后一个流程图标已经展示出来,则停止滚动
  if (state.currentClickNumber + canNumber >= state.progressList.length) {
    return;
  }
  //说明放不下有滚动条
  if (state.progressList.length > canNumber) {
    state.currentClickNumber += 1;
    if (state.currentClickNumber + canNumber >= state.progressList.length) {
      state.noScrollRight = false;
    }
    fnScrollWidth("add");
  }
};
const fnScrollWidth = type => {
  let result = 0;
  if (type === "reduce") {
    result = 215;
  } else if (type === "add") {
    result = -215;
  } else {
    result = 0;
  }
  state.scrollResultWidth += result;
};
</script>

<style lang="scss" scoped>
//中间的时间发展部分
.processBox {
  display: flex;
  align-items: center;
  justify-content: space-between;
  .arrow {
    width: 60px;
    cursor: pointer;
  }
  .arrowOpacity {
    cursor: default;
    opacity: 0.4;
  }
  .fixedBox {
    flex: 1;
    overflow: hidden;
  }
  .centerScroll {
    // flex: 1;
    box-sizing: border-box;
    padding: 20px 0;
    white-space: nowrap;
    // width: calc(100% - 120px);
    // overflow-x: auto;
    .signleTab {
      width: 215px;
      position: relative;
      display: inline-block;
      .leftIcon {
        width: 150px;
        text-align: center;
        cursor: pointer;
        & > .pregressIcon {
          width: 60px;
          height: 60px;
        }
      }
      & > .arrowSquare {
        position: absolute;
        top: 25px;
        right: 0;
      }
    }
  }
}
</style>

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3 实现点击可左右滑动 的相关文章

随机推荐

  • 安装es-header插件

    1 官网下载https github com mobz elasticsearch head 2 解压 3 进入解压目录 调出cmd窗口 确定自己已经安装了node 如下确定 没有自行下载安装 4 输入前端包安装命令 等待几分钟下载 npm
  • 在android中opencv视频采集,【Android】【opencv】实现摄像头拍照和录像

    1 0 需求 在安卓开发板上实现视频监控功能 并能后台监控 由于后期可能跑视频识别 所以考虑用OpenCV实现 通过OpenCV Manager进行动态库的链接 实现帧的预览和保存 android版本 5 0 1 开发平台 Android
  • 1、VScode汉化以及如何设置跳转到函数定义

    一 汉化 1 首先打开软件 软件默认是英文配置状态 如图所示 2 使用快捷键 Ctrl Shift P 进入如下界面 3 然后在弹出的界面中 输入 configure language 然后选择 install additional lan
  • CocosCreator在电脑Web打印vConsole日志的问题

    忘了什么时候开始 Web端的日志打印的文件输入信息全是vconsole min js文件 很纠结啊有木有 完全不知道日志的出处 日志输入如以下图片 官方还没有给出对于这个问题的配置是怎么样解决的 所以我们自己搞定 我们进入CocosCrea
  • [linux kernel] 内核下RX8025对接系统时钟

    系统版本 Ubuntu18 04 64 编译器版本 gcc version 7 4 0 Ubuntu Linaro 7 4 0 1ubuntu1 18 04 1 uboot版本 2018 07 linux4sam 6 0 板子型号 at91
  • [JavaWeb] 登录页面记住密码,账号或密码错误

    个人主页 沫洺的主页 系列专栏 JavaWeb专栏 JavaSE专栏 Java基础专栏 vue3专栏 MyBatis专栏 Spring专栏 SpringMVC专栏 SpringBoot专栏 Docker专栏 Reids专栏 MQ专栏 Spr
  • 区块链概念介绍

    区块链定义 区块链是一些技术集成的 适用于多方博弈 由多方共同对数据背书的数据存储工具 区块链的核心技术包含块链式存储 点对点通讯 密码学 共识机制 智能合约等 区块链是利用块链式数据结构来验证与存储数据 利用分布式节点共识算法来生成和更新
  • myBatis的xml大于小于不等于模糊查询

    and o create time lt endTime jdbcType TIMESTAMP 小于 and o create time gt startTime jdbcType TIMESTAMP 大于 and i status fla
  • Multimedia Tools and Applications(MTAP)期刊投稿经验分享

    Multimedia Tools and Applications ISSN号 1380 7501 2022年影响因子 2 577 出版社 Springer US 学科分类 计算机科学 工程技术 中科院4区 JCR Q2 CCFC 我投递的
  • 达芬奇无法播放视频,黑屏,不能预览画面

    说一下其中一个原因 是因为用了像是xdisplay super display这类软件 他们会安装一个显卡驱动而这个驱动就会导致这个问题 方法很简单 在设备管理器里面 显示卡一览 卸载掉除了你的电脑显卡以外的虚拟显卡驱动
  • element ui 中table表格刷新、input输入框添加enter触发搜索、连续点击的处理办法

    8 25小结 1 table表格刷新 elementy ui有一个v loading 我们可以给它绑定一个布尔值 truer就是转圈圈 false就是停止转圈圈 在刷新按钮上绑定一个事件来控制这个布尔值的改变 但是需要加一个定时器才能看出来
  • spring-boot-maven-plugin爆红解决方案,亲测有效

    报错信息提示如下 Plugin org springframework boot spring boot maven plugin not found 我使用idea中的spring initialer 来创建的 maven项目 但是在下载
  • 揭秘——STL空间配置器

    为什么要有空间配置器呢 这主要是从两个方面来考虑的 1 小块内存带来的内存碎片问题 单从分配的角度来看 由于频繁分配 释放小块内存容易在堆中造成外碎片 极端情况下就是堆中空闲的内存总量满足一个请求 但是这些空闲的块都不连续 导致任何一个单独
  • java中常见的异常类型

    Throwable 类是 Java 语言中所有错误或异常的超类 只有当对象是此类 或其子类之一 的实例时 才能通过 Java 虚拟机或者 Java throw 语句抛出 类似地 只有此类或其子类之一才可以是 catch 子句中的参数类型 两
  • 基于MATLAB的多聚类相位展开算法实现

    基于MATLAB的多聚类相位展开算法实现 相位展开是一种常见的信号处理算法 用于从相位差模糊的信号中恢复出准确的相位信息 多聚类相位展开算法是相位展开的一种改进方法 能够有效处理多个相位聚类的情况 本文将介绍如何使用MATLAB实现多聚类相
  • 【转载】Parameter must be a descendant of this view问题的解决方案

    转载 原文链接为 http www cnblogs com monodin p 3675040 html 关于ViewFlow和GridView嵌套导致Parameter must be a descendant ofthis view问题
  • arcgis图不见了_arcgis的左边图层边栏不见了怎么弄出来

    1 要加载使用 空间分析模块 首先得在ArcMap中执行菜单命令 在扩展模块管理窗口中 将 空间分析 spatial analyst 前的检查框打勾 然后 在ArcMap 工具栏的空白区域点右键 在出现的右键菜单中找到 空间分析 spati
  • maven springmvc hibernate shiro 集成

    最近项目需要进行高要求的Web权限管理 在比较Spring security和Shiro之后由于Shiro更大的灵活度和更强的配置性选择了Shiro 不过官方的文档写的对于集成spring不太清楚 尤其是Realm怎样实现 因此 在查阅一系
  • pandas安装完成后,报错:ImportError

    安装完pandas后 在使用时 发现需要更新numpy 系统自带的版本是1 12 1 执行 pip install U numpy 安装成功 Traceback most recent call last File D Anaconda3
  • vue3 实现点击可左右滑动

    具体代码如下