Будем вставлять вместо текста элементы, каждый из которых содержит по одной букве.
Куда:
<div id="container"></div>
.
Как анимировать появление элементов:
#container span {
display: inline-block;
white-space: pre;
font-size: 40px;
animation: span .2s ease-out;
}
@keyframes span {
from {
transform: translateX(500px);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
Как перебирать с задержкой массивоподобный объект:
const forEachWithDelay = (arr, delay, callback) =>
(function next(i) {
if (i < arr.length) {
setTimeout(() => (callback(arr[i]), next(-~i)), delay);
}
})(0);
// или
async function forEachWithDelay(arr, delay, callback) {
for (let i = 0; i < arr.length; i++) {
await new Promise(r => setTimeout(r, delay));
callback(arr[i]);
}
}
Вот так всё просто получается:
forEachWithDelay(
'hello, world!!',
100,
n => document
.querySelector('#container')
.insertAdjacentHTML('beforeend', `<span>${n}</span>`)
);