Verstehen von Zeitachsenbereichsnamen
Standardmäßig verfolgen View-Progress-Zeitachsen Elemente über den gesamten Scrollbereich. Die Animationszeitachse beginnt, wenn der erste Pixel der Startecke des Elements die Endkante des Scrollbereichs schneidet, und endet, wenn die Endkante des Elements die Startkante des Scrollbereichs überschreitet. Sie können diesen Standardbereich der Animation anhängen. Beispielsweise können Sie die View-Progress-Zeitachse einschränken, sodass sie erst beginnt, wenn das Element vollständig in den Scrollbereich eingetreten ist.
Dieser Leitfaden erklärt, wie Sie Zeitachsenbereichsnamen ändern. Insbesondere wird untersucht, welche verschiedenen Zeitachsenbereichsnamen es gibt, welche Bedeutung sie haben und wie sie verwendet werden.
Grundlagen der View-Progress-Zeitleiste
CSS-Animationen werden erstellt, indem @keyframes-Animationen an ein Element mithilfe der animation-name-Eigenschaft (oder animation-Kurzform) angehängt werden. Die Keyframes definieren das Verhalten der Animation, während die animation-timeline bestimmt, wann und wie das Element durch diese Keyframes fortschreitet.
Standardmäßig ist die Zeitleiste der Animation die standardmäßige zeitbasierte DocumentTimeline des Dokuments. Bei CSS-Scroll-gesteuerten Animationen wird die Zeitleiste der Animation oder der Fortschritt entweder durch das Scrollen des Benutzers (Scroll-Fortschritts-Zeitachsen) oder die Sichtbarkeit des Elements (View-Progress-Zeitachsen) angetrieben, anstelle des Zeitablaufs.
Bei View-Progress-Zeitachsen ist der Fortschritt der Keyframes mit dem Anteil des Elements verbunden, der im Scroller sichtbar ist, und mit der Position des Elements innerhalb des Scrollers. Wenn das Element den Viewport betritt, schreitet die Zeitleiste fort. Wenn der Benutzer das Scrollen umkehrt, kehrt die Zeitleiste um. Mit anderen Worten, wenn das Element ins Sichtfeld kommt oder dieses verlässt, schreitet die Zeitleiste entsprechend voran oder zurück. Die Animation tritt nur auf, wenn das Element innerhalb seines Scrollbereichs sichtbar ist. Wenn das Scrollen stoppt, während das Element sichtbar ist, pausiert die Animation.
Standard-View-Progress-Zeitleiste
Standardmäßig beginnt der Fortschritt der View-Progress-Zeitleiste, wenn die Startecke des verfolgten Elements die Endkante des Scrollbereichs schneidet und endet, wenn die Endkante des Elements die Startkante des Scrollbereichs verlässt. Diese sind die oberen und unteren Kanten des Elements und des Scrollbereichs beim vertikalen Scrollen, und die linken und rechten oder rechten und linken Kanten beim horizontalen Scrollen, je nach Schreibmodus.
Im folgenden Beispiel versuchen Sie, nach unten zu scrollen. Beachten Sie, wie die Animation genau dann beginnt, wenn die obere Kante des animierten Elements mit der unteren Kante des Scrollcontainers ausgerichtet ist und endet und 100% Fortschritt erreicht, wenn die untere Kante mit der oberen Kante des Containers ausgerichtet ist, unabhängig davon, wie hoch das animierte Element ist.
Der Schreibmodus des Scrollcontainers und die Scrollrichtung bestimmen die Start- und Endkanten des Scrollcontainers.
Der Animationsanheftungsbereich
Standardmäßig wird das Element die gesamte Zeit animiert, während irgendein Teil des Elements sichtbar ist. Das bedeutet, dass der Standard-Animationsanheftungsbereich die Summe der Höhe des Scrollcontainers und der Höhe des Elements ist, wobei diese zusätzliche Höhe an der Endkante des Scrollbereichs liegt.
Im vorherigen Beispiel ist der Scrollcontainer 250px hoch und das animierte Element ist standardmäßig 50px hoch, was bedeutet, dass der vertikale Animationsanheftungsbereich 300px hoch ist. Wenn das Element auf 250px gesetzt wird, beträgt der Bereich 500px; wenn das Element auf 500px gesetzt wird, wächst die Größe des Animationsanheftungsbereichs auf 750px.
Das Modul CSS-Scroll-gesteuerte Animationen bietet Mechanismen zur Definition verschiedener Animationsanheftungsbereiche. Die Eigenschaften animation-range-start und animation-range-end, die beide mit der Kurzform animation-range festgelegt werden können, definieren den Anheftungsbereich für die Start- und Endkante des Animationsbereichs, jeweils mit beliebigen Einfassungen von beiden Kanten.
Die Animation-Range-Eigenschaften akzeptieren das Schlüsselwort normal, einen <timeline-range-name>, ein <length-percentage>, oder sowohl einen <timeline-range-name> als auch das <length-percentage>. In diesem Leitfaden behandeln wir nur die Werte für die <timeline-range-name>-Komponente des Wertes.
Zeitachsenbereichsnamen
Der Wertetyp <timeline-range-name> akzeptiert sechs Schlüsselwörter: cover, contain, entry, exit, entry-crossing und exit-crossing. Jedes dieser Schlüsselwörter stellt einen vordefinierten benannten Zeitachsenbereich dar. Ein benannter Zeitachsenbereich ist ein benannter Abschnitt einer Animationszeitachse. Diese Schlüsselwörter ermöglichen es dem Entwickler, die Basis des Animationsanheftungsbereichs festzulegen, auf die sich Versätze beziehen. Der Beginn des Segments wird als 0% Fortschritt durch den Bereich dargestellt; das Ende des Segments wird als 100% Fortschritt durch den Bereich dargestellt. Wo sich diese Punkte befinden, hängt vom verwendeten benannten Bereich ab.
Cover
Der Animationsanheftungsbereich in den vorherigen Beispielen umfasst den gesamten Bereich. Dieser Bereich stellt den gesamten Bereich der View-Progress-Zeitachse dar. 0% Fortschritt stellt den Punkt dar, an dem die Startkante des Elements mit der Endkante des Scrollbereichs ausgerichtet ist, und 100% Fortschritt stellt den Punkt dar, an dem die Endkante des Elements die Startkante des Scrollbereichs erreicht. Wie wir gesehen haben, ist die Größe des cover-Bereichs die Summe der Dimensionen des Elements und des Scrollbereichs in der Scrollrichtung. In allen bisherigen Beispielen entspricht die Höhe des Animationsanheftungsbereichs der Höhe des Containers plus der Höhe des animierten Elements.
Der cover-benannte Zeitachsenbereich ist der Standardbereich. Wir hätten die <timeline-range-name> explizit auf dasselbe Ergebnis setzen können:
.animated_element {
animation-range-start: cover;
animation-range-end: cover;
}
Das Bild zeigt die Animationszeitachse. Die Position des Elements, wenn es den Beginn des Animationsanheftungsbereichs bei 0%-Markierung erreicht, wird durch einen gelben Block dargestellt. Dies repräsentiert die Position des Elements, wenn das from-Keyframe angewendet wird. Der rote Block stellt die Position des Elements relativ zum Scrollbereich dar, wenn das to-Keyframe angewendet wird. Dies ist die Position des animierten Elements, wenn es das Ende der Animation erreicht.
Je nach Größe des Elements und des gewählten Zeitachsenbereichs können sich die Start- und Endpositionen überschneiden. Überlappungsbereiche (wie in den nachfolgenden Diagrammen zu sehen) werden durch gestreifte rote und gelbe Bereiche dargestellt.
Contain
Der contain-benannte Zeitachsenbereich umfasst die Animation vollständig innerhalb des Scrollbereichs — der Bereich beginnt, wenn das animierte Element zu 100% sichtbar ist, und endet, wenn es nicht mehr vollständig sichtbar ist, falls es vollständig sichtbar sein kann.
Der contain-Wert stellt den Bereich dar, während dessen die Hauptkiste entweder vollständig vom Sichtbereich des Scrollbereichs umfasst wird oder vollständig diesen überdeckt, je nachdem, ob das Element kleiner ist (vollständig umfasst werden kann) oder größer ist als der Scrollbereich.
-
Wenn das Element kleiner ist als der Scrollbereich in der Scrollrichtung, tritt
0%auf, wenn die Endkante des animierten Elements mit der Endkante des Scrollbereichs ausgerichtet ist, und100%, wenn die Startkante des animierten Elements mit der Startkante des Scrollbereichs ausgerichtet ist. Mit anderen Worten: Dercontain-Wert reicht von dem Punkt, an dem das Element erstmals vollständig vom Scrollbereich umfasst wird (0%), bis zu dem Punkt, an dem es nicht mehr vollständig vom Scrollbereich umfasst wird (100%). -
Wenn das Element größer ist als der Scrollbereich, tritt
0%Fortschritt auf, wenn die Startkante des animierten Elements die Startkante des Scrollbereichs erreicht, und100%, wenn die Endkante ausgerichtet ist. Mit anderen Worten: Wenn die Animation größer ist als ihr Container, ist das animierte Element nie vollständig sichtbar, da es nicht im Scrollbereich "enthalten" ist. Die Animation beginnt, wenn die Startkante die Startkante des Scrollbereichs erreicht, und endet, wenn die Endkante des animierten Elements die Endkante des Containers erreicht. -
Wenn das animierte Element dieselbe Größe hat wie der Container, findet die Animation immer noch statt, aber über
0px, was für den Benutzer nicht sichtbar ist.
.animated_element {
animation-range: contain;
}
In diesem Beispiel beträgt die ursprüngliche Höhe des animierten Elements 20% der Höhe des Scrollbereichs und kann daher vollständig darin enthalten sein. Daher sollte, wie zuvor erklärt, die Animation starten, sobald das Element in den Scrollbereich zu gelangen beginnt, und sie sollte enden, sobald das Element zu verlassen beginnt.
Wenn Sie die Option 500px auswählen, wird das Element doppelt so hoch wie der Scrollbereich. Der Animationsbereich beginnt, wenn das Element den Scrollbereich zum ersten Mal vollständig abdeckt, wobei 0% dann erreicht wird, wenn die Startkante die Startkante des Containers erreicht. Er endet, wenn das Element den Scrollbereich nicht mehr vollständig abdeckt, wobei 100% erreicht wird, wenn die Endkante die Endkante des Containers überschreitet.
Wenn das Element dieselbe Größe wie der Scrollcontainer hat, wie es der Fall ist, wenn 250px ausgewählt ist, findet die Animation immer noch statt, aber über 0px. Da 0% und 100% gleichzeitig auftreten, ist die Animation sofortig. Der Unterschied in der Gestaltung ist nur wahrnehmbar, weil die Eigenschaften, die im 100%-Keyframe-Zustand definiert sind, nach dem Ende der Animation angewendet werden. Dies ist so, weil die Eigenschaft animation-fill-mode auf forwards gesetzt ist. Andernfalls würde das mittelgroße 250px-Element, das dieselbe Höhe wie der Scrollcontainer hat, so erscheinen, als ob es sich überhaupt nicht animieren würde.
Die Animation tritt auf, wenn sich das Element innerhalb der durch das Weiß des Containers im 50px-Beispiel dargestellten Bereiche und innerhalb der roten/gelben Bereiche im 250px- und 500px-Beispiel befindet.
Für einige kann es hilfreich sein, die Werte cover und contain miteinander zu vergleichen und gegenüberzustellen. Wir können die Kurzform-Eigenschaft animation-range verwenden, um die animation-range-start und animation-range-end Eigenschaften auf denselben <animation-name-range>-Wert zu setzen:
#A {
animation-range: contain;
}
#B {
animation-range: cover;
}
Wählen Sie verschiedene Optionsfelder aus und scrollen Sie den Scrollbereich, um die Auswirkungen der Werte cover und contain auf Animationszeitachsen zu vergleichen.
Schauen wir uns die anderen <timeline-range-name> Schlüsselwortwerte an!
Entry und Exit
Um die gesamte Animation nur dann stattfinden zu lassen, wenn sich das Element in den Prozess des Eintritts in oder Austritts aus dem Scrollbereich befindet, verwenden Sie die Werte entry oder exit. Mit diesen beiden Werten basiert der Animationsanheftungsbereich auf der Größe des animierten Elements, nicht auf der Größe des Scrollbereichs.
Entry
Bei entry tritt 0% Fortschritt ein, sobald das animierte Element beginnt, in den Scrollbereich einzutreten, wenn die Startkante des Elements die Endkante des Scrollbereichs überschreitet.
Die gesamte Animation tritt auf, wenn das Element ins Sichtfeld kommt und endet, wenn es komplett sichtbar wird oder wenn es die Startkante erreicht; je nachdem, was zuerst eintritt. Wenn das animierte Element kleiner ist als der Scrollbereich, ist der Animationsanheftungsbereich die Größe des Elements.
Die Position bei 0% Fortschritt wird in Gelb angezeigt. Die Position bei 100% Fortschritt wird in Rot angezeigt. Wenn das animierte Element größer ist als der Scrollbereich, überlappen sich diese beiden Positionen, was durch einen gestreiften Hintergrund angezeigt wird.
Bei entry entspricht der Animationsanheftungsbereich entweder der Größe des animierten Elements oder der Größe des Containers, je nachdem, was kleiner ist. Wenn das Element größer als der Scrollbereich ist, umfasst der Animationsanheftungsbereich den gesamten Scrollbereich. Bei entry tritt 100% ein, wenn die Endkante des Elements die Endkante des Scrollbereichs überschreitet oder, wenn das animierte Element größer ist als der Scrollbereich in der Scrollrichtung, wenn die Startkante des Elements die Startkante des Scrollbereichs erreicht.
Das Setzen von animation-range-start: entry ist dasselbe wie das Setzen von animation-range-start: cover.
Das Setzen von animation-range-end: entry ist gleichbedeutend mit dem Setzen von animation-range-end: contain.
Exit
Der exit-Wert ist das Gegenteil von entry.
Bei exit beginnt der Anheftungsbereich, wenn die Startkante des animierten Elements die Startkante des Scrollbereichs überschreitet.
Der 0%-Fortschritt tritt auf, wenn die Startkante des Elements die Startkante des Scrollbereichs erreicht.
Der 100%-Fortschritt tritt auf, wenn die Endkante des Elements die Startkante überschreitet.
Das Setzen von animation-range-start: exit 0% ist gleichbedeutend mit animation-range-start: contain 100%.
Das Setzen von animation-range-end: exit 100% ist gleichbedeutend mit animation-range-end: cover 100%.
Vergleich von Entry und Exit
Es kann hilfreich sein, entry und exit nebeneinander zu betrachten, um zu verstehen, welchen Einfluss die Größe des Elements auf den Animationsanheftungsbereich hat: Bei diesen beiden Werten ist der Animationsanheftungsbereich nie größer als der Container.
#A {
animation-range: entry;
}
#B {
animation-range: exit;
}
Scrollen Sie die Viewbox, um die Reichweite der entry- und exit-Werte zu sehen, ändern Sie dann die Größe der Elemente mit den Optionsfeldern und scrollen Sie erneut.
Wenn die Elemente klein genug sind, um vollständig im Scrollbereich untergebracht zu werden, befindet sich die Animationsanheftungszeitachse am Anfang (entry) oder Ende (exit) des Scrollbereichs, und die Größe des Anheftungsbereichs ist auf die Größe des animierten Elements in der Scrollrichtung begrenzt.
Mit entry und exit ist der Animationsbereich auf die Größe des Scrollbereichs beschränkt, während das Element nicht ist.
Wenn das Element dieselbe Größe wie der Scrollbereich oder größer ist:
- Im Fall von
entryendet die Animation, wenn das Element den Scrollbereich in der Scrollrichtung vollständig überdeckt. - Im Fall von
exitbeginnt die Animation erst, wenn das Element den Scrollbereich in der Scrollrichtung vollständig überdeckt.
Dies ist möglicherweise nicht der Effekt, den Sie wünschen. Wenn Sie möchten, dass eine Entry-Animation weiterhin läuft, bis das gesamte Element den Startpunkt des Scrollbereichs vollständig passiert hat, oder wenn Sie möchten, dass eine Exit-Animation startet, sobald das Element beginnt, die Endkante des Scrollbereichs zu verlassen, müssen Sie entry-crossing und exit-crossing verwenden.
Entry- und Exit-Crossing
Wenn das Element kleiner als der Scrollbereich ist und Sie möchten, dass die vollständige Animation abläuft, während das Element in den Scrollbereich eintritt oder diesen verlässt, können Sie glücklich die Werte entry oder exit verwenden.
Wenn das Element größer als der Scrollbereich ist, läuft die Animation nicht über den gesamten Verlauf des Ein- oder Austretens des Elements aus dem Scrollbereich. Der entry-Wert setzt den 100% Fortschritt als den Punkt, an dem die Startkante des Elements die Startkante des Scrollbereichs erreicht, bevor das Element vollständig in den Scrollbereich eingetreten ist. Bei exit tritt der 0%-Fortschritt ein, wenn die Endkante des Elements die Endkante des Scrollcontainers erreicht, wenn bereits ein Teil des Elements den Scrollbereich verlassen hat. Bei beiden Werten ist der Animationsanheftungsbereich kleiner als das Element. Wenn dies nicht der gewünschte Effekt ist, könnten die *-crossing-Werte die Lösung sein, die Sie suchen.
Entry-Crossing
Der entry-crossing-Wert stellt den Bereich dar, während dessen das animierte Element die Endkante des Scrollbereichs überschreitet, wobei der 0%-Fortschritt eintritt, wenn die Startkante des Elements mit der Endkante des Scrollbereichs ausgerichtet ist, und der 100%-Fortschritt eintritt, wenn die Endkante des Elements die Endkante des Scrollbereichs erreicht, was bedeutet, dass es vollständig in den Scrollbereich gescrollt ist.
Es könnte hilfreich sein, die beiden Werte in einem Live-Beispiel zu vergleichen.
#A {
animation-range: entry;
}
#B {
animation-range: entry-crossing;
}
Wählen Sie die verschiedenen Höhenwerte aus und scrollen Sie dann, um entry mit entry-crossing für jede Größe zu vergleichen.
Beachten Sie, wie sich die Effekte ähneln, außer wenn 500px ausgewählt ist und das animierte Element größer ist als der Container.
Der entry-crossing-Bereich erzielt dieselben Ergebnisse wie entry, wenn das Element gleich oder kleiner als der Scrollbereich ist, aber wenn das Element größer ist als der Scrollbereich, erfolgt 100% später, nämlich erst, wenn die Endkante den Viewport erreicht hat.
Der Animationsanheftungsbereich ist die Größe des Elements und nicht auf die Größe des Scrollbereichs beschränkt.
Exit-Crossing
Der exit-crossing-Wert stellt den Bereich dar, während dessen das animierte Element die Startkante des Scrollbereichs überschreitet, wobei der 0%-Fortschritt auftritt, wenn die Startkante des Elements mit der Startkante des Scrollbereichs ausgerichtet ist, und der 100%-Fortschritt auftritt, wenn die Endkante des Elements die Startkante des Scrollbereichs erreicht.
Bei exit-crossing beginnt die Animation, sobald das Element den Scrollbereich bedeckt (bei exit beginnt die Animation erst, wenn die Endkante des Elements in den Blickfeld eintritt). In beiden Fällen läuft die Animation weiter, bis das Element den Scrollbereich vollständig an der Startkante verlässt.
#A {
animation-range: exit;
}
#B {
animation-range: exit-crossing;
}
Der exit-crossing-Wert ergibt die gleichen Ergebnisse wie exit, wenn das Element gleich oder kleiner als der Scrollbereich ist, aber wenn das Element größer ist als der Scrollbereich, tritt 0% früher auf, nämlich sobald die Startkante des Elements die Startkante des Scrollbereichs erreicht, anstatt darauf zu warten, dass die Endkante des Elements in den Scrollbereich eintritt.
Wie bei entry-crossing entspricht der Animationsanheftungsbereich der Größe des Elements und ist nicht auf die Größe des Scrollbereichs beschränkt.