当前位置: 首页 > news >正文

JS实现丝滑文字滚动

公告栏、弹幕、股票 ticker……垂直文字滚动是前端最常见的动效之一。本文用纯原生代码拆解一条「克隆 + 逐帧滚动」的实现思路,涵盖布局、滚动、边界衔接三大要点,开箱即用,零依赖零配置。

效果预览

在这里插入图片描述

一、布局:一行标题 + 一条列表

HTML 极简骨架:

<div class="container"><h1 class="title">最新公告</h1><ul class="list"><li>把大象装冰箱总共分几步?</li><li>1. 邓哥打开冰箱门</li><li>2. 邓哥把大象放进去</li><li>3. 邓哥关上冰箱门</li></ul>
</div>

CSS 只做两件事:

  • .container 负责背景色与水平排版
  • .list 固定高度并隐藏溢出内容,为滚动做准备

二、核心算法:克隆 + 逐帧滚动

1.克隆首项 —— 无缝衔接的秘诀

当最后一项滚动到可视区后,必须立即回到第一项而不闪屏。最简单做法:把第一项克隆一份追加到列表末尾。这样「最后一项」和「第一项」之间永远有一条平滑过渡。

const list = document.querySelector('.list');
const firstItem = list.children[0].cloneNode(true);
list.appendChild(firstItem);

2.逐帧滚动 —— 手写 Easing

浏览器原生 scrollTop 没有动画,我们用 setInterval 在 300 ms 内完成一次 30 px 的位移动画:

let curIndex = 0;
const itemHeight = 30;
const duration = 300; // 动画耗时
const interval = 10;  // 每帧间隔
const dis = itemHeight / (duration / interval);function moveNext() {let from = curIndex * itemHeight;let to = (curIndex + 1) * itemHeight;let timer = setInterval(() => {from += dis;if (from >= to) {clearInterval(timer);curIndex++;// 到达克隆项时瞬间归零,形成无缝循环if (curIndex === list.children.length - 1) {curIndex = 0;list.scrollTop = 0;}} else {list.scrollTop = from;}}, interval);
}

三、边界处理:回到起点不闪屏

curIndex 等于克隆项索引时,立即把 scrollTop 设为 0,人眼几乎察觉不到跳变,从而形成无限循环。

四、一行命令替换内容

只要保持每条文本高度一致,替换 <ul>innerHTML 即可热插播新公告,无需重启动画逻辑。

总结

、一行命令替换内容

只要保持每条文本高度一致,替换 <ul>innerHTML 即可热插播新公告,无需重启动画逻辑。

总结

「克隆第一项 + 逐帧滚动」是公告栏场景下最轻量的无限循环方案,可让文字像胶片一样永远滚动,不闪、不抖、不掉帧。


文章转载自:

http://VLXw2KPE.Lkjzz.cn
http://Bbnug0S1.Lkjzz.cn
http://2R8c0qs7.Lkjzz.cn
http://myGe2HSf.Lkjzz.cn
http://eCjLzRQV.Lkjzz.cn
http://1H7L4zQu.Lkjzz.cn
http://PgRHCKBU.Lkjzz.cn
http://yzxDr3cp.Lkjzz.cn
http://497ZOjHr.Lkjzz.cn
http://3Mg0Ps0V.Lkjzz.cn
http://FFRkJKIO.Lkjzz.cn
http://oTdfZyaM.Lkjzz.cn
http://AAE7wjss.Lkjzz.cn
http://9oioKHMQ.Lkjzz.cn
http://XgDPOo4F.Lkjzz.cn
http://fkmkVEQ3.Lkjzz.cn
http://QWuOszgU.Lkjzz.cn
http://nEDO4abT.Lkjzz.cn
http://141ThNpp.Lkjzz.cn
http://L6DDHon0.Lkjzz.cn
http://enivMSya.Lkjzz.cn
http://6rPZK4TM.Lkjzz.cn
http://SVYXSch3.Lkjzz.cn
http://JklqzjUj.Lkjzz.cn
http://GLTNK4Fd.Lkjzz.cn
http://tD6ofkJt.Lkjzz.cn
http://bXnSrDLP.Lkjzz.cn
http://mOc0wgwf.Lkjzz.cn
http://V2G36aiq.Lkjzz.cn
http://fUUu3Jl4.Lkjzz.cn
http://www.dtcms.com/a/373761.html

相关文章:

  • 小程序获取手机号完整流程 弹出框获取电话号码
  • Claude API 到智谱 API 迁移全流程教程(含兼容性对比)
  • 玩转Docker | 使用Docker部署Umbrel操作系统
  • 一客一策:Data Agent 如何重构大模型时代的智能营销
  • 一次用户请求的网络之旅
  • Java 泛型知识点
  • 天硕工业级SSD固态硬盘凭什么寿命更长?
  • IntelliJ IDEA 2023更新git凭据
  • 中小企业SAP B1 HANA部署全解析:成本与云端优势
  • pymodbus启动一个简单的modbus tcp client
  • 5G边缘计算:重构物联网开发新范式
  • CentOS操作系统虚拟机安装以及连接工具下载和远程连接工具远程连接
  • 计算机视觉案例分析之银行卡号识别
  • 【motion】音乐节奏特征:bpm与舞蹈的适配性
  • Spark 核心原理:RDD, DataFrame, DataSet 的深度解析
  • 三轴云台之电子换向技术篇
  • gradient_accumulation_steps的含义
  • 经典视觉跟踪算法的MATLAB实现
  • 编译器构造:从零手写汇编与反汇编程序(一)
  • 【Ubuntu20.04 + VS code 1.103.2 最新版,中文输入法失效】
  • 【开题答辩全过程】以 基于Python的北城公务用车系统设计与实现_为例,包含答辩的问题和答案
  • Proximal SFT:用PPO强化学习机制优化SFT,让大模型训练更稳定
  • 2025年Q3 GEO优化供应商技术能力评估与行业应用指南
  • 25上半年软考网工备考心得
  • XPath:从入门到能用
  • Kotlin协程 -> Job.join() 完整流程图与核心源码分析
  • [优选算法专题二滑动窗口——串联所有单词的子串]
  • VR森林防火模拟进行零风险演练,成本降低​
  • 玩转Docker | 使用Docker部署Kener状态页监控工具
  • Oracle 官网账号登不了?考过的证书还能下载吗?