用 React+ts 实现无缝滚动的走马灯
一、走马灯的作用
走马灯是一种常见的网页交互组件,可以展示多张图片或者内容,通过自动播放或者手动切换的方式,让用户能够方便地浏览多张图片或者内容。
本次实现的不是轮播图而是像传送带一样的无限滚动的形式。
二、需求梳理
走马灯可设置一下属性:
- 滚动速度
- 滚动方向
- 一屏要显示项的个数
- 容器的宽度
- 要展示的数据
- 自定义展示项
三、实现思路
3.1 首先确定一下我们的dom元素
wrap>list>item*n
- 最外层wrap用于限制显示区域的宽度,超过宽度就隐藏。
- list 用于滚动显示数据,所以我们的动画加在这个元素上。
- item 用于放置展示项。
3.2 实现无限滚动的动画
我们用keyframes关键帧动画来做。
但是要滚动多少距离才能实现无限滚动呢?
1.计算动画滚动距离
从上面的图中我们可以看到当list的宽度<wrap的宽度(containerWidth)时,会出现滚动后出现空白的情况。那么第二张图,list的宽度>=wrap的两倍,就能在向左滚动完list的一半后,不会出现空白,而且为了给人一种无限滚动的效果,list的前后两部分数据要保持一致。
所以滚动的距离 = 展示数据的个数 * 每项的宽度,而为了无限滚动效果,我们还需要对原始数据进行处理。
分为以下几种情况:
- 数据个数>= 一屏展示个数(showNum)
此时重复两次原始数据就能得到滚动数据
- 数据个数< 一屏展示个数
首先我们要保证没有空白,那要如何填充呢?只填充到=showNum,行不行呢?
我们可以看一下:
比如说原始数据为[1,2,3],填充完再进行重复则为 [1,2,3,1,1,2,3,1],这样会出现1这一项连续出现了。
所以最好的方式是直接填充原始数据直到>=showNum,所以最终我们得到的滚动数据是[1,2,3,1,2,3 ,1,2,3,1,2,3]
2.插入动画
因为我们的动画是根据传入的变量得来的,所以不能直接写在样式文件里,我们通过在useEffect里插入样式表对象的方式来实现。
四、完整代码
组件代码
import { ReactElement, useEffect } from "react";
import * as React from "react";
import "./index.less";
import { ItemProps } from "./demo";
interface Props {Item: (item: ItemProps) => ReactElement;showNum: number;speed: number;containerWidth: number;data: Array<any>;hoverStop?: boolean;direction?: "left" | "right";
}
const fillArray = (arr: any[], length: number): any[] => {const result: any[] = [];while (result.length < length) {result.push(...arr);}return result.concat(result);
};function AutoplayCarousel({Item,showNum,speed,containerWidth,data,hoverStop = false,direction = "left"
}: Props) {const showData = fillArray(data, showNum);const length = showData.length;const itemWidth = containerWidth / showNum;useEffect(() => {// 创建一个新的样式表对象const style = document.createElement("style");// 定义样式表的内容let start = "0";let end = `-${(itemWidth * length) / 2}`;if (direction === "right") {start = end;end = "0";}style.innerText = `@keyframes templates-partner-moving {0% {transform: translateX(${start}px);}100% {transform: translateX(${end}px);}}`;if (hoverStop) {style.innerText += `.list:hover {/*鼠标经过后,动画暂停*/animation-play-state: paused !important;}`;}// 将样式表插入到文档头部document.head.appendChild(style);// 组件卸载时清除样式表return () => document.head.removeChild(style) as any;}, []);return (<div style={{ width: `${containerWidth}px` }} className="wrap"><divclassName="list"style={{width: `${itemWidth * length}px`,animation: `templates-partner-moving ${(length / showNum / 2) * speed}s infinite linear`}}>{showData.map((item) => (<div style={{ width: `${itemWidth}px` }}><Item {...item} /></div>))}</div></div>);
}export default AutoplayCarousel;
demo代码
import React from "react";
import AutoplayCarousel from "./index";
const data = new Array(5).fill(0).map((item, index) => {return { num: index };
});
console.log("data", data);
export interface ItemProps {num: number;
}
const itemStyle = {border: "1px solid #ccc",background: "#fff",height: "50px",color: "red",marginRight: "15px"
};
function Demo() {const Item = (item: ItemProps) => {return <div style={itemStyle}>{item.num}</div>;};return (<AutoplayCarouselItem={Item}containerWidth={500}showNum={5}speed={8}data={data}/>);
}export default Demo;
样式代码
* {margin: 0;padding: 0;
}.wrap {overflow: hidden;.list {position: relative;top: 0px;left: 0px;height: 100%;display: flex;}
}
相关文章:

用 React+ts 实现无缝滚动的走马灯
一、走马灯的作用 走马灯是一种常见的网页交互组件,可以展示多张图片或者内容,通过自动播放或者手动切换的方式,让用户能够方便地浏览多张图片或者内容。 本次实现的不是轮播图而是像传送带一样的无限滚动的形式。 二、需求梳理 走马灯可设…...

三维模型OSGB格式轻量化重难点分析
三维模型OSGB格式轻量化重难点分析 在三维模型应用中,为了适应移动设备的硬件和网络限制等问题,OSGB格式轻量化处理已经成为一个重要的技术手段。但是,在实际应用中,OSGB格式轻量化仍然存在着一些重难点问题。下面将对这些问题进行…...

C#__事件event的简单使用:工具人下楼问题
// 工具人类 namespace DownStair {delegate void DownStairDelegate(); // 定义了一个下楼委托class ToolMan{public string Name { get; set; } // 声明工具人的名字属性// public DownStairDelegate downStairDelegate null; // 初始化委托downStair为空委托// 解决方案pu…...
初识Spring-ioc
初识Spring-ioc 1. Spring的简介2.Spring容器ioc的特点3.spring注入方式1.Setter方法注入(Setter Injection):通过Setter方法来注入依赖。在类中定义对应的Setter方法,并在方法中接收依赖的参数,Spring容器会通过调用S…...

windows10 安装WSL2, Ubuntu,docker
AI- 通过docker开发调试部署ChatLLM 阅读时长:10分钟 本文内容: window上安装ubuntu虚拟机,并在虚拟机中安装docker,通过docker部署数字人模型,通过vscode链接到虚拟机进行开发调试.调试完成后,直接部署在云…...

Java面试题目汇总
一、面向对象的三个基本特征 2、方法重载和方法重写的概念和区别 3、接口和内部类、抽象类的特性 4、文件读写的基本类 **5、串行化的注意事项以及如何实现串行化 6、线程的基本概念、线程的基本状态以及状态之间的关系 7、线程的同步、如何实现线程的同步 8、几种常用的数据结…...
【ARM 嵌入式 编译系列 6 -- GCC objcopy, objdump, readelf, nm 介绍】
文章目录 GCC objcopy 简介objcopy 常用参数GCC objdump 简介GCC readelf 介绍GCC nm 介绍上篇文章:ARM 嵌入式 编译系列 5 – GCC 内建函数 __builtin 详细介绍 下篇文章:ARM 嵌入式 编译系列 7 – ARM GCC 链接脚本详细讲解 GCC objcopy 简介 objcopy 是 GNU二进制工具集(…...

c语言每日一练(9)
前言:每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情…...
毫米波射频方案分析
豪米波被誉为能够带来令人难以置信的网络吞吐量数据,但迄今为止它的采用一直乏善可陈。 毫米波技术的领导者高通公司认为,他们拥有高达60亿美元的前端机会。这 60亿美元将需要在日本、中国、韩国、欧洲和印度广泛采用 mmWave。尽管有这个巨大的机会&am…...
神经网络基础-神经网络补充概念-04-梯度下降法
概念 梯度下降法是一种常用的优化算法,用于在机器学习和深度学习中更新模型参数以最小化损失函数。它通过迭代地调整参数,沿着损失函数的负梯度方向移动,从而逐步逼近损失函数的最小值。 基本思想 梯度下降法的基本思想是:在每…...
神经网络基础-神经网络补充概念-45-指数加权平均
概念 指数加权平均(Exponential Moving Average,EMA)是一种平均方法,用于平滑时间序列数据或者计算变量的滚动均值。它对数据的权重分布呈指数递减,越靠近当前时刻的数据权重越高,越远离当前时刻的数据权重…...

模型预测笔记(一):数据清洗及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
模型预测 一、导入关键包二、如何载入、分析和保存文件三、修改缺失值3.1 众数3.2 平均值3.3 中位数3.4 0填充 四、修改异常值4.1 删除4.2 替换 五、数据绘图分析5.1 饼状图5.1.1 绘制某一特征的数值情况(二分类) 5.2 柱状图5.2.1 单特征与目标特征之间的…...
【Pytroch】基于K邻近算法的数据分类预测(Excel可直接替换数据)
【Pytroch】基于K邻近算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果1.模型原理 K最近邻(K-Nearest Neighbors,简称KNN)是一种简单但常用的机器学习算法,用于分类和回归问题。它的核心思想是基于已…...
Centos 7 通过Docker 安装MySQL 8.0.33实现数据持久化及my.cnf配置
要在 CentOS 7 上使用 Docker 启动 MySQL 8.0.33,并配置 MySQL 的 my.cnf 文件,同时实现 MySQL 数据的持久化,可以按照以下步骤进行操作: 1、安装 Docker:确保你在 CentOS 7 上已经安装了 Docker。如果尚未安装&#…...

自夹持P型屏蔽型碳化硅沟槽型绝缘栅双极晶体管,用于低开通电压和开关损耗
目录 标题:Self-Clamped P-shield SiC Trench IGBT for Low On-State Voltage and Switching LossProceedings of the 35st International Symposium on Power Semiconductor Devices & ICs摘要信息解释研究了什么文章的创新点文章的研究方法文章的结论 标题&am…...

【数据结构与算法——TypeScript】树结构Tree
【数据结构与算法——TypeScript】 树结构(Tree) 认识树结构以及特性 什么是树? 🌲 真实的树:相信每个人对现实生活中的树都会非常熟悉 🌲 我们来看一下树有什么特点? ▫️ 树通常有一个根。连接着根的是树干。 ▫️ 树干到…...

多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测
多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测; 2.运行环境为Matlab20…...

Shell 编程基础01
0:目录 1.创建新的虚拟机项目 2.linux常见命令和配置时间同步器 3.文件属性 4.if for while和方法 1.创建新的虚拟机项目 默认下一步到虚拟机命名 默认下一步设置磁盘大小 自定义硬件 删除打印机设置映像地址 启动虚拟机 选择 install centOS 7 选择英文 设置时…...

Cross-Site Scripting
文章目录 反射型xss(get)反射型xss(post)存储型xssDOM型xssDOM型xss-xxss-盲打xss-过滤xss之htmlspecialcharsxss之href输出xss之js输出 反射型xss(get) <script>alert("123")</script>修改maxlength的值 反射型xss(post) 账号admin密码123456直接登录 …...
基于java企业员工绩效考评系统设计与实现
摘 要 时代的变化速度实在超出人类的所料,21世纪,计算机已经发展到各行各业,各个地区,它的载体媒介-计算机,大众称之为的电脑,是一种特高速的科学仪器,比人类的脑袋要灵光无数倍,什么…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...