Ошибка анимации CSS в Safari
У меня есть анимация CSS с задержкой, и я приостанавливаю ее во время задержки.
Он работает так, как ожидалось, в Firefox и Chrome, "Hello" не перемещается.
Однако в Safari анимация переходит к последнему кадру.
Почему и как исправить пожалуйста?
function test() {
var timeout = 1000;
setTimeout(function() {
document.getElementById('animation').style.animationPlayState = 'paused';
}, timeout);
}
document.addEventListener("DOMContentLoaded", test);
#animation {
animation: test 2s linear 2s;
}
@keyframes test {
to {
transform: translateY(100px);
}
}
<div id="animation">
Hello (this text should not move)
</div>
Ответы
Ответ 1
Поведение Safari является только ошибкой, когда для тайм-аута установлено значение, меньшее, чем задержка анимации. Итак, обходной путь - установить начальное состояние на paused
через animation-play-state
, а затем управлять им через JS, как показано ниже:
function test() {
let el = document.getElementById("animation");
let timeout = 1000;
// Get the delay. No luck with el.style.animationDelay
let delay =
window
.getComputedStyle(el)
.getPropertyValue("animation-delay")
.slice(0, -1) * 1000;
// Only resume and later pause when timeout is greater than animation delay
if (timeout > delay) {
el.style.animationPlayState = "running";
setTimeout(function() {
el.style.animationPlayState = "paused";
}, timeout);
}
}
document.addEventListener("DOMContentLoaded", test);
#animation {
animation: test 2s linear 3s;
animation-play-state: paused; /* Pause it right after you set it */
}
@keyframes test {
to {
transform: translateY(100px);
}
}
<div id="animation">
Hello (this text should not move)
</div>
Ответ 2
Это не ответ на проблему. Однако, если вы удаляете задержку анимации, приостановка и перезапуск анимации работают так, как должно. Кажется, что задержка анимации является причиной проблемы. Возможно, вместо того, чтобы полагаться на css для обработки задержки, программно управляйте задержкой анимации с помощью javascript.
См. ниже: пауза и запуск анимации
function test() {
var timeout = 1000;
setTimeout(function() {
document.getElementById('animation').style.animationPlayState ='paused';
document.getElementById('animation').style.webkitAnimationPlayState ='paused';
}, timeout);
setTimeout(function() {
document.getElementById('animation').style.animationPlayState='running';
document.getElementById('animation').style.webkitAnimationPlayState ='running';
}, timeout * 2);
}
document.addEventListener("DOMContentLoaded", test);
#animation {
-webkit-animation: test 2s linear;
animation: test 2s linear;
}
@-webkit-keyframes test {
to {
-webkit-transform: translateY(100px);
transform: translateY(100px);
}
}
@keyframes test {
to {
-webkit-transform: translateY(100px);
transform: translateY(100px);
}
}
<div id="animation">
Hello (this text should not move)
</div>