Sagen wir, Sie möchten, dass ein Element 9 Sekunden lang in einem Zustand und dann 1 Sekunde lang in einem anderen Zustand in einer Schleife ist.
Keine Überblendung zwischen den Zuständen, nur ein direkter Wechsel.
Ich habe mich neulich gefragt, wie man das machen könnte, und Sarah Drasner hat mir gezeigt, dass man mit sehr, sehr kurzen Abständen zwischen Keyframes von einem Zustand in einen anderen wechseln kann. Zum Beispiel von 59,999 % auf 60 %. Bei einer normalen Animationsdauer von 10 Sekunden gibt es dort keine Möglichkeit zu überblenden.
Siehe den Pen State Change with Quick Keyframe Change von Chris Coyier (@chriscoyier) auf CodePen.
Vielleicht etwas sauberer, man muss nicht einmal mit dem .999-Kram tricksen, wenn man `steps` verwendet, so wie hier:
div {
...
animation: color 10s steps(10) infinite both;
}
Einzelner Keyframe / Einzelner Schritt-Wechsler
Das hat mich dazu gebracht, über etwas anderes, super komisches CSS zu stolpern. Man würde denken, wenn man `steps(1)` verwendet, dass gar keine Änderung stattfindet, richtig? Da es nur einen Schritt gibt? Nicht wahr, es gibt tatsächlich 2 Schritte, wenn man `steps(1)` verwendet, aus welchem Grund auch immer. Das können wir nutzen.
Nehmen wir an, wir verfolgen die ursprüngliche Prämisse dieses Artikels: ein Zustand für 9 Sekunden und ein anderer Zustand für 1 Sekunde. So:
1-1-1-1-1-1-1-1-1-2
Sie könnten
div {
...
background: orangered;
animation: color 10s steps(1) infinite both;
}
@keyframes color {
90% {
background: teal;
}
}
Dieser `div` wird nur 1 Sekunde lang teal sein! Dann wechselt er zurück zu orangered. Ändern Sie diesen Keyframe auf 70 % und Sie erhalten:
1-1-1-1-1-1-1-2-2-2
Ändern Sie ihn auf 10 % und Sie erhalten:
1-2-2-2-2-2-2-2-2-2
Siehe den Pen 2efd2dc514da5485073acd6f4b9f3dab von Chris Coyier (@chriscoyier) auf CodePen.
Zustand ändern und „dort bleiben“
Wir haben jetzt einen ziemlich coolen Trick auf Lager, um den Zustand in einer zeitgesteuerten Schleife zu ändern. Wenn Sie den Schleifenteil nicht möchten, könnten Sie die Animation einmal durchlaufen lassen und dort bleiben, wie hier:
div {
...
background: orangered;
animation: color 10s steps(1) forwards;
}
@keyframes color {
90% {
background: teal;
}
}
Alles, was wir hier getan haben, ist das Schlüsselwort `infinite` zu entfernen, das die Wiederholung bewirkte, und `forwards` zu verwenden, was bedeutet: "Wenn das Ende erreicht ist, behalte die Stile im Endzustand bei". (Das Schlüsselwort `both` tut dies ebenfalls.)
Aber wie wechselt man auf Benutzerinteraktion von einem Zustand in einen anderen? Selbst das ist möglich! Stellen Sie sich eine Animation mit einer sehr langen Dauer vor (wie Tage und Tage). Sie könnten eine Benutzerinteraktion verwenden, um zu verschiedenen Positionen (Zuständen) innerhalb dieser Animation zu springen. Hier ist eine einfache Demo davon, bei der das Klicken auf einen Link einen `:target`-Zustand auslöst, der eine Animation auslöst, um zu einer Position innerhalb von Keyframes zu springen, die diesen Zustand stylen.
Siehe den Pen Keyframe State Changer von Chris Coyier (@chriscoyier) auf CodePen.
Nur Tricks, Leute. Wir sind das ganze Jahrzehnt hier.
Ihr habt zu viel Spaß! Genial!
Einige zusätzliche Dinge zu erwähnen
step-startundstep-endsind einfacher zu handhaben als `steps(1)`. Standardmäßig ist `steps(1)` gleich `step-end`, obwohl man auch `steps(1, start)` verwenden kann.Wenn Sie einen einzigen Keyframe für den Wert 50 % haben, springt `step-start` zu diesem Wert, sobald die Animation beginnt, und sobald sie den Animationszeitpunkt von 50 % überschreitet, springt sie zum nächsten Wert (oder kehrt zu den zugrunde liegenden Werten zurück, wenn Sie keinen nächsten Keyframe haben). Im Gegensatz dazu bleibt die Animation bei `step-end` oder `steps(1)` beim zugrunde liegenden Wert, bis Sie den Zeitpunkt von 50 % erreichen, und springt dann zu dem Wert aus dem Keyframe von 50 % und bleibt dort, bis Sie den Zeitpunkt für den nächsten Keyframe erreichen (oder 100 % der Zeit erreichen).
Die Position von `end` und `start` jedes Frames ändert sich nicht (relativ zur Gesamtdauer), wenn die Animation rückwärts oder abwechselnd läuft. Die gesamte Animation läuft rückwärts, mit der gleichen Zeitsteuerung für jeden Wert.
Es gibt die Eigenschaft
animation-play-statemit den Wertenrunningundpaused, wenn Sie eine Animation basierend auf Interaktion starten und stoppen möchten.Für eine einmalige Zustandsänderung bei Interaktion würde ich jedoch vorschlagen, die
@keyframesganz wegzulassen und den neuen Zustand einfach in der:target{}-Regel festzulegen?Nur ein Gedanke...
PS
Warum werden Markdown-Listen beim Absenden eines Kommentars in Absätze ohne Abstand umgewandelt? Sie funktionieren in der Vorschau!
Test einer unsortierten Liste
Listenpunkt 2
Test einer geordneten Liste
Listenpunkt 2
Test einer geordneten Liste mit Absätzen (Leerzeilen zwischen den Elementen)
Listenpunkt 2
So sah es in der Vorschau aus
PPS, das Einbetten von Bildern hat in der Vorschau auch funktioniert. Hier ist der Link: https://s3-us-west-2.amazonaws.com/s.cdpn.io/91525/CSS-Tricks-Comment-Preview-Lies.png
Hallo Amelia, ich mag deine Idee, die
@keyframeswegzulassen, sehr. Könntest du deine Lösung in einem Pen demonstrieren? Danke!Es sei denn, du meintest etwas so Einfaches wie http://codepen.io/anon/pen/ENXOvw
Das ist cool. Das ist in jeder Hinsicht sehr hilfreich. Aber ich denke darüber nach, meine alte Methode zum Erstellen von Strukturen für meinen mobilen Toggle zu ersetzen. Ich meine, reines CSS ist viel leichter, anstatt die JavaScript-Navigations-Toggle-Funktion eines Front-End-Frameworks zu nutzen, um es zu implementieren. Danke für diese Idee.
Tolle Idee, das könnte ich mal ausprobieren. Danke fürs Teilen.
#WeMakeWebsite
Hallo, großartiger Trick, ich suche immer nach Hacks, um JavaScript zu vermeiden. Aber eine Frage: Ich kann nicht herausfinden, wie das Klicken auf das X die Navigationsschicht schließt. Kann mir jemand in die richtige Richtung weisen? Danke.
Vielleicht könntest du einen Codepen bereitstellen, damit wir dir vielleicht helfen können.
Beste Grüße
Hallo da. =)
Es ist ziemlich einfach: Wenn du auf den Umschalter mit [href=”#menu”] klickst, erhält #menu seinen :target-Zustand. Wenn du auf den Schließen-Button (der [href=”#0”] hat) klickst, ändert sich der :target-Zustand von #menu zu #0.
Danke Azragh. Schönen Tag noch