如何实现文字输入效果
我们看到有些网站的文字会有类似于输入的效果,就好像自动打字一样,虽然这个效果用的地方可能不多,但如果用的好的话可能会有奇效,比如在博客、演讲展示等方面应用。那么,怎么实现呢?
使用setTimeout实现
第一种方法是使用setTimeout进行文字控制,每一个文字都是一个span
,利用DOM操作以一定的间隔将每个文字添加到文档中,同时设置opacity:1
使其显示出来。光标闪烁的效果则利用border-left
进行animation动画展示。
HTML结构
先看代码:
1 | <div class="container"> |
解释一下,我们首先把原始文字设为display: none;
,这样不会占用文档位置,然后我们给之后添加的文字span
块指定class为word
。
CSS设置
先看代码:
1 | .container { |
我们对word
设置transition: opacity 2s step-start;
。这里之所以通过opacity
来进行transition,是因为transition不支持display
,而opacity
只需要设置0
或1
就可以使元素进行显示而不需要重排。
这里transition-timing-function
使用step-start
,使其有跳跃的效果,step-start
相当于steps(1, jump-start)
,steps(n, <jumpterm>)
代表transition会停顿n次,每一次的效果为<jumpterm>
,jump-start
代表第一个跳跃发生在transition
刚开始的时候,更多效果见文档。
为什么要使用:after
呢?因为我是逐步向typewriter-output
添加span
块,所以一开始宽度是不确定的,而且光标高度也不好设置,所以我想了个笨方法,使用after
伪元素生成一个光标,并用animation
控制其border-left
的显示。但这里有个bug就是文字显示的间隔不能超过300ms,所以说这样处理还是有些问题,以后可能会有更好的方法。
JS部分
其实就是利用setTimout
设置时间间隔,通过DOM操作进行添加文字,先看代码:
1 | var words = document.querySelector('.originWords').innerText; |
代码部分很简单,就是先获取需要展示的文字内容,然后每个字都通过dom操作塞进去,设置opacity:1
,再进行一下边界判断,就实现了文字的展示。
纯animation实现
这次我们不用setTimeout
,所有展示的动画全部用animation
来实现。废话不多说,我们来看一下。
HTML结构
1 | <h1 id="typewriter">Hello, My friend.</h1> |
这种方法的好处就是不用有一个隐藏的原始文字段落,直接显示想显示的内容。
CSS设置
接下来我们设置CSS:
1 | body { |
看起来很简单对不对?挨?说好的动画呢?别急,我们通过JS来设置animation
。
JS部分
先看代码:
1 | var typewriter = document.getElementById('typewriter'); |
这里我们所做的事就是获取文字段落字符串的长度,然后设置其宽度和动画效果。非常简单!
那么,为什么这样做可以呢?别急,我们来分析分析。
首先,在获取了文字字符串长度后,我们设置段落的宽度为width: Xch;
,这里X代表字符串长度,ch
是长度单位,代表数字“0”的宽度,通常也就是一个字符的宽度。
然后,我们直接设置动画:animation: typing 3s steps(X, end), cursor-blink 0.5s step-end infinite alternate;
一切就搞定了!为啥?通过CSS我们设置了@keyframe
typing,表示宽度从0开始,一直到设置的Xch
,持续3s,用steps
动画函数,分为X步,也就是有多少个字符,就停顿多少下,达到输入的效果。至于光标的效果,我们直接通过动画设定50%
的时候border-color
为transparent
,则每一秒闪烁一次,因为只有border-right
设置了宽度,所以完美达到光标的效果。
总结
两种方法比较起来,第二种方法更加实用简便,推荐大家使用。这只是简单的CSS3 animation动画应用,今后还可以开动脑筋,实现更多炫酷有趣的效果。
本文标题:如何实现文字输入效果
文章作者:flyrk
发布时间:2019-01-23
最后更新:2022-02-25
原始链接:https://flyrk.github.io/2019/01/23/how-to-achieve-typewriter-effect/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!
分享