用 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世纪,计算机已经发展到各行各业,各个地区,它的载体媒介-计算机,大众称之为的电脑,是一种特高速的科学仪器,比人类的脑袋要灵光无数倍,什么…...
LiTmall:如何用Spring Boot + Vue + 微信小程序构建高效开源电商系统?
LiTmall:如何用Spring Boot Vue 微信小程序构建高效开源电商系统? 【免费下载链接】litemall linlinjava/litemall: LiTmall 是一个基于Spring Boot MyBatis的轻量级Java商城系统,适合中小型电商项目作为基础框架,便于快速搭建…...
智能风扇管家:FanControl如何让你的电脑安静又高效
智能风扇管家:FanControl如何让你的电脑安静又高效 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fa…...
SurfaceView视觉优化实战:圆角与渐变蒙层的完美结合
1. SurfaceView视觉优化的核心价值 在Android开发中,SurfaceView因其独特的双缓冲机制和独立的绘图线程,成为视频播放、游戏渲染等高性能场景的首选组件。但原生SurfaceView的直角边框和单调的呈现方式,常常与现代化UI设计语言格格不入。我在…...
Hive【从SQL到MapReduce:核心架构与执行引擎深度解析】
1. Hive的核心角色:SQL到分布式计算的翻译官 第一次接触Hive时,很多人会疑惑:为什么要在Hadoop生态中引入这样一个"类SQL"工具?这要从大数据处理的痛点说起。想象你面前有一本百万页的百科全书,现在需要统计…...
从文档智能处理到自动化工作流:现代开发技能的全栈实践
从文档智能处理到自动化工作流:现代开发技能的全栈实践 【免费下载链接】skills 本仓库包含的技能展示了Claude技能系统的潜力。这些技能涵盖从创意应用到技术任务、再到企业工作流。 项目地址: https://gitcode.com/GitHub_Trending/skills3/skills 在日常开…...
caj2pdf使用技巧:10个高效转换CAJ文件的实用方法
caj2pdf使用技巧:10个高效转换CAJ文件的实用方法 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换,成功与否,皆是玄学。 项目地址: https://gitcode.com/gh_mirr…...
从RGB-D到3D语义分割:用Scannet v2的25k帧子集快速上手你的第一个模型
从RGB-D到3D语义分割:Scannet v2实战指南 在计算机视觉领域,3D场景理解正成为研究热点。Scannet v2作为包含丰富标注的RGB-D数据集,为初学者和专业开发者提供了理想的实验平台。本文将带您快速上手这个强大的工具集,从数据获取到模…...
如何快速掌握Sionna:下一代物理层研究开源库的5个实用技巧
如何快速掌握Sionna:下一代物理层研究开源库的5个实用技巧 【免费下载链接】sionna Sionna: An Open-Source Library for Next-Generation Physical Layer Research 项目地址: https://gitcode.com/gh_mirrors/si/sionna Sionna是一个基于TensorFlow的开源Py…...
2025版等离子体期刊分区解析:从PRL到PPAP的投稿指南
1. 2025版等离子体期刊分区概览 对于从事等离子体研究的科研人员来说,选择合适的期刊投稿是研究成果传播的关键一步。2025版中科院期刊分区将等离子体相关期刊划分为三个主要层级,每个层级都有其独特的定位和特点。 先说说最顶级的中科院一区期刊。这个层…...
Z-Image-GGUF小程序开发:微信小程序前端调用云端AI绘画API
Z-Image-GGUF小程序开发:微信小程序前端调用云端AI绘画API 最近在折腾AI绘画,发现一个挺有意思的事儿:很多厉害的模型都部署在云端服务器上,但咱们平时用手机的时间可比用电脑多多了。要是能在微信里随手打开一个小程序ÿ…...
