用 ch 单位 step-end 实现打字机效果最可靠因 width 动画无法逐字裁切且受混排、字体度量影响需 overflow: hidden、width: nch、steps(n, end) 或 step-end并同步控制光标动画。animation width 实现打字机效果为什么通常失败直接用 width 动画模拟打字几乎必然出问题文字是流式布局width 变化不会“逐字裁切”而是拉伸或压缩整个容器更关键的是中英文混排、换行、字体度量差异会让 width 值极难精确控制。这不是参数调得不够细而是思路错了。真正可靠的打字机效果必须用 ch 单位 step-end核心是让动画帧严格对齐字符数不依赖像素宽度。用 ch一个“0”的显示宽度作为 width 单位配合 steps() 时间函数才能实现“每帧只显示一个字符”的机械感。实操要点overflow: hidden 必须加在容器上否则超出部分会溢出动画的 to 值写成 width: varn/varch其中 n 是文本总字符数含空格可用 JS 动态算el.textContent.length必须用 animation-timing-function: step-end写成 steps(varn/var, end) 也行但 step-end 更简洁且兼容性更好避免用 em 或 rem它们受字体大小继承影响ch 才与当前字体实际字符宽度绑定示例 CSS立即学习“前端免费学习笔记深入”code{.typewriter { overflow: hidden; border-right: 1px solid; white-space: nowrap; animation: typing 3s steps(12, end), blink-caret .75s step-end infinite;}}keyframes typing { from { width: 0 } to { width: 12ch }}keyframes blink-caret { from, to { border-color: transparent } 50% { border-color: currentColor }}中文、Emoji 和等宽字体不是必须的但会影响 ch 精度ch 在非等宽字体下对中文和 Emoji 的宽度估算可能偏差——比如某些中文字宽度接近 2ch而 Emoji 可能撑满整行。这不是 bug是字体度量本身的限制。 Seed-Music 字节跳动推出的AI音乐生成与编辑工具