新闻详情

新闻详情

首页 / 资讯中心 / 详情

原生 JS 实现垂直无缝滚动跑马灯

发布时间:2026/9/29 10:24:55来源:尧图网络
原生 JS 实现垂直无缝滚动跑马灯
前言在后台管理系统、H5 活动页面、网站首页经常会看到垂直公告跑马灯多条消息自动向上滚动实现公告、中奖名单、消息通知轮播。网上很多简易跑马灯重置的时候会闪烁本文采用transform transition实现平滑动画利用双层 setTimeout 解决无缝循环闪烁问题同时增加暂停标记可扩展鼠标移入暂停、移出继续播放纯原生 JS不依赖 jQuery。实现特点垂直向上滚动、动画平滑、无缝循环不闪烁、支持暂停控制单条高度可配置。完整源码!DOCTYPE html html langzh-CN head meta charsetUTF-8 title原生JS垂直无缝跑马灯/title style .marquee_box { width: 320px; height: 38px; /* 可视区域高度 单条高度只展示一条 */ overflow: hidden; border: 1px solid #eee; border-radius: 4px; } .marquee_wrap { transition: transform 0.5s ease; } .marquee_item { height: 38px; line-height: 38px; font-size: 14px; padding: 0 10px; white-space: nowrap; } /style /head body !-- 跑马灯DOM结构外层可视盒子内层滚动容器 -- div idmarquee_box classmarquee_box div idmarquee_wrap classmarquee_wrap div classmarquee_item恭喜用户001获得一等奖/div div classmarquee_item恭喜用户002获得二等奖/div div classmarquee_item恭喜用户003获得参与奖/div div classmarquee_item恭喜用户004获得优惠券/div /div /div script // 跑马灯相关js const marquee_box document.getElementById(marquee_box); // 可视盒子 const marquee_wrap document.getElementById(marquee_wrap); // 滚动容器 const marquee_itemHeight 38; // 单条高度 let marquee_index 0; // 当前滚动到第几条偏移量倍数 let marquee_timer null; // 定时器id let marquee_isPause false; // 是否暂停标记 // 切换函数 function changeNotice() { if (marquee_isPause) { return; } marquee_index; marquee_wrap.style.transform translateY(-${marquee_index * marquee_itemHeight}px); // 当滚动完所有条目重置索引无缝循环 if (marquee_index marquee_wrap.children.length) { // 等过渡动画结束后重置位置不产生闪烁 setTimeout(() { marquee_index 0; marquee_wrap.style.transition none; marquee_wrap.style.transform translateY(0); // 恢复过渡动画 setTimeout(() { marquee_wrap.style.transition transform 0.5s ease; }, 20) }, 400) } } // 5秒切换跑马灯 function startMarquee() { marquee_timer setInterval(changeNotice, 5000); } // 启动跑马灯 startMarquee(); // 【可选扩展】鼠标移入暂停鼠标移出继续 marquee_box.addEventListener(mouseenter, function () { marquee_isPause true; }) marquee_box.addEventListener(mouseleave, function () { marquee_isPause false; }) // 页面销毁清除定时器防止内存泄漏 window.addEventListener(beforeunload, () { clearInterval(marquee_timer); }) /script /body /htmlDOM 与 CSS 说明div idmarquee_box !-- 可视容器overflow:hidden 裁切超出内容 -- div idmarquee_wrap !-- 滚动容器通过transform做位移 -- div classmarquee_item条目1/div div classmarquee_item条目2/div /div /divmarquee_box可视盒子固定高度overflow:hidden只显示一条公告marquee_wrap滚动容器使用transform: translateY()垂直位移配合transition实现平滑滚动动画marquee_item单条公告高度固定代码中marquee_itemHeight要和 css 高度保持一致核心代码逐行解析变量说明表格变量作用marquee_box外层可视盒子marquee_wrap滚动内容容器marquee_itemHeight单条条目高度位移计算基准marquee_index当前滚动索引记录当前是第几条marquee_timer定时器 ID用于清除轮播marquee_isPause暂停标记控制是否继续滚动changeNotice () 滚动核心函数function changeNotice() { // 如果标记为暂停直接return不执行滚动 if (marquee_isPause) { return; } marquee_index; // 向上偏移索引 * 单条高度 marquee_wrap.style.transform translateY(-${marquee_index * marquee_itemHeight}px); // 判断滚动到最后一条了准备重置 if (marquee_index marquee_wrap.children.length) { setTimeout(() { marquee_index 0; marquee_wrap.style.transition none; // 关闭动画瞬间归位不会出现反向回退动画 marquee_wrap.style.transform translateY(0); setTimeout(() { marquee_wrap.style.transition transform 0.5s ease; // 重新开启动画 }, 20) }, 400) // 400ms 和动画时长保持一致等滚动动画完全结束再重置 } }重点解决闪烁原理 当滚动到最后一条先等待动画播放完毕再关闭 transition瞬间把容器位置归位到 0 短暂延迟后再重新开启 transition下一次滚动继续有动画。 如果不关闭 transition 直接归位会看到内容回弹向下滚动出现明显闪烁。startMarquee () 启动轮播function startMarquee() { marquee_timer setInterval(changeNotice, 5000); }每隔 5s 执行一次滚动函数可自行修改时间比如 3000 代表 3 秒切换。扩展鼠标悬停暂停marquee_box.addEventListener(mouseenter, function () { marquee_isPause true; }) marquee_box.addEventListener(mouseleave, function () { marquee_isPause false; })鼠标移入公告区域暂停滚动鼠标离开继续后台系统公告常用交互。其他拓展方向横向跑马灯把translateY改成translateX高度改为宽度。增加上下手动点击翻页按钮。文字超出单行省略css 增加text-overflow:ellipsis。多条同时展示修改 marquee_box 可视高度为 N*marquee_itemHeight。知识点总结transform位移相比 top/left开启 GPU 加速性能更好动画流畅transition控制过渡动画重置位置时临时关闭动画解决无缝轮播闪烁setInterval做定时轮播使用标记变量控制暂停不销毁定时器适合频繁 hover 暂停场景定时器用完要清除防止内存泄漏固定高度垂直跑马灯单条高度 JS 和 CSS 必须统一
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【ARM 裸机开发 (IMX6ULL-mini)】SPI 协议与ADXL345 三轴加速度传感器 2026/9/29 11:22:52

【ARM 裸机开发 (IMX6ULL-mini)】SPI 协议与ADXL345 三轴加速度传感器

文章目录前言一、SPI基础概念二、SPI的时序三、IMX6ULL上的SPI3.1 概念及原理框图3.2 相关寄存器RXDATATXDATACONREGCONFIGREGSTATREG四、ADXL345加速度传感器五、SPI初始化六、SPI读写函数七、ADXL345与IMX6ULL通信八、UART、I2C与SPI对比前言 在【ARM 裸机开发 (IMX6ULL-min…

阅读更多 →
Commitizen交互式提交流程:告别混乱Git提交信息,让代码历史清晰可溯 2026/9/29 11:22:31

Commitizen交互式提交流程:告别混乱Git提交信息,让代码历史清晰可溯

见过太多这样的场景:代码写得漂漂亮亮,到了git commit这一步,随手甩一句fix bug或update就交差了。等三个月后真要回查某次改动,git log里全是fix xxx、update、temp这种信息,想定位一个具体功能变更,简直像…

阅读更多 →
Windows包管理器winget实战:安装、配置与进阶玩法 2026/9/29 11:22:25

Windows包管理器winget实战:安装、配置与进阶玩法

1. 开篇:为什么Windows用户都需要winget如果你还在用浏览器搜索软件官网、下载安装包、一路点击“下一步”的安装向导,那你真的该认识一下winget了。winget是Windows官方的包管理器,全称Windows Package Manager,简单理解就是Wind…

阅读更多 →
N.E.K.O.角色定制实战:从角色卡编辑到Live2D换装,打造独一无二的AI伴侣 2026/9/29 11:22:18

N.E.K.O.角色定制实战:从角色卡编辑到Live2D换装,打造独一无二的AI伴侣

N.E.K.O.角色定制实战:从角色卡编辑到Live2D换装,打造独一无二的AI伴侣 【免费下载链接】N.E.K.O A catgirl who lives with you in real time — reaching out first, sharing your media, and actually getting things done, powered by an embodied e…

阅读更多 →
从JDK到Maven:环境变量配置与镜像仓库避坑指南 2026/9/29 11:22:18

从JDK到Maven:环境变量配置与镜像仓库避坑指南

上周新同事入职,领了台新电脑,第一天就卡在装环境上。按网上一堆教程装完JDK,java -version能出结果,可一敲mvn -version就报"不是内部或外部命令"。这种问题我见得太多了,十有八九是环境变量PATH里少配了Ma…

阅读更多 →
SpringBoot健康饮食管理系统:数据库表结构设计与营养计算落地 2026/9/29 11:22:11

SpringBoot健康饮食管理系统:数据库表结构设计与营养计算落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉