用 setinterval 实现打字机效果最直接:将文本拆为单字符,用 let 计数器逐个追加到元素 textcontent 中,完成时 clearinterval 防内存泄漏。

用 setInterval 实现基础打字机效果最直接
不需要框架或复杂库,纯 JS + HTML 就能跑起来。核心是把目标文本拆成单字符,逐个插入到 DOM 元素中,靠 setInterval 控制节奏。
常见错误是直接用 for 循环 + setTimeout 闭包,结果所有字符几乎同时出现——因为循环执行太快,所有定时器几乎在同一毫秒被注册。
实操建议:
- 用
let i = 0计数器 +setInterval每次追加一个字符,更可控 - 插入时用
textContent而非innerHTML,避免意外解析 HTML 标签 - 记得在完成时
clearInterval,否则内存泄漏(尤其页面长期不刷新时)
const el = document.getElementById('typewriter');
const text = 'Hello, world!';
let i = 0;
const timer = setInterval(() => {
if (i
<h3>想支持换行和空格?得处理 <code>\n</code> 和 <code> </code>
</h3>
<p>原始文本里的换行符 <code>\n</code> 在 HTML 中不会生效,直接插入只会显示为空格;而连续空格会被浏览器合并,看起来像只占一个空格位。</p>
<p>使用场景:写介绍文案、终端模拟、诗歌排版等需要保留格式的地方。</p>
<p>实操建议:</p>
- 把
\n替换成<br>,但注意要用innerHTML(此时需确保内容可信,否则有 XSS 风险) - 普通空格可转为
,但别全转——只对连续多个空格做处理,否则影响可读性 - 更稳妥的做法是给容器加
white-space: pre-wrapCSS,然后坚持用textContent
打字速度忽快忽慢?检查是否用了 setTimeout 递归嵌套
有人写成“打完一个字符,再 setTimeout 打下一个”,看似合理,但 JS 事件循环压力大时,嵌套层级深会导致延迟累积,越往后越慢,甚至卡顿。
性能影响明显:100 字符可能产生 100 层调用栈,Chrome DevTools 的 Performance 面板里能看到大量 setTimeout 堆积。
实操建议:
- 优先用单个
setInterval,状态存在闭包外变量里,逻辑扁平 - 如果必须用递归
setTimeout,确保每次只设下一轮,且用clearTimeout做清理(比如用户中途触发重置) - 速度单位统一用毫秒,别混用
100和0.1s这类写法,易出错
移动端光标闪烁不一致?CSS caret-color 和 animation 得配合用
很多教程只加个 ::after 动画模拟光标,但在 iOS Safari 上常失效——它不支持对伪元素做 content 动画,也不响应 visibility 切换。
兼容性影响:Android Chrome 正常,iOS 15+ 支持 caret-color,但老版本只能靠绝对定位的 <span></span> 模拟。
实操建议:
- 先试原生
caret-color: #000,再 fallback 到动画 span - 动画 span 宽度设为
2px,高度继承行高,position: absolute右对齐父容器末尾 - 别用
display: none / block控制闪烁,改用opacity: 0 / 1+animation,更流畅
真正难的是中断逻辑:用户点击暂停、文本动态更新、响应式尺寸变化时,光标位置要实时对齐——这部分没标准解法,得自己算 getBoundingClientRect。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











