首页/新闻资讯/正文详情

Vue 打字特效进阶:用 setInterval 动态变速 + CSS 闪烁光标实现多行文本模拟

发布时间:2026/9/27 12:42:18 来源:云帆数科 栏目:资讯中心
Vue 打字特效进阶:用 setInterval 动态变速 + CSS 闪烁光标实现多行文本模拟
1. 为什么原生 setInterval 打字机看起来像机器人做 Vue 项目时产品经常提一个需求首页那句 slogan 要像真人在敲键盘一个字一个字蹦出来偶尔快偶尔慢光标还要一闪一闪。很多人第一反应是写个setInterval固定 100ms 往外吐字符结果上线后被吐槽「像打印机不像人」。问题出在固定间隔上。真人打字有节奏起伏想词的时候停顿长熟悉的词连打很快标点后还会顿一下。固定setInterval(fn, 100)每个字符间隔完全一致视觉上就是机械匀速缺少「呼吸感」。另一个坑是多行文本用\n换行时如果容器没设white-space: pre-wrap换行符会被浏览器吞掉所有文字挤成一行光标也跟着乱跑。这篇就围绕 Vue 3 组件把三件事讲透用setInterval动态改变时间间隔模拟随机变速、用 CSSkeyframes做闪烁光标、用pre-wrap保住多行换行。核心检索词先摆出来Vue 打字特效、setInterval 动态变速、CSS 闪烁光标、多行文本逐字输出。适合正在做官网首页、登录页标语、AI 对话打字效果的 Vue 开发者跟着做就能跑起来。我试过把间隔写死成随机数但忘了先clearInterval结果定时器越叠越多字符成片往外冒这个坑后面排障章节会专门讲。2. 前置准备Vue 项目与 TaoToken 接入位组件本身不依赖任何第三方库Vue 3 的script setup或 Options API 都能写。如果你只是想要打字特效直接跳到第 3 节复制组件即可。但很多同学做这个特效是为了配合 AI 对话场景——打字机效果展示大模型流式返回。这时候你需要一个稳定的模型调用入口。TaoToken 提供统一的模型 API 接入官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。它的作用是让你用一套 Key 调用多家模型省去分别对接的麻烦。适合需要在前端做打字机展示、后端做流式转发的场景。接入前先去控制台创建密钥入口在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 密钥管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到 Key 后接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各语言的请求示例。想先验证模型通不通可以直接用模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 试一句。注意本篇的打字特效是纯前端渲染逻辑和模型调用是两层。模型负责产出文本打字机负责把文本「演」出来。两者解耦你换任何文本源都不影响特效。如果你打算长期做编码类 Agent 或批量生成可以了解 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 这里不展开重点还是回到组件本身。3. 可复制配置Vue 组件骨架 动态变速 闪烁光标先给完整组件再逐段拆解。新建TypewriterText.vuetemplate div classcontentBox span{{ showContent }}/span span v-ifshowBlinkCursor classblinkCursor|/span /div /template script setup import { ref, onMounted, onBeforeUnmount } from vue const props defineProps({ text: { type: String, default: }, minDelay: { type: Number, default: 60 }, maxDelay: { type: Number, default: 320 } }) const showContent ref() const showBlinkCursor ref(true) let timer null let index 0 const typeNext () { clearInterval(timer) if (index props.text.length) { const delay Math.random() * (props.maxDelay - props.minDelay) props.minDelay showContent.value props.text[index] index timer setInterval(typeNext, delay) } else { showBlinkCursor.value false } } onMounted(() { timer setInterval(typeNext, props.minDelay) }) onBeforeUnmount(() { clearInterval(timer) }) /script style scoped .contentBox { white-space: pre-wrap; font-size: 18px; line-height: 1.8; color: #333; } .blinkCursor { display: inline-block; margin-left: 2px; animation: Blink 1s ease-in 0s infinite; } keyframes Blink { 0% { opacity: 0; } 100% { opacity: 1; } } /style父组件这样用template TypewriterText :textpoem :min-delay60 :max-delay320 / /template script setup import TypewriterText from ./TypewriterText.vue const poem 多想一醒来 晨风就能抚平忧伤 多想一转身 目光就融化掉冰霜 多想一抬头 看见你微笑的脸庞 生活总该迎着光亮 再跌跌撞撞也要坚强 /script关键点逐个说。white-space: pre-wrap是保住\n换行的核心没有它多行文本会塌成一行。Math.random() * (maxDelay - minDelay) minDelay把随机间隔限制在 60 到 320ms 之间避免出现 0ms 疯狂输出或 500ms 卡顿感。每次进入typeNext先clearInterval(timer)再重建这是动态改变间隔的唯一正确姿势——setInterval一旦创建间隔就固定了想变只能清掉重来。光标用v-if控制打字结束后隐藏符合真人输入完移开光标的直觉。keyframes Blink用opacity从 0 到 1 循环ease-in让闪烁不那么生硬。4. 验证请求浏览器里确认多行、变速与光标组件挂载后打开浏览器开发者工具按下面几步验证。第一步看多行。把poem换成带\n的多行字符串刷新页面。如果所有文字挤在一行检查.contentBox的white-space是否生效Scoped 样式有没有被父级覆盖。正常效果是每行独立换行光标跟在最后一个字符后面。第二步看变速。在typeNext里临时加一行console.log(delay)观察控制台输出的间隔值是否在 60 到 320 之间跳动。你会看到数字忽大忽小对应视觉上就是打字忽快忽慢。如果所有值都一样说明Math.random()没生效检查是不是把 delay 写成了常量。第三步看光标。打字过程中光标持续闪烁最后一个字符输出后光标消失。如果光标一直不消失检查index props.text.length的判断可能是text长度算错了。如果光标不闪检查animation有没有被其他样式覆盖或者keyframes名字拼写。第四步看内存。反复切换路由挂载卸载组件在 Performance 面板看定时器有没有泄漏。onBeforeUnmount里的clearInterval就是防这个的漏了它定时器会在组件销毁后继续跑。如果你要把这个特效接到真实模型输出上可以先用模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 生成一段多行文本复制到poem里测试换行和变速。确认前端渲染没问题后再走 API 接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 把流式返回接进来。5. 本篇常见错排查定时器叠加导致字符成片冒出。最常见。原因是在setInterval回调里又调了一次setInterval却没清旧的。记住铁律每次改间隔前先clearInterval(timer)。上面组件里typeNext第一行就是它。多行文本不换行。90% 是white-space没设或设成了normal。pre-wrap保留换行和空格pre-line只保留换行不保留连续空格按需选。Scoped 样式下如果父组件有white-space: nowrap会继承下来需要显式覆盖。光标闪烁和打字不同步。光标是独立 CSS 动画和 JS 定时器本来就不同步这是正常的。如果你希望光标在打字瞬间「亮」一下可以在typeNext里给光标加个短暂的 class 切换但通常没必要独立闪烁更自然。随机间隔范围设错。如果maxDelay小于minDelayMath.random() * (max - min) min会算出负数setInterval收到负数按 0 处理字符瞬间全出。确保maxDelay minDelay。组件销毁后定时器还在跑。报错Cannot read property of null或者内存持续增长。补上onBeforeUnmount(() clearInterval(timer))。中文和英文混排时节奏怪。中文一个字一个间隔没问题英文单词逐字母打会显得碎。可以在typeNext里判断当前字符遇到空格或标点时把 delay 调大一点模拟真人停顿。6. 把特效接到真实业务里的下一步打字特效本身不复杂难的是和真实数据流配合。如果你做的是 AI 对话界面模型返回是流式的你不需要自己逐字定时直接把流式 chunk 追加到showContent即可光标逻辑照搬。这时候前端打字机退化成「渲染层」真正的节奏由模型吐字速度决定。如果你要做的是固定文案的官网动效就用本篇的setInterval动态变速方案可控性最强。想调更细腻的节奏可以把minDelay/maxDelay做成 props不同段落传不同值标题慢一点、正文快一点。需要统一模型入口时密钥在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 管理接入细节看 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。长期做编码 Agent 的话Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 可以了解下额度方案。最后留个实用技巧把typeNext里的随机逻辑抽成一个getDelay(char)函数遇到。返回更大的值遇到字母返回更小的值打出来的节奏会比纯随机更像真人。这个改动只有几行效果提升明显你可以直接在当前组件上试。

相关推荐

Kimi K3 vs GLM 5.2 深度对比:用 TaoToken 统一 Key 跑通两大开源旗舰 MoE 模型
Kimi K3 vs GLM 5.2 深度对比:用 TaoToken 统一 Key 跑通两大开源旗舰 MoE 模型

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

月之暗面被传IPO,TaoToken 统一 Key 接入 Cline 的 config.toml 配置骨架
月之暗面被传IPO,TaoToken 统一 Key 接入 Cline 的 config.toml 配置骨架

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

AI造游戏,香港中文大学团队验出真相:最强模型也只答对四成题|TaoToken 统一 Key 接入 Godot AI 编程助手实测
AI造游戏,香港中文大学团队验出真相:最强模型也只答对四成题|TaoToken 统一 Key 接入 Godot AI 编程助手实测

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

Windows 上 Claude Code 提示地区不可用?用 TaoToken 改配置文件绕过限制
Windows 上 Claude Code 提示地区不可用?用 TaoToken 改配置文件绕过限制

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

UPS双协议并行采集:一套数据同时推送HTTP与WebSocket平台
UPS双协议并行采集:一套数据同时推送HTTP与WebSocket平台

接手这个项目的时候,我刚进机房就感受到那种典型的“过渡期”压力:UPS 已经上线运行了近十年,现场同时跑着两套上位监控平台,一套是厂区老旧的集中监控系统,另一套是新部署的数字化大屏。设备本身没有变,变… · 2026/9/27 13:30:02

专门做推荐的网站怎么选?3类源码避坑指南
专门做推荐的网站怎么选?3类源码避坑指南

专门做推荐的网站怎么选?3类源码避坑指南 别再盯着那些丑得让人想关页面的模板看了。花大钱买的“高端”模板,上线后客户第一眼就皱眉,跳出率高得吓人,SEO权重更是起不来。做推荐类网站,核心不是堆砌花哨特效,而是… · 2026/9/27 13:29:50

大模型服务供应商 API 接口架构与请求格式差异化研究报告:TaoToken 统一 Key 通道下的配置骨架与验证实践
大模型服务供应商 API 接口架构与请求格式差异化研究报告:TaoToken 统一 Key 通道下的配置骨架与验证实践

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

miniQMT+AI高效协同:用Trae Skill打通策略配置与验证闭环(上)
miniQMT+AI高效协同:用Trae Skill打通策略配置与验证闭环(上)

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

wordpress$user_id保姆级建站教程:告别备案焦虑
wordpress$user_id保姆级建站教程:告别备案焦虑

wordpress$user_id保姆级建站教程:告别备案焦虑 做网站最头疼的不是写代码,而是备案流程一头雾水。很多创业者盯着后台报错发呆,以为服务器配置错了,其实卡在政策合规上。这篇保姆级建站教程,专门拆解wordpress$user_i… · 2026/9/27 13:29:13

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码