React实现自动滚动表格

在 React 中实现一个自动滚动的表格,可以通过 CSS 动画和 JavaScript 定时器来实现。以下是一个完整的示例代码,包含示例数据和自动滚动功能。

实现思路:

  • ** 自动滚动:**

使用 setInterval 实现表格的自动滚动。

  • 手动滚动:

监听表格的 scroll 事件,当用户手动滚动时,暂停自动滚动。

使用 setTimeout 检测用户是否停止滚动,如果停止滚动一段时间(例如 2 秒),则恢复自动滚动。

  • 鼠标悬停
    鼠标悬停时停止滚动,鼠标移开后继续滚动

代码

import React, { useState, useEffect, useRef } from "react";
import "../Styles/AutoScrollTable.css"; // 引入样式文件const AutoScrollTable = () => {// 示例数据const [data, setData] = useState([{ id: 1, name: "Alice", age: 25, city: "New York" },{ id: 2, name: "Bob", age: 30, city: "Los Angeles" },{ id: 3, name: "Charlie", age: 35, city: "Chicago" },{ id: 4, name: "David", age: 40, city: "Houston" },{ id: 5, name: "Eva", age: 28, city: "Phoenix" },{ id: 6, name: "Frank", age: 33, city: "Philadelphia" },{ id: 7, name: "Grace", age: 22, city: "San Antonio" },{ id: 8, name: "Hank", age: 45, city: "San Diego" },{ id: 9, name: "Ivy", age: 29, city: "Dallas" },{ id: 10, name: "Jack", age: 31, city: "San Jose" },]);const tableRef = useRef(null); // 用于引用表格容器const scrollIntervalRef = useRef(null); // 存储自动滚动的定时器// 开始自动滚动const startAutoScroll = () => {if (scrollIntervalRef.current) return; // 如果已经有定时器,则不重复启动scrollIntervalRef.current = setInterval(() => {const table = tableRef.current;if (!table) return;const scrollHeight = table.scrollHeight; // 表格总高度const clientHeight = table.clientHeight; // 可视区域高度const maxScroll = scrollHeight - clientHeight; // 最大滚动距离let scrollTop = table.scrollTop + 1; // 每次滚动 1pxif (scrollTop >= maxScroll) {scrollTop = 0; // 滚动到底部后回到顶部}table.scrollTop = scrollTop;}, 50); // 每 50ms 滚动一次};// 停止自动滚动const stopAutoScroll = () => {if (scrollIntervalRef.current) {clearInterval(scrollIntervalRef.current);scrollIntervalRef.current = null;}};// 处理鼠标事件const handleMouseEnter = () => {stopAutoScroll();};const handleMouseLeave = () => {startAutoScroll();};useEffect(() => {const table = tableRef.current;if (!table) return;// 初始化自动滚动startAutoScroll();// 监听鼠标事件table.addEventListener("mouseenter", handleMouseEnter);table.addEventListener("mouseleave", handleMouseLeave);// 清除事件监听和定时器return () => {table.removeEventListener("mouseenter", handleMouseEnter);table.removeEventListener("mouseleave", handleMouseLeave);stopAutoScroll();};}, []);return (<div className="table-container"><h2>自动滚动表格(鼠标悬停时停止滚动)</h2><div className="scrollable-table" ref={tableRef}><table style={{ borderCollapse: 'collapse', width: '100%', border: '1px solid black' }}><thead><tr><th style={{ border: '1px solid black', padding: '8px' }}>ID</th><th style={{ border: '1px solid black', padding: '8px' }}>Name</th><th style={{ border: '1px solid black', padding: '8px' }}>Age</th><th style={{ border: '1px solid black', padding: '8px' }}>City</th></tr></thead><tbody>{data.map((item) => (<tr key={item.id} style={{ borderBottom: '1px solid black' }}><td style={{ border: '1px solid black', padding: '8px' }}>{item.id}</td><td style={{ border: '1px solid black', padding: '8px' }}>{item.name}</td><td style={{ border: '1px solid black', padding: '8px' }}>{item.age}</td><td style={{ border: '1px solid black', padding: '8px' }}>{item.city}</td></tr>))}</tbody></table></div>
</div>);
};export default AutoScrollTable;

样式文件 (AutoScrollTable.css):

.table-container {margin: 20px;font-family: Arial, sans-serif;
}.scrollable-table {max-height: 300px; /* 设置表格的最大高度 */overflow-y: auto; /* 允许垂直滚动 */border: 1px solid #ccc; /* 表格边框 */border-radius: 4px; /* 圆角 */box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); /* 阴影效果 */
}table {width: 100%;border-collapse: collapse; /* 单元格合并边框 */
}th, td {border: 1px solid #ddd; /* 单元格边框 */padding: 12px; /* 单元格内边距 */text-align: left; /* 左对齐 */
}th {background-color: #f4f4f4; /* 表头背景颜色 */font-weight: bold; /* 加粗字体 */
}tr:nth-child(even) {background-color: #f9f9f9; /* 偶数行背景色 */
}tr:hover {background-color: #f1f1f1; /* 鼠标悬停行的背景色 */
}.table-container {width: 95%;padding: 20px;box-sizing: border-box;
}.scrollable-table {overflow: auto;height: 300px; /* 设置表格容器的高度以实现滚动效果 */border: 1px solid #ccc;border-radius: 5px;
}table {width: 100%;border-collapse: collapse;
}thead {position: sticky;top: 0;background-color: #f8f8f8;
}th, td {border: 1px solid #ddd;padding: 8px;text-align: left;
}th {background-color: #5179be;color: white;
}tbody tr:nth-child(even) {background-color: #f2f2f2;
}tbody tr:hover {background-color: #ddd;
}

效果图:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年GESP09月认证Scratch一级试卷

2024年GESP09月认证Scratch一级试卷分数&#xff1a;100 题数&#xff1a;17 一、单选题(共10题&#xff0c;每题3分&#xff0c;共30分) 01020304050607080910AACBCABCDD 1、据有关资料&#xff0c;山东大学于1972年研制成功DJL-1计算机&#xff0c;并于1973年投入运行&…

Qt常用控件之按钮QPushButton

按钮QPushButton QPushButton 在 Qt 中用于表示一个按钮控件&#xff0c;它继承自抽象 QAbstractButton 类。 QPushButton属性 属性说明text按钮中的文本。icon按钮中的图标。iconSize按钮中图标的大小。shortCut按钮对应的快捷键。autoRepeat按钮是否会重复触发&#xff08…

【PHP】php+mysql 活动信息管理系统(源码+论文+数据库+数据库文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【PHP】php 活动信息管理系统&#xff08;源码论文…

搭建一个 Spring Boot 项目,解决jdk与springboot版本不匹配

搭建一个 Spring Boot 项目 方式一&#xff1a;使用 Spring Initializr Spring Initializr 是一个基于 Web 的工具&#xff0c;用于快速生成 Spring Boot 项目的基础结构。 访问 Spring Initializr 网站&#xff1a;https://start.spring.io/配置项目信息&#xff1a; …

基于SpringBoot的小区运动中心预约管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

WPF快速创建DeepSeek本地自己的客户端-基础思路版本

开发工具&#xff1a;VS 2015 开发环境&#xff1a;.Net 4.0 使用技术&#xff1a;WPF 本篇文章内容&#xff1a; 本地部署DeepSeek以后一般使用网页工具&#xff08;如Chatbox&#xff09;或者DOS窗口与其对话。本篇文章使用WPF创建一个基础版的对话工具。 一、搭建本地DeepS…

【怎么使用Redis实现一个延时队列?】

怎么使用Redis实现一个延时队列? 详细说明Java代码示例解释注意事项使用Redis实现延时队列通常通过有序集合(Sorted Set)来实现,利用Redis的ZSET类型及其相关命令可以很方便地实现这一功能。 有序集合中的每个元素都有一个分数(score),我们可以利用这个分数来存储消息需…

Blackbox.AI:高效智能的生产力工具新选择

前言 在当今数字化时代&#xff0c;一款高效、智能且功能全面的工具对于开发者、设计师以及全栈工程师来说至关重要。Blackbox.AI凭借其独特的产品特点&#xff0c;在众多生产力工具中脱颖而出&#xff0c;成为了我近期测评的焦点。以下是我对Blackbox.AI的详细测评&#xff0…

第2章 信息技术发展(一)

2.1 信息技术及其发展 2.1.1 计算机软硬件 计算机硬件(Computer Hardware)是指计算机系统中由电子、机械和光电元件等组成的各种物理装置的总称。 计算机软件 (Computer Software)是指计算机系统中的程序及其文档&#xff0c;程序是计算任务的处理对象和处理规则的描述; 文档…

AI工作流

AI 工作流 是什么&#xff1f; AI 工作流 是一种利用人工智能技术设计的一系列任务或步骤序列&#xff0c;用于完成特定目标的过程。它将一系列AI相关的操作整合在一起&#xff0c;形成一个高效的、结构化的流程&#xff0c;从而实现预定的目标。 AI 工作流 的组成部分 目标定…

用deepseek学大模型08-卷积神经网络(CNN)

yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c;预测结果的可视化展示&#xff0c; 模型应用场景和优缺点&#xf…

数据库加密全解析:从传输到存储的安全实践

title: 数据库加密全解析:从传输到存储的安全实践 date: 2025/2/17 updated: 2025/2/17 author: cmdragon excerpt: 数据加密是数据库安全的最后一道物理防线。传输层SSL/TLS配置、存储加密技术及加密函数实战应用,覆盖MySQL、PostgreSQL、Oracle等主流数据库的20+生产级加密…

以太网详解(八)传输层协议:TCP/UDP 协议

文章目录 传输层协议概述为什么需要传输层&#xff1f;传输层功能网络层与传输层在实现 “端到端” 传输的异同两类服务:面向连接/无连接服务 传输控制协议 TCPTCP 协议数据单元格式TCP 的重传机制快重传和快恢复快重传举例快恢复算法 用户数据报协议 UDPUDP 概述UDP 基本工作过…

贪吃蛇游戏

贪吃蛇 一、html <div class"container" id"app"></div><script src"./js/index.js"></script>二、css * {margin: 0;top: 0;} .set {margin: 15px auto;width: 600px; } .container {width: 600px;height: 600px;bac…

【动态路由】系统Web URL资源整合系列(后端技术实现)【apisix实现】

需求说明 软件功能需求&#xff1a;反向代理功能&#xff08;描述&#xff1a;apollo、eureka控、apisix、sentinel、普米、kibana、timetask、grafana、hbase、skywalking-ui、pinpoint、cmak界面、kafka-map、nacos、gateway、elasticsearch、 oa-portal 业务应用等多个web资…

Spring Boot(七):Swagger 接口文档

1. Swagger 简介 1.1 Swagger 是什么&#xff1f; Swagger 是一款 RESTful 风格的接口文档在线自动生成 功能测试功能软件。Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。目标是使客户端和文件系统作为服务器以同样的…

MongoDB 7 分片副本集升级方案详解(上)

#作者&#xff1a;任少近 文章目录 前言&#xff1a;Mongodb版本升级升级步骤环境1.1环境准备1.2standalone升级1.3分片、副本集升级 前言&#xff1a;Mongodb版本升级 在开始升级之前&#xff0c;请参阅 MongoDB下个版本中的兼容性变更文档&#xff0c;以确保您的应用程序和…

Redis离线安装

Linux系统Centos安装部署Redis缓存插件 参考&#xff1a;Redis中文网&#xff1a; https://www.redis.net.cn/ 参考&#xff1a;RPM软件包下载地址&#xff1a; https://rpmfind.net/linux/RPM/index.html http://rpm.pbone.net/ https://mirrors.aliyun.com/centos/7/os…

长视频生成、尝试性检索、任务推理 | Big Model Weekly 第56期

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 01 COMAL:AConvergent Meta-Algorithm for Aligning LLMs with General Preferences 许多对齐方法&#xff0c;包括基于人类反馈的强化学习&#xff08;RLHF&#xff09;&#xff0c;依赖于布拉德利-特里&#…

SQL高级语法

1. TOP 子句 TOP 子句用于规定要返回的记录的数目。 对于拥有数千条记录的大型表来说&#xff0c;TOP 子句是非常有用的。 SQL Server 的语法&#xff1a; SELECT TOP number|percent column_name(s) FROM table_name MySQL 语法 在 MySQL 中&#xff0c;并没有直接支持 TOP 语…