Если вы управляете анимацией с тем же JavaScript l oop, что и сценарий пишущей машинки, она не потеряет syn c. Я переписал скрипт пишущей машинки, чтобы сделать это в приведенном ниже фрагменте кода.
startTypewriter()
Объяснение
Сначала все собранные сообщения преобразуются в массив.
typewriter.getAttribute('data-typewriter').split(',');
Затем запускается анимация значка CSS. Поскольку JavaScript интервалы ждут своей продолжительности, прежде чем выполнить свой код, поэтому первое сообщение набирается путем вызова type()
до создания интервала.
icon.classList.add('icon-animation');
type(typewriter, messages[0].trim(), animationDuration - pauseDuration);
Теперь интервал запускается, выполняется каждые 3 секунды по умолчанию. Первое, что происходит, это то, что анимация сбрасывается, если она как-то вышла из строя c.
icon.classList.remove('icon-animation');
window.setTimeout(function() {
icon.classList.add('icon-animation');
}, 25);
Далее, сообщение набирается с помощью вызова type()
. Прежде чем он заканчивается, выполняется проверка, чтобы увидеть, находится ли он в последнем элементе массива. Если это так, он начнется заново.
if (i == messages.length) i = 0;
type()
Объяснение
В начале вычисляется значение timePerCharacter
. Сообщение разбивается на массив, и вывод на пишущей машинке очищается
var timePerCharacter = duration / message.length;
var message = message.split('');
typewriter.innerHTML = '';
. Создается l oop, который запускается каждые timePerCharacter
. Символ выводится на вывод пишущей машинки.
typewriter.innerHTML += message[i];
После того, как все символы выведены, l oop очищается
if (i == message.length) clearInterval(typeLoop);
Сниппент
var animationDuration = 3000;
var pauseDuration = 2000;
startTypewriter();
function startTypewriter() {
var typewriter = document.getElementById('typewriter');
var icon = document.getElementById('icon');
var messages = typewriter.getAttribute('data-typewriter').split(',');
icon.classList.add('icon-animation');
type(typewriter, messages[0].trim(), animationDuration - pauseDuration);
var i = 1;
window.setInterval(function() {
icon.classList.remove('icon-animation');
window.setTimeout(function() {
icon.classList.add('icon-animation');
}, 25);
type(typewriter, messages[i].trim(), animationDuration - pauseDuration);
i++;
if (i == messages.length) i = 0;
}, animationDuration);
}
function type(typewriter, message, duration) {
var timePerCharacter = duration / message.length;
var message = message.split('');
typewriter.innerHTML = '';
var i = 0;
var typeLoop = window.setInterval(function() {
typewriter.innerHTML += message[i];
i++;
if (i == message.length) clearInterval(typeLoop);
}, timePerCharacter);
}
@keyframes icon {
20% {
transform: scale(0.9);
}
40% {
transform: scale(1);
}
60% {
transform: scale(0.9);
}
80% {
transform: scale(1);
}
100% {
transform: translateY(-200%);
}
}
.icon {
border-radius: 100%;
}
.icon-animation {
animation: icon 3s;
}
@keyframes cursor {
50% {
color: transparent;
}
}
.blinking-cursor {
animation: cursor 1s steps(1) infinite;
}
<img id="icon" src="https://de7yjjf51n4cm.cloudfront.net/banners/amazonprime_newicon.jpg" class="icon">
<span id="typewriter" data-typewriter="
Web Strategy,
UX Testing,
Content Management System,
Web Design,
Research and Analytics,
Information Architecture,
Strategic Consulting,
Maintenance and Support
">
</span>
<span class="blinking-cursor">|</span>