用css动画+js控制可实现文字垂直无缝滚动:外层固定高度隐藏溢出,内层用flex垂直堆叠,@keyframes通过translatey循环位移,js动态重置动画防错位;推荐双容器或首尾复制法保障无缝,兼顾硬件加速与移动端兼容性。

用 CSS 动画 + JavaScript 控制滚动容器高度和动画时长,配合 transform: translateY() 和关键帧循环,就能实现文字上下垂直滚动的无缝过渡效果。核心在于让下一条公告“刚好接上”上一条的末尾位置,避免跳变或停顿。
用 CSS @keyframes 实现平滑位移
不依赖 JavaScript 动画,纯 CSS 更轻量、更流畅。关键是把滚动看作“位移队列”,每条公告高度固定(比如 40px),动画总时长按条数 × 单条停留时间 + 切换时间来设定:
- 给外层容器设
overflow: hidden,高度固定为单条内容高度(如height: 40px) - 内层滚动区包含所有公告项,用
display: flex; flex-direction: column;垂直堆叠 - 定义
@keyframes scrollUp:从transform: translateY(0)到translateY(-总高度),再回到translateY(0)形成循环 - 动画时长 = 单条显示时间 × 条数 + 切换缓冲时间(例如每条 3s,共 5 条,加 0.5s 缓动 → 总时长 15.5s)
用 JS 动态计算并重置动画,避免累积误差
CSS 动画循环久了可能因渲染精度或重排导致错位。可在每次动画结束时用 JS 重置位移,并微调起始状态:
- 监听
animationiteration事件(注意兼容性,也可用animationend+ 重播逻辑) - 动画结束瞬间,将内层元素
transform强制设为translateY(0),再立即触发新动画 - 若公告动态增删,重新计算总高度和动画时长,用
el.style.animationDuration = 'xxs'实时更新
无缝切换的关键:预留“重复头尾”或使用双容器轮播
最稳妥的无缝方案不是靠单次长动画,而是模拟轮播逻辑:
- 双容器法:两个相同结构的滚动区(A 和 B),A 向上滚动到底时,B 立即从顶部开始滚动;A 完全移出视口后,将其重置到 B 下方继续循环
- 首尾复制法:在公告列表开头插入最后一项的副本,结尾插入第一项的副本,动画位移范围覆盖“完整列表 + 一条缓冲”,视觉上始终有内容衔接
- 两种方式都需 JS 控制容器 visibility 或 transform 的切换时机,推荐用
opacity: 0+visibility: hidden配合 transition 微调
适配移动端与性能优化建议
滚动通知常用于 H5 页面,需兼顾低端安卓机和微信内置浏览器:
- 优先用
transform和opacity触发硬件加速,避免直接改top或margin - 禁用
pointer-events防止滚动中误触,必要时加touch-action: none - 公告文字用
font-smoothing: antialiased提升清晰度,行高设为 1.2~1.4 避免截断 - 超过 10 条公告时,建议 JS 分批渲染,或用 IntersectionObserver 懒加载后续内容











