在一些技术网站中,经常会看到这样一种展示效果:逐个显示一段文本中的字符,模拟出一种打字的效果。通过这种方式可以显著地提升网页设计感。
在大部分应用中,都是通过使用 JS 脚本实现该方案,虽然效果很好,但是对于使用 JS 来操作出表现层的展示,总感觉有点奇怪,所以尝试下只使用 CSS 来实现我们的打字动画~
通过CSS,无法实现像 JS 那样一个字一个字的绘制在页面上,那不如就换一个思路,让容器宽度成为动画的主体,让文字逐渐显示出来。具体来说,最开始容器的宽度是0,随着动画的推进,一个字一个字的扩张到它应用的宽度。(需要注意,该方案仅适用于单行文本)
按照我们预想的思路,很容易完成下述代码。
@keyframes typing { from { width: 0; } } h1 { width: 188px; animation: typing 8s; white-space: nowrap; overflow: hidden; }
但是从实现效果上看,并不是那么理想,我们需要的动画效果是逐字呈现而不是这样的平滑显示。
对于这个问题,很显然,我们会想到使用 steps()
来修复,但是具体需要分多少步又是摆在我们面前的另一个难题。
要解决这个问题,就需要说到 ch
这个 CSS 中基本用不到的长度单位,它代表元素所用字体中“0”这一字形的宽度,如果使用的是等宽字体的话,那么“0”字形的宽度和其他所有字形的宽度是一样的,所以很容易想到要解决上述问题,其实只要:
width
设置为该元素中文字的个数animation
的 steps()
也设置为元素的个数@keyframes typing { from { width: 0; } } h1 { font-family: "Cascadia Code", Menlo, Monaco, "Courier New", monospace; width: 12ch; animation: typing 8s steps(12); white-space: nowrap; overflow: hidden; }
已经基本实现我们想要的效果了,最后只要加上一个闪烁的光标即可。可以通过使用伪元素生成光标,并通过 opacity 属性来实现闪烁效果:
@keyframes caret { 50% { opacity: 0; } } h1::after { content: ""; position: absolute; right: 0; width: 2px; top: 6px; bottom: 6px; background: #000; animation: caret 1s steps(1) infinite; }
如果知识库:纯CSS打字动画的实现示例没有解决您的问题,您还可以在CSS栏目中查看更多相关内容。