大屏表格实现无限滚动效果

news2024/10/5 10:14:45

实现效果

hmgif3

实现思路

  1. 首先固定最外层的高度,并且设置超出高度后隐藏
  2. 设置每一行的高度为固定35PX,默认显示10行,所以最外层高度就是 35 * 10 + 表头的高度
  3. 遍历时克隆一份表格数据,用于视差效果显示
  4. 设置滚动动画,让表格行所在的父元素 tableTr 不断往上移动,当移动到末尾数据时,此时定义的移动距离 position 刚好时总高度的一半
  5. 然后重置 position 的距离为0,因为我们克隆了一份数据,此时便不会有闪跳的情况,给人的感觉就是继续往上滚动,从而实现无限滚动的效果

完整代码

<template>
  <div class="table-box">
    <!--表头-->
    <div class="table-th">
      <div style="width: 60px">排名</div>
      <div>区域</div>
      <div>总服务人数</div>
      <div>2023年</div>
      <div>2024年</div>
    </div>
    <!--表格数据-->
    <div class="table-tr" ref="tableTr" @mouseenter="pause" @mouseleave="resume">
      <!--克隆一份数据-->
      <div
        class="tr-item"
        v-for="(item, index) in [...tableData, ...tableData]"
        :key="index"
        :class="{ 'even-background': index < 15 ? index % 2 !== 0 : index % 2 === 0 }"
      >
        <div class="index-item">
          <div v-if="item.ranking <= 3" class="tab-index index-bg">
            {{ item.ranking }}
          </div>
          <div v-else class="tab-index">
            {{ item.ranking }}
          </div>
        </div>
        <div>{{ item.province }}</div>
        <div>{{ item.totalServiceNumber }}</div>
        <div>{{ item.yearNumber2 }}</div>
        <div>{{ item.yearNumber3 }}</div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'demo2',
  data() {
    return {
      tableData: [],
      position: 0,
      animationId: null,
    }
  },
  mounted() {
    this.getTableData()
    this.$nextTick(() => {
      this.animation()
    })
  },
  methods: {
    /**
     * 暂停动画。
     * 此方法通过取消动画帧请求来暂停动画的执行。
     * 当鼠标移入组件时调用,以暂停动画的播放。
     */
    pause() {
      cancelAnimationFrame(this.animationId) // 取消当前的动画帧请求
      this.animationId = null // 清空动画帧请求的ID
      this.isPaused = true // 标记动画为暂停状态
    },
    /**
     * 恢复动画。
     * 如果动画当前处于暂停状态,此方法会重新启动动画。
     * 当鼠标移出组件时调用,以恢复动画的播放。
     */
    resume() {
      if (this.isPaused) {
        // 当动画处于暂停状态时
        this.animation() // 重新调用动画函数
        this.isPaused = false // 将动画状态设置为播放
      }
    },
    /**
     * 启动一个动画,用于滚动表格中的行。
     * 此函数没有参数和返回值,因为它直接操作DOM并启动一个循环动画。
     * 动画效果是通过改变行的垂直偏移来实现的。
     */
    animation() {
      // 获取将要进行动画的ul元素
      let tableTr = this.$refs.tableTr
      // 获取ul元素的高度,用于计算动画的终点
      let tableTrHeight = tableTr.offsetHeight
      /**
       * 动画循环函数。
       * 不断调整元素的垂直偏移,创造向下滚动的效果。
       * 当元素偏移超过其高度的一半时,重置偏移值,实现循环滚动。
       */
      const animate = () => {
        this.position -= 2 // 每次循环减少的偏移量,控制动画速度
        if (this.position <= -(tableTrHeight / 2)) {
          this.position = 0 // 当偏移量小于等于负的一半高度时,重置偏移量,准备下一次循环
        }
        tableTr.style.transform = `translateY(${this.position}px)` // 应用偏移量到元素的transform属性上,实现动画效果
        this.animationId = requestAnimationFrame(animate) // 请求下一个动画帧继续执行此函数,保持动画运行
      }
      animate() // 初始化动画
    },
    getTableData() {
      const generatedData = []
      const provinces = [
        '北京',
        '上海',
        '广东',
        '江苏',
        '浙江',
        '山东',
        '河南',
        '湖南',
        '湖北',
        '四川',
        '福建',
        '安徽',
        '陕西',
        '重庆',
        '云南',
      ]
      const randomServiceNumber = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min
      for (let i = 0; i < 15; i++) {
        const province = provinces[Math.floor(Math.random() * provinces.length)]
        const totalServiceNumber = randomServiceNumber(1000, 10000).toString()
        const yearNumber2 = randomServiceNumber(500, 5000).toString()
        const yearNumber3 = randomServiceNumber(1000, 8000).toString()

        generatedData.push({
          ranking: i + 1,
          province,
          totalServiceNumber,
          yearNumber2,
          yearNumber3,
        })
      }

      this.tableData = generatedData
    },
  },
}
</script>

<style scoped lang="scss">
.table-box {
  background-color: #000;
  color: white;
  // 最外层父元素必须要定高
  width: 500px;
  height: 385px;
  overflow: hidden;
}

.table-th {
  display: flex;
  align-items: center;
  justify-content: space-around;
  background-color: #1a8dec;
  font-weight: 100;
  font-size: 14px;
  padding: 2px 0;
  height: 35px;
  line-height: 35px;
  position: sticky;
  z-index: 2;

  & > div {
    width: 120px;
    text-align: center;
  }
}

.table-tr {
  display: flex;
  flex-direction: column;

  .tr-item {
    display: flex;
    align-items: center;
    justify-content: space-around;
    font-weight: 100;
    font-size: 12px;
    height: 35px; // 每一行的高度也必须固定,用户计算滚动距离
    line-height: 35px;

    & > div {
      width: 120px;
      text-align: center;
    }

    .index-item {
      width: 60px;
      display: flex;
      align-items: center;
      justify-content: center;
    }
  }

  //.tr-item:nth-child(odd) {
  //  background-color: #322c5f;
  //}
}

.even-background {
  background-color: #322c5f;
}

.tab-index {
  width: 16px;
  height: 16px;
  line-height: 16px;

  text-align: center;
  border-radius: 50%;
  background-color: #4666ff;
}

.index-bg {
  background-color: #f43737;
}
</style>

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

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

相关文章

docker image分析利器之dive

dive是一个用于研究 Docker 镜像、层内容以及发现缩小 Docker/OCI 镜像大小方法的开源工具. 开源地址: dive github 为了有个直观的印象, 可以先看一下repo文档中的gif图: 安装 在Ubuntu/Debian系统下&#xff0c;可以使用deb包安装: DIVE_VERSION$(curl -sL "https:/…

Transformer模型的简单学习

前言 Transformer 来源于一篇论文&#xff1a;Attention is all you need TRM在做一件什么事情呢&#xff1f;其实一开始它是被用于机器翻译的&#xff1a; 更详细的&#xff1a; 更详细的&#xff1a; 从上图可以看出&#xff0c;一个Encoders 下面包含了 n 个 Encoder&…

Python Anaconda环境复制

虚拟环境复制 conda-pack 第一种方式 conda打包 在打包之前如果没有conda-pack包的话&#xff0c;需要安装pip install conda-pack打包 conda pack -n py36 -o py366.tar.gz -o就是给导出得到的压缩包就在当前目录下 传输到另外一台服务器上 有两台linux服务器&#xff0c…

详析河南道路与桥梁乙级资质新办条件

河南道路与桥梁乙级资质新办条件详析如下&#xff1a; 一、企业基本条件 独立企业法人资格&#xff1a; 申请人必须是具有独立企业法人资格的单位。注册资金&#xff1a; 企业的注册资金应不少于100万元人民币。社会信誉&#xff1a; 申请人应具有良好的社会信誉&#xff0c;无…

RunnerGo V4.6.0 多项新增功能,快看看有没有你想要的!

RunnerGo V4.6.0版本上线&#xff0c;不仅对现有功能进行了深度优化和改进&#xff0c;还带来了诸多新功能。 UI 插件&#xff1a;浮窗升级&#xff0c;优化浏览体验 此次更新中&#xff0c;UI插件全新升级至V2.1版本。新版取消了页面内右下角按钮的设计&#xff0c;在浏览器右…

postman调用Grpc

环境&#xff1a; .net6.0 一、准备 安装nuget&#xff1a; Grpc.AspNetCore Google.Protobuf Grpc.Core.Api Grpc.Tools Grpc.AspNetCore.Server.Reflection Program.cs&#xff1a; public class Program{public static void Main(string[] args){var builder WebApplicat…

Linux 删除SSH密钥(id_ed25519),重新生成

在Linux系统中&#xff0c;重新生成SSH密钥&#xff08;比如id_ed25519&#xff09;的过程包括删除现有的密钥文件并生成一个新的。 以下是具体的步骤&#xff1a; 0. 查看下是否有密钥 1. 删除原有的id_ed25519密钥 默认情况下&#xff0c;SSH密钥存储在用户的主目录下的 .…

最新!!2024年上半年软考【中级软件设计师】综合知识真题解析

2024上半年软考考试已经结束了&#xff0c;为大家整理了网友回忆版的软件设计师真题及答案&#xff0c;总共30道题。 上半年考试的宝子们可以对答案预估分数&#xff01;准备下半年考的宝子可以提前把握考试知识点和出题方向&#xff0c;说不定会遇到相同考点的题目&#xff01…

网络流量探针与流量分析系统:全面指南

目录 什么是网络流量探针&#xff1f; 流量分析系统的功能与重要性 流量分析系统的主要功能 流量分析系统的重要性 AnaTraf 网络流量分析仪 如何选择合适的网络流量探针与流量分析系统&#xff1f; 1. 性能与扩展性 2. 易用性与部署 3. 数据可视化与报告 4. 安全性与…

指定GPU运行程序设置cmd运行的程序后台运行

一、指定GPU运行程序 因为条件限制&#xff0c;拿到的资源只有一块GPU&#xff0c;这时我们需要设置程序在指定的GPU运行。解决思路&#xff1a;在train文件中设置环境变量&#xff0c;让程序在指定GPU运行。 import os os.environ["CUDA_VISIBLE_DEVICES"] "…

汽车合面合壳密封UV胶固化后一般可以耐多少度的高温和低温? 汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车合面合壳密封UV胶固化后一般可以耐多少度的高温和低温? UV胶固化后的耐高温和低温能力取决于具体的UV胶水品牌和型号&#xff0c;以及固化过程中的条件。一般来说&#xff0c;高品质的UV胶水在固化后可以提供较好的耐温性能&#xff0c;但确切的耐温范围需要参考各个厂家提…

ubuntu使用oh my zsh美化终端

ubuntu使用oh my zsh美化终端 文章目录 ubuntu使用oh my zsh美化终端1. 安装zsh和oh my zsh2. 修改zsh主题3. 安装zsh插件4. 将.bashrc移植到.zshrcReference 1. 安装zsh和oh my zsh 首先安装zsh sudo apt install zsh然后查看本地有哪些shell可以使用 cat /etc/shells 将默…

gmssl vs2010编译

1、虚拟机win10 x64&#xff0c;离线安装vs2010和2010sp1补丁&#xff1b; 2、安装ActivePerl_v5.28.1.0000和nasm-2.16.03-installer-x64均是默认完整安装&#xff1b; nasm官网下载&#xff1a; Index of /pub/nasm/releasebuilds/2.16.03/win64https://www.nasm.us/pub/nas…

链表带环问题的思考

判断链表是否带环 思路&#xff1a;快慢指针 慢指针走一步&#xff0c;快指针走两步&#xff0c;当快指针追上慢指针时&#xff0c;代表该链表带环。代码如下: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ …

【服务器报错】Pycharm运行服务器代码提示 can‘t open file “本地文件路径“

1. 问题 Pycharm连接远程服务器&#xff0c;代码已经同步&#xff0c;运行时候报错 #模拟报错 bash: line 0: cd: G:/python/hhh/Hi: No such file or directory /home/hhh/anaconda3/envs/hard/bin/python: cant open file G:/python/hhh/hi/hei.py: [Errno 2] No such file…

Marvelous Designer12 解锁版安装教程 (3D服装设计软件)

前言 Marvelous Designer允许您使用我们的尖端设计软件创建美丽的3D虚拟服装。最后&#xff0c;使用工具在提高质量的同时节省时间&#xff0c;为您的设计注入活力。从基本衬衫到复杂的褶皱连衣裙和粗糙的制服&#xff0c;Marvelous Designer几乎可以将织物纹理和物理特性复制…

基于NAMUR开放式架构(NOA)的工业设备数据采集方案

一 NAMUR开放式架构 传统自动化金字塔结构的优越性在过去许多年里已被证明。然而&#xff0c;传统的自动化金字塔在获取和利用对物联网和工业4.0有价值的数据方面却存在一定挑战。这是因为传统系统通常是封闭的&#xff0c;数据访问受到限制&#xff0c;难以集成到新的数字化解…

GoldenEye-v1(vulnhub)靶机练习实践报告

GoldenEye-v1****靶机练习实践报告 一、安装靶机 靶机是.ova文件&#xff0c;需要用VirtualBox打开&#xff0c;但我习惯于使用VMWare,因此修改靶机文件&#xff0c;使其适用于VMWare打开。 解压ova文件&#xff0c;得到.ovf文件和.vmdk文件。 用记事本打开.ovf文件并修改“…

聚会活跃气氛神器小程序源码系统 各种小游戏 让聚会不再冷场 带源代码包以及安装搭建教程

系统概述 在社交聚会中&#xff0c;如何让气氛活跃起来一直是一个让人关注的问题。小编给大家分享一款聚会活跃气氛神器小程序源码系统。它不仅提供了丰富多样的小游戏&#xff0c;还带有源代码包和详细的安装搭建教程&#xff0c;让你轻松打造属于自己的聚会互动平台。 代码…

WPS文件没有保存怎么恢复?5个解决方案轻松恢复!

“我在WPS上编辑了一个文件&#xff0c;但是还没来得及将它保存&#xff0c;我不小心就退出软件了&#xff0c;现在不知道有什么方法可以恢复WPS文件呢&#xff1f;大家可以帮帮我吗” WPS作为一款功能强大且用户友好的软件&#xff0c;给我们的工作带来了很多的便利。但我们在…