究竟是什么效果呢?


显而易见,这个效果就是在光标前面依次插入字母,每个字母的颜色随机。我们先提前写好一些颜色的样式,color0….16,然后使用随机数使用就可以了。
可以在 CodeOpen 上直接查看

DOM 结构

1
2
3
<div class="content">
<span id="jsblink" class="blink">|</span>
</div>

很简单的一个 dom 结构,id 为 jsblink 的 span 标签是一个闪动的光标
使用 css3 动画实现,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.blink {
animation: blink 1s infinite steps(1, start);
font-size: 30px;
}

@keyframes blink {
0%,
100% {
color: #fff;
}
50% {
color: #000;
}
}

实现逻辑

我们需要实现一个 output 函数,它接受一个 string 参数,首先我们先讲参数按每个字符分解成一个数组,然后将数组的每一个元素作为一个 span 标签的内容(如果是/n 那么就是 br 标签),将这个标签插入到 jsblink 这个 span 标签的前面。
那么如何将一个 dom 元素插入到另一个 dom 元素的前面呢?
这里我们用到 html5 的一个 API——insertBefore,它的使用方法如下

好了下面贴代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function output(str) {
var arr = str.split('')
var parent = document.getElementsByClassName('content')[0]
setInterval(() => {
if (arr.length != 0) {
var blink = document.getElementById('jsblink')
if (arr[0] == '/n') {
var newEl = document.createElement('br')
parent.insertBefore(newEl, blink)
} else {
var newEl = document.createElement('span')
var num = Math.floor(Math.random() * 16)
var color = 'color' + num
newEl.classList.add('word')
newEl.classList.add(color)
newEl.innerText = arr[0]
parent.insertBefore(newEl, blink)
}
arr.shift()
}
}, 500)
}

output('Hello World!')