打字机效果的核心原理是利用CSS的steps()函数实现文字逐字离散显示。通过width或clip-path配合steps(n,end)动画,结合overflow:hidden和等宽字体(或ch单位),控制文字一格一格出现,::after仅用于独立闪烁光标,不参与打字逻辑。

打字机效果的核心原理是什么
打字机效果本质是让文字逐字“出现”,不是平滑过渡,而是离散的、一格一格的显示。CSS 中唯一能实现这种“帧停顿”行为的动画 timing-function 就是 steps() —— 它把整个动画过程切成固定份数,每份停留,不插值。
::after 通常用来生成伪元素内容,但打字机效果里它常被误用为“遮罩”或“光标”,真正控制文字逐字显示的,得靠父元素的 width 或 clip-path 配合 steps() 动画。直接对 ::after 的 content 做动画是无效的(CSS 不允许动画 content 属性)。
常见错误现象:
- 写了
animation: typing 3s steps(10, end);,但文字全量一闪而现 —— 没配overflow: hidden或没限制容器宽度 - 用
::after拼接字符串(如content: "H" / "He" / "Hel"...;)试图模拟打字 —— 这在 CSS 里根本不可行,content不支持属性动画 - 用了
steps(10, start)却发现开头就漏掉第一个字 ——start表示第一帧立即跳到第 1 步,跳过了初始状态
用 width + steps() 实现可靠打字动画
这是最兼容、最可控的方式:把文字放在一个固定宽高的容器内,设 overflow: hidden,再用 width 从 0 动画到完整宽度,配合 steps(n, end) 切分成 n 步。
关键点:
-
n必须等于文字字符数(中文、英文、空格都算 1),否则会出现“卡顿”或“多显/少显” - 必须用
monospace字体(如font-family: monospace),否则等宽计算会失准;或者改用ch单位(1ch ≈ 当前字体下 “0” 的宽度) - 动画时长建议 ≥
0.05s × n,太快人眼跟不上,太慢显得拖沓 - 不要用
%或em做width动画终点 —— 响应式下会错乱,推荐用ch或 JS 注入精确像素值
.typewriter {
font-family: monospace;
overflow: hidden;
border-right: 1px solid #000;
white-space: nowrap;
animation: typing 3s steps(12, end), blink-caret 0.75s step-end infinite;
}
@keyframes typing {
from { width: 0 }
to { width: 12ch } /* 假设文字共 12 个字符 */
}
@keyframes blink-caret {
from, to { border-color: transparent }
50% { border-color: #000 }
}
为什么非要用 ::after 做光标
::after 在这里只承担“竖线光标”角色,和打字逻辑完全解耦。它不需要参与字符计数或宽度计算,只需独立闪烁。
注意细节:
- 光标动画必须用
step-end(不是steps()),否则会出现淡入淡出或粘连感 - 别给
::after设content: "|"再动画 —— 竖线容易和字体 baseline 对不齐;更稳的方式是用border-right或box-shadow - 如果父元素用了
display: inline,::after的定位会飘,建议父元素设display: inline-block或flex
响应式与中英文混排的坑怎么绕
ch 单位在等宽字体下可靠,但中文字体(如 Microsoft YaHei)通常不是等宽,12 个汉字 ≠ 12ch。这时候硬写 12ch 会导致动画提前结束或溢出。
可行方案:
- 强制用等宽中文字体,如
"Fira Code", "Sarasa Gothic SC", monospace(需确保用户环境有) - 用 JS 预读文本长度,动态写
style.width(例如el.style.width = text.length + 'ch') - 放弃
width,改用clip-path: inset(0 100% 0 0)动画右偏移 —— 兼容性稍差(IE 不支持),但不受字体影响
真实项目里,clip-path 方案越来越常用,尤其当文案长度不确定、又要求高保真时。不过要注意 Safari 旧版本对 inset() 动画的支持不稳定,上线前得实测。
打字机效果看着简单,真正要横跨中英文、适配各种字体、不闪跳不卡顿,steps() 的步数、单位选择、光标同步这三处最容易悄悄出错。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











