Sagen wir, du möchtest, dass eine Animation 1 Sekunde lang läuft, dann aber 4 Sekunden pausiert, bevor sie erneut ausgeführt wird. Das klingt einfach, oder? Es stellt sich heraus, dass es nicht ganz so einfach ist, aber machbar. Du musst es vortäuschen.
Nein
Es gibt die Eigenschaft animation-delay, aber das hilft uns hier nicht weiter. Dies verzögert den *Beginn* der Animation, aber nachdem sie gestartet ist, läuft sie kontinuierlich.
Lösung: Keyframes mit keinen Änderungen
Du benötigst ein wenig Kopfrechnen.
Ich möchte, dass die Animation 1 Sekunde lang läuft.
~ plus ~
Ich möchte, dass die Animation zwischen den Iterationen 4 Sekunden pausiert.
~ ergibt ~
5 Sekunden insgesamt.
Wenn du also die Keyframe-Animation aufrufst, verwendest du die Gesamtdauer in Sekunden.
.mover {
animation: move 5s infinite;
}
Aber jetzt werden unsere @keyframes 5 Sekunden lang laufen.
@keyframes move {
/* this will happen over 5 seconds */
}
Damit unsere Animation nur 1 Sekunde lang läuft, musst du die Änderungen über 1/5 der Zeit, also 20%, stattfinden lassen. Ausführlich würde das so aussehen:
@keyframes move {
0% {
transform: translate(0, 0);
}
/* Finish changes by here */
20% {
transform: translate(200px, 0);
}
/* Between 20% and 100%, nothing changes */
100% {
transform: translate(200px, 0);
}
}
Wir können mit weniger Code schreiben, da die 0%-Werte angenommen werden und du Keyframe-Schritte mit Kommas trennen kannst.
@keyframes move {
20%, 100% {
transform: translate(200px, 0);
}
}
Du kannst die Keyframes so ausgefallen gestalten, wie du möchtest. Du musst nur daran denken, dass alles zwischen dem letzten Schritt deiner Animation und 100% exakt gleich eingestellt ist.
Demo
Sieh dir den Pen Keyframe mit Animationsverzögerung zwischen Iterationen von Chris Coyier (@chriscoyier) auf CodePen an.
Ich habe bereits ein Tool dafür geschrieben: https://waitanimate.wstone.io/. Dies ist ein großartiges Beispiel dafür, was *WAIT! Animate* lösen soll.
waitanimateist ein schönes Werkzeug!So habe ich früher einen reinen CSS-Slider erstellt, der ununterbrochen lief.
Es ist eine coole Lösung, Chris, aber sie wird unübersichtlich, wenn mehrere Animationen verkettet werden müssen. Dann erfordert die Behandlung von Timings eine Überarbeitung aller Animationen einer bestimmten Komponente. Glücklicherweise gibt es die Web Animations API, die es uns ermöglicht, sequentielle Animationen zu erstellen. Ich habe vor einiger Zeit eine Einführung in WAAPI mit Beispielen für Gruppen- und Sequenzanimationen veröffentlicht.
https://pawelgrzybek.com/intro-to-the-web-animations-api/
Danke für das Teilen, da es JS ist, mag es für einige eleganter sein, aber der Ansatz im Artikel hat immer noch Neuheitswert und Verdienste und kann verwendet werden, wenn aus irgendeinem Grund JS nicht verfügbar ist.
Was ich gerne sehen würde, ist die Leistung der Akkulaufzeit / Auswirkung der Web-Animations-API im Vergleich zu CSS-Animationen. Ich bin ziemlich sicher, wie du sagst, dass es eher eine Frage der Komplexität ist, aber auch, dass die geskriptete Version viel mehr Ressourcen verbrauchen wird, wenn es eine Frage der Wahl weniger komplizierter Animationen sein könnte.
Ich brauchte dieses Verhalten tatsächlich in einem früheren Projekt und fand auch, dass `animation-delay` nicht ganz so funktionierte, wie ich es mir vorgestellt hatte. Toller Artikel! Prost.
Ich liebe das Tutorial und ich wünschte, sie würden `animation-delay` einfach für die gesamte Zeit funktionieren lassen und nicht nur für das erste Mal. Aber diese Umgehung gefällt mir gut, gut gemacht.