2017-10-10 85 views
16

Mam animację CSS z opóźnieniem i wstrzymuję ją w trakcie opóźnienia. Działa zgodnie z oczekiwaniami w Firefoksie i Chrome, "Witaj" się nie porusza. Jednak w Safari animacja przeskakuje do ostatniej klatki. Dlaczego i jak to naprawić?Błąd animacji CSS w 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>

Jeśli usunąć 2s opóźnienie, ustaw czas trwania do 4s i dodać klatkę kluczową z transform: none, mogę uczynić ten prosty przykład pracę. Jednak mój prawdziwy przypadek ma wiele animacji, które są zsynchronizowane z opóźnieniami.

+0

Nie można odtworzyć. W przeglądarce Safari 11.0 (macOS) działa zgodnie z oczekiwaniami. – Styx

+0

@Styx Właśnie testowałem w Safari 11.0 i nadal występuje błąd. "Hello" przeskakuje na dół, zamiast być zatrzymanym. – Patrick

+0

Wypróbuj ten jsfiddle, proszę: https://jsfiddle.net/iStyx/2uqf1p9y/ – Styx

Odpowiedz

4

To nie jest odpowiedź na problem. Jeśli jednak usuniesz opóźnienie animacji, wstrzymanie i ponowne uruchomienie animacji będzie działać tak, jak powinno. Wydaje się, że przyczyną opóźnienia jest opóźnienie animacji. Być może zamiast polegać na css, aby obsłużyć opóźnienie, programowo kontrolować opóźnienie animacji za pomocą javascript.

Zobacz poniżej zatrzymując i uruchamiając animację

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>

+0

Dzięki ... Tak, zauważyłem, znalazłem inne obejście, usunąłem opóźnienia i dodałem klatki kluczowe i różne animacje – Patrick

+0

że twój kod nie działa zgodnie z oczekiwaniami na mobilnym Safari 9.0 Tekst przesuwa się w tył i w przód – Patrick

+1

Tak, z pewnością jest trochę powolności, jeśli chodzi o animację-grę-państwo i safari – wlh

11

Zachowanie Safari jest tylko buggy gdy timeout ustawiony na wartość mniejszą niż opóźnienia animacji. Więc obejście jest ustalenie stanu początkowego do paused poprzez animation-play-state a następnie kontrolować za pomocą JS, jak pokazano poniżej:

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>

Wypróbuj różne wartości limitu czasu, aby zobaczyć jego pracy. Nie mogę powiedzieć, dlaczego tak się dzieje. Wygląda mi na błąd. Testowany na OS X El Capitan 10.11.6/Safari 11.0 (11604.1.38.1.7).

Codepen demo

+0

Dzięki. wnioskuję, że jest to błąd, zwłaszcza, że ​​znalazłem inne błędy: Safari wydaje się niesamowicie błędny z animacjami, chyba że muszę przerobić wszystko w JavaScript. – Patrick