在一些技术网站中,经常会看到这样一种展示效果:逐个显示一段文本中的字符,模拟出一种打字的效果。通过这种方式可以显著地提升网页设计感。 在大部分应用中,都是通过使用
在一些技术网站中,经常会看到这样一种展示效果:逐个显示一段文本中的字符,模拟出一种打字的效果。通过这种方式可以显著地提升网页设计感。
在大部分应用中,都是通过使用 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打字动画内容请搜索自由互联以前的文章或继续浏览下面的相关文章,希望大家以后多多支持自由互联!