Удалить добавленные .move-increment
и добавить снова удаленные hidden
классы с небольшой задержкой, это повторно применит ваши transition: margin-top
(читайте в предоставленных ссылках, почему задержка):
setTimeout(function() {increment.classList.add('hidden');
increment.classList.remove('move-increment');}, 600);
Решение (изменено клавиша-код для стрелки вверх: ↑):
let counter = 0;
document.addEventListener('keydown', ({
keyCode
}) =>
{
const increment = document.getElementsByClassName('increment')[0];
if (keyCode === 38) {
counter++;
document.getElementsByClassName('counter')[0].innerText = counter;
increment.classList.remove('hidden');
increment.classList.add('move-increment');
setTimeout(function() {
increment.classList.add('hidden');
increment.classList.remove('move-increment');
}, 600);
}
});
.container {
font-family: Arial, Helvetica, sans-serif;
font-size: 40px;
font-weight: bold;
display: flex;
height: 100px;
align-items: center;
justify-content: center;
}
.counter {
background-color: gray;
color: white;
border-radius: 10px;
padding: 10px;
}
.move-increment {
margin-top: -20px;
opacity: 0;
}
.hidden {
visibility: hidden;
}
.increment {
position: absolute;
margin-left: -33px;
z-index: 1;
transition: margin-top 1s cubic-bezier(0, 0.5, 0.5, 1), opacity 1s ease-in-out;
}
<div class="container">
<div>
Counter: <span class="counter">0</span>
<span class="increment hidden">+</span>
</div>
</div>
Но, однако, это не работает идеально при слишком быстром нажатии клавиши. Попробуйте изменить продолжительность setTimeout
и посмотрите, что вам подходит.
В предоставленных ссылках у вас есть примеры, как сбросить анимацию (не переход) вместе и решить эту проблему быстрого нажатия клавиш.
Прочтите об этом здесь, немного полезной информации:
Перезапуск CSS Анимация
Управление CSS Анимациями и переходами с помощью JavaScript