Verständnis von Timeline-Einbettungen
Standardmäßig verfolgen Ansichtsfortschritts-Timelines Elemente über den gesamten Animierungsanbindungsbereich. Der Fortschrittspunkt 0% befindet sich am Anfang des Bereichs, während der Fortschrittspunkt 100% am Ende liegt. Der Animierungsanbindungsbereich kann geändert werden, indem ein Timeline-Bereichsname festgelegt wird. Die Position der 0%- und 100%-Fortschrittspunkte entlang des Bereichs kann durch Einstellen von Längen- oder prozentbasierten Einbettungswerten angepasst werden.
Dieser Leitfaden erklärt, wie man die Animationstimeline auf einen bestimmten Teil des Animierungs-Timeline-Bereichs mittels Längen- oder Prozentwerten begrenzen kann.
Animationstimelines: ein Leitfaden
CSS-Animationen werden durch die Definition benannter @keyframes-Animationen erstellt, die das Verhalten einer Animation angeben, und dann die Keyframe-Animation mit dem Namen der Animation an ein Element angehängt.
Die Animationstimeline des Elements, definiert durch die Eigenschaft animation-timeline, bestimmt, wie und wann das Element durch diese Keyframes fortschreitet. Standardmäßig ist die Timeline zeitbasiert und nutzt die zeitzentrierte DocumentTimeline.
Das Modul CSS scrollgesteuerte Animation definiert Scroll-Fortschritts- und Ansichtsfortschritts-Timelines, die Methoden zur Animation von Eigenschaftswerten entlang einer scrollbasierten Timeline anstelle der standardmäßigen zeitbasierten Dokumenttimeline sind. In diesem Artikel werden wir nur Ansichtsfortschritts-Timelines diskutieren, da Scroll-Fortschritts-Timelines für Timeline-Einbettungen nicht relevant sind.
Ansichtsfortschritts-Timelines
Mit Ansichtsfortschritts-Timelines wird die Timeline oder der Fortschritt der Animation durch die Sichtbarkeit des Elements statt durch den Zeitablauf gesteuert, wobei der Fortschritt der Keyframes an die Position und Sichtbarkeit des Subjektelements innerhalb des Scrollcontainers gebunden ist. Die Animation schreitet voran und kehrt sich um, während das Element durch den Scrollport voranschreitet oder zurückkehrt. Die Animation findet nur statt, wenn zumindest ein Teil des Elements innerhalb seines Scrollports sichtbar ist und pausiert, wenn das Scrollen pausiert.
.animated_element {
animation-name: nameOfAnimation;
animation-timeline: view();
}
Das Setzen eines animation-name wendet die Animation auf das ausgewählte Element an.
Hinweis:
Die Eigenschaft animation-timeline sollte immer nach allen animation-Kurzform-Deklarationen stehen. Während die Kurzform-Eigenschaft nicht verwendet werden kann, um die Eigenschaft animation-timeline zu setzen, setzt sie die Timeline auf die standardmäßige zeitbasierte Dokumenttimeline zurück.
Hinweis:
In allen Beispielen ist der Scrollcontainer 250px hoch und wir verwenden die Standardwerte für animation-iteration-count (1), animation-delay (0s) und animation-direction (normal). Wir setzen die animation-timing-function auf step-end und die animation-fill-mode auf forward, um deutlicher zu machen, wann die Animationsiteration noch nicht begonnen hat, wann sie aktiv ist und wann sie abgeschlossen ist. Sehen Sie sich den CSS-Animations-Leitfaden an, um mehr zu erfahren.
Wenn Sie nach oben scrollen, schreitet die Animation fort. Wenn Sie nach unten scrollen, kehrt sich die Animation um.
In diesem Beispiel tritt die Animation auf, immer wenn ein Teil des Subjektelements im Scrollport sichtbar ist. Standardmäßig beginnen Ansichtsfortschrittsanimationen genau dann, wenn die obere Kante des Subjektelements mit der unteren Kante des Scrollcontainers übereinstimmt und enden, wenn 100% Fortschritt erreicht ist, wenn die Endkante mit der Startkante des Containers übereinstimmt, unabhängig von der Größe des Subjektelements. Standardmäßig wird die Animation angewendet, wenn irgendein Teil des Subjekts innerhalb des Scrollports sichtbar ist.
Animation-Anbindungsbereiche
In einer Ansichtsfortschrittstimeline, wenn keine Animationsbereichs-Eigenschaften definiert sind, ist der <timeline-range-name> normal, was standardmäßig cover ist. Die Animation wird jedes Mal angewendet, wenn ein Teil des Subjektelements sichtbar ist, was bedeutet, dass der standardmäßige Animationsanbindungsbereich die Summe der Höhe des Scrollcontainers und der Höhe des Subjektelements ist, wobei diese zusätzliche Höhe am Scroll-Endrand liegt. In unserem Beispiel, da der Scrollcontainer 250px hoch ist und das Subjekt 50px, 250px oder 500px hoch ist, sind die vertikalen Animationsanbindungsbereiche 300px, 500px oder 750px hoch.
Der Fortschritt von 0% tritt auf, wenn die Startkante des Subjektelements den Scrollport am Endrand schneidet, und erreicht 100% Fortschritt, wenn die Endkante des Subjekts über die Startkante des Scrollports austritt. Dies sind die oberen und unteren Kanten des Subjekts und des Scrollports beim vertikalen Scrollen und die linken und rechten oder rechten und linken Kanten beim horizontalen Scrollen, abhängig vom Schreibmodus.
Das folgende Diagramm veranschaulicht die Position des Subjekts an den 0%- und 100%-Fortschrittspunkten für die drei Subjektgrößen:
Die gelben Subjektelemente repräsentieren die Position des Elements, wenn der from-Keyframe angewendet wird, was die 0%-Fortschrittsmarke des Animationsbereichs ist. Das Rote repräsentiert die Position des animierten Elements relativ zum Scrollport, wenn der to-Keyframe angewendet wird, was das Ende der Animation oder das 100%-Fortschrittszeichen ist. Das Graue repräsentiert den Scrollport.
Standardmäßig animiert das Element, während es "in Sicht" ist, aber diese Standarddefinition von "in Sicht" passt möglicherweise nicht zu Ihren Bedürfnissen. Zum Glück können wir steuern, welche Kanten die Kanten des Animationsanbindungsbereichs definieren und dann den Start und das Ende dieses Bereichs mit den Animationsbereichs-Eigenschaften versetzen.
Animationsbereichs-Eigenschaften
Die Eigenschaften animation-range ermöglichen es, einen benannten Timeline-Bereich wie contain oder exit-crossing anzugeben, der den verwendeten Bereich vom Standardbereich cover ändert. Sie können auch einen <length-percentage>-Wert einschließen, der den Anbindungsbereich vom Start des Bereichs aus einbetttet. Prozentsätze beziehen sich auf die benannten oder standardmäßigen Timelinerahmen.
Benannte Timeline-Bereiche definieren die Abschnitte einer ViewTimeline, die den Animationsbereich definieren und den Start und das Ende des Anbindungsbereichs der Animation festlegen.
Die Eigenschaft animation-range ist eine Kurzform-Eigenschaft, die die Eigenschaften animation-range-start und animation-range-end definiert. Der animation-range-start definiert die Position des Subjektelements, wenn die Animation beginnt. Der animation-range-end definiert die Position des Subjektelements, wenn die Animation endet.
Sehen Sie den Leitfaden für Timelinerahmen, um mehr über die verschiedenen benannten Timelinerahmen zu erfahren. Dieser Leitfaden konzentriert sich darauf, wie die <length-percentage>-Einbettungswerte funktionieren.
Einbetten mit Längen
Die Eigenschaften animation-range-start und animation-range-end akzeptieren je einen benannten Animationsbereich, einen <length-percentage>-Wert oder beides. Jede Längen- oder Prozentwert-Versetzung wird vom Start des Animationsanbindungsbereichs aus gemessen.
Wenn ein <length> gesetzt ist, ist die Versetzung ziemlich intuitiv.
Hier verwenden wir die Eigenschaften animation-range-start und animation-range-end, um die Animationstimeline einzubetten. Dies definiert einen Teilbereich des gesamten Animationsanbindungsbereichs des Elements als das aktive Intervall, wobei die Werte <length> Entfernungen vom Start des Standard-normal-Animationsanbindungsbereichs angeben.
.animated_element {
animation-range-start: 1em;
animation-range-end: 125px;
}
Der Start und das Ende des Animationsbereichs sind 1em bzw. 125px vom Start des Animationsanbindungsbereichs entfernt. Da der Standard der Timeline-Bereich normal, der zu cover aufgelöst wird, ist, ist der Start des Animationsanbindungsbereichs der Block-Endrand des Containers.
Wir haben Linien hinzugefügt, die 1em und 125px vom Block-Endrand des Scrollcontainers entfernt sind. Die Animation beginnt, wenn die Block-Startkante des Subjektelements die 1em-Linie erreicht und endet, wenn sie die 125px-Linie erreicht.
In diesem Fall, da der Animationsanbindungsbereich sowohl für die Start- als auch für die Endversetzungswerte zu cover aufgelöst wird, ist der Ort der Einbettungen ziemlich unkompliziert.
Auswirkungen benannter Bereiche auf Längenversetzungen
Der Versetzungsabstand ist immer vom Start des zugehörigen Animationsbereichs aus gemessen. In diesem Beispiel setzen wir den animation-range-start auf 50px vom Start des Standardbereichs normal und setzen den animation-range-end auf 100px vom Start des explizit gesetzten entry-Bereichs:
.animated_element {
animation-range-start: 50px;
animation-range-end: entry 100px;
}
Da die Startkanten sowohl des normal- als auch des entry-Bereichs die Endkante des Containers sind, beginnt die Animation, wenn die Startkante des Subjekts 50px vom unteren Rand des Scrollports entfernt ist, und endet, wenn 100% Fortschritt erreicht ist, wenn die Startkante des Subjekts 100px vom unteren Rand des Scrollports entfernt ist, unabhängig von der Größe des Subjekts. Während die Größe des entry-Bereichs für die drei unterschiedlichen Subjektgrößen unterschiedlich ist, spielte in diesem Fall die Größe des zugrunde liegenden Bereichs keine Rolle.
Längenversetzungen mit unterschiedlichen Bereichsgrößen
Die Größe des Bereichs ist wichtig, wenn der Bereich nicht an der Endkante des Elements beginnt, wie es bei exit und exit-crossing der Fall ist, oder wenn die Versetzung ein Prozentwert ist. Diese Tatsache und die Tatsache, dass Sie Animationsbereichsnamen mischen können, machen die Versetzungen der Ansichtsfortschrittstimelines ein wenig komplizierter zu verstehen als nicht versetzte Timelinerahmennamen.
Zum Beispiel, wenn exit als Timelinenamensbereich gesetzt wird, spielt die Größe des Subjekts eine Rolle, da sie die Lage der Endkante des Bereichs bestimmt.
.animated_element {
animation-range-start: entry 60px;
animation-range-end: exit 75px;
}
Sowohl bei entry als auch bei exit ist der Bereich so groß wie das Subjekt, wobei die Größe auf die des Scrollports beschränkt ist. Dies bedeutet, dass die Höhe des entry- und exit-Bereichs die Höhe der Box in den 50px- und 250px-Beispielen ist, während im 500px-Beispiel der Bereich auf die Höhe des Scrollports begrenzt ist, der 250px hoch ist.
Wir haben ein paar Linien hinzugefügt, um die folgenden Erklärungen zu erleichtern: Die untere blaue Linie ist 60px von der Endkante des Scrollports entfernt und die obere rote Linie ist 75px von derselben Kante entfernt. Diese sind, wo der Animationsbereichsstart und -ende sich jeweils befinden.
Dieses Beispiel zeigt mehrere wichtige Merkmale, die wir ausführlicher erklären werden, einschließlich:
- Versetzungen werden von ihren jeweiligen benannten Bereichen gemessen
- Versetzungen können über die Ränder des Scrollports hinaus erfolgen
- Bereiche können beschränkt werden, wenn das Subjekt größer ist als der Scrollport
Gemessen vom Start der Bereichsrand
Da die Versetzungsposition immer relativ zum Start des Deklarationsanimationsbereichs ist, erfolgt der Start der Animation für alle drei Elemente, wenn die Startkante der Elemente den Punkt überquert, der 60px vom Start des entry-Bereichs entfernt ist.
Der animation-range-end-Wert definiert die Position, an der die Animation endet. Der exit 75px-Wert bedeutet im Wesentlichen "wenn 75px des Subjekts über die Startkante des Scrollports hinausgegangen sind." Dies variiert für jedes Subjekt. Für das 50px Subjekt geschieht dies erst 25px nachdem es nicht mehr sichtbar ist. Das Ende des Animationsbereichs sowohl für das 250px als auch für das 500px Subjekt erfolgt, wenn ihre untere Endkante die obere, blaue Linie schneidet; 75 Pixel von der Endkante des Scrollports. Warum sind ihre Endversetzungen gleich? Wegen der Beschränkung! Die maximale Größe des benannten Animationsbereichs wird auf die Größe des Scrollports beschränkt. Der exit-Bereich ist für beide Subjekte gleich, also sind die Bereichsendversatzpunkte gleich.
Über die Ränder des Scrollports hinaus
Für unser 50px hohes Subjekt ist der exit-Bereich 50px hoch und grenzt an die Startkante des Scrollports. Das Setzen von animation-range-end: exit 75px für jedes Element, das weniger als 75px hoch ist, bedeutet, dass das Ende des Bereichs außerhalb des Scrollports liegt, da der Punkt 75px vom Start des exit-Bereichs über die Startkante des Scrollports hinausgeht. In unserem Beispiel erfolgt das Ende des Animationsbereichs für das 50px hohe Subjekt, wenn die Startkante des Subjekts 75px jenseits der Startkante des Scrollports ist. Die Animation endet, erreicht den to-Keyframe und das animationend-Ereignis, nur wenn (und falls) das Element 25px aus dem Bildschirm gescrollt wird.
Die Animation endet auch dann, wenn das Animationsbereichsende außerhalb des Scrollports liegt, solange es möglich ist, bis zu diesem Punkt zu scrollen. Hätten wir animation-range-end: exit 250px gesetzt, hätte die Animation geendet, wenn die Endkante der mittleren und großen Subjekte den Scrollport an der Startkante des Containers verlassen hätte.
Mit dem Ende auf exit 250px gesetzt, könnte die Animation des kleinen Subjekts möglicherweise nicht enden, da möglicherweise nicht 450px Inhalt nach dem Subjekt vorhanden sind, um beim Benutzer herunterzuscrollen, bevor der Endpunkt erreicht ist.
Auswirkungen der Beschränkung
Mit unserem 250px hohen Container, wenn das Subjekt 250px oder 500px hoch ist, ist der exit-Bereich so groß wie der Container, wobei der Start die Endkante des Scrollcontainers ist. Mit einer 75px-Versetzung erfolgt das Ende der Animation, wenn die Endkante des Subjekts 75px von der Endkante des Scrollcontainers entfernt ist (angezeigt durch die obere, rote Linie).
Da die Versetzungsposition immer relativ zum Start des benannten oder standardmäßigen Animationsbereichs ist, beeinflusst in unserem Beispiel die Beschränkung die animation-range-end des großen Subjekts. Wir setzen das Ende des Bereichs auf exit 75px, was 75px von der Startkante des exit-Bereichs entfernt ist. Wenn das Subjekt die gleiche Größe wie der Scrollport hat (unser 250px Subjekt) oder größer (unser 500px Subjekt) ist, liegt das Animationsbereichsende 75px von der Endkante des Scrollports entfernt, was 75px vom Start des scrollport-begrenzten exit-Bereichs entfernt ist.
Negative Längen
Bis zu diesem Punkt sind alle Versetzungen größer als null gewesen. Es ist wichtig zu beachten, dass negative Längen gültig sind. Eine negative Versetzung auf dem animation-range-start verlängert den Bereich, während eine negative Versetzung auf dem animation-range-end den Bereich verkürzt.
Vergleichen wir die negativen Einbettungen mit den 0-Werten:
#A {
animation-range-start: contain -25px;
animation-range-end: exit -25px;
}
#B {
animation-range-start: contain 0;
animation-range-end: exit 0;
}
Der erste Animationsbereich ist 25px zur Endkante des Containers hin versetzt.
Einbetten mit Prozentwerten
Wie Längenwerte definieren Prozentwerte Versetzungen vom Start des Animationsanbindungsbereichs. Die Prozentangaben beziehen sich auf die Dimension des Timelinerahmens, nicht auf den Scrollport. Aus diesem Grund sind Prozentwerte für die meisten Menschen nicht so intuitiv wie Längenwerte (was überraschend ist, da Längenwerte bisher auch nicht so intuitiv waren).
Hier verwenden wir animation-range-start und animation-range-end, um die Animationstimeline einzubetten. Auch wenn wir dieselben Eigenschaften verwenden, setzen wir <percentage>-Werte anstelle von <length>-Werten:
.animated_element {
animation-range-start: 20%;
animation-range-end: 60%;
}
Dies definiert das aktive Intervall so, dass es 20% vom Startbereich der Standardanbindung beginnt und 60% durch denselben Bereich endet. Der Standard-normal-Animationsanbindungsbereich, der sich wie cover verhält, ist die Höhe des Scrollcontainers plus die Höhe des Subjekts, was bedeutet, dass sich der Bereich je nach gewähltem Radioknopf unterscheidet.
Zur Veranschaulichung gibt es zwei dunkle Linien, die den Container bei den 20%- und 60%-Punkten des vollständigen Animationsbereichs durchqueren. Die Animation beginnt, wenn die Block-Startkante die 20%-Marke erreicht, was die untere grüne Linie ist. Die Animation endet, wenn die Block-Startkante 60% des normalen Bereichs erreicht hat, was die obere rote Linie ist.
Nur wenn das Element 50px hoch ist, ist der obere Teil des Subjekts noch im Scrollport, wenn das Ende der Animation erreicht ist; es gibt keine oberen roten Linien, wenn 250px oder 500px ausgewählt sind, da das Ende des Animationsbereichs außerhalb des Scrollports liegt.
Basierend auf der Höhe unserer Subjekte ist die 20%-Marke entweder 60px, 100px oder 150px von der Endkante des Scrollports entfernt (markiert durch die grüne Linie, die sich immer im Scrollport befindet), und die 60%-Marke ist 180px, 300px oder 450px vom selben Punkt entfernt (markiert mit einer roten Linie, aber nur sichtbar für das 50px große Subjekt).
Zur Veranschaulichung gibt es zwei hellgraue Linien, die den Container 20% und 60% des Scrollports durchqueren, was 50px und 150px vom unteren Rand des Scrollports entfernt ist. Da sich die animation-range-*-Prozentsätze auf den Timelinerahmen beziehen und nicht auf den Scrollport, zeigen diese Linien nur, wie die Prozentsätze nicht übereinstimmen. Wir haben auch zwei horizontale hellgraue Linien hinzugefügt, die durch jedes Subjekt an ihren eigenen 20%- und 60%-Marken gehen. Diese Linien stimmen mit den hellgrauen Linien des Scrollports überein, wenn die Animation jedes Subjekts beginnt und endet.
Das folgende Bild zeigt, wo sich die Subjektelemente befinden, wenn die Animation beginnt (der 0%-Keyframe) und endet (der 100%-Keyframe).
Dieses Bild enthält die Einbettungen aus der vorherigen Demontration und die Timeline ohne Einbettungen zum Vergleich.
Wie zuvor repräsentiert das Gelbe die Position des Elements, wenn der from-Keyframe angewendet wird, das Rote die Position, wenn der to-Keyframe angewendet wird, und das Graue den Scrollport. Die gestreiften Bereiche sind die Bereiche, in denen die Rot- und Gelbelementdarstellungen sich überlappen. Zu Illustrationszwecken haben wir schwarze horizontale gestrichelte Linien 20% und 60% durch den Scrollport hinzugefügt, ausgehend vom Boden.
Die Animation beginnt erst, wenn das Element die 20%-Marke entlang des Animationsanbindungsbereichs erreicht. Dieser Punkt ist 60px, 100px oder 150px von der unteren Kante des Scrollports entfernt, abhängig von der Größe des Elements. Die Position des Subjektelements zu diesem Zeitpunkt, welche die Position des Elements bei Anwendung des from oder 0% Keyframe darstellt, ist in Gelb dargestellt.
Das Rote repräsentiert die Position des animierten Elements relativ zum Scrollport, wenn der to oder 100% Keyframe angewendet wird, was das Ende der Animation ist. Dieser Punkt ist entweder 180px, 300px oder 450px von der unteren Kante des Scrollports entfernt, je nach Subjektgröße. Die Animation erfolgt, wenn das Element sich zwischen den to- und den from-Positionen bewegt.
Sie haben möglicherweise etwas Interessantes an den gestrichelten horizontalen Linien bemerkt: Wenn die Animation beginnt, ist die Linie, die 20% von der Endkante der Aussichtsport entfernt ist, 20% vom oberen Teil des Subjekts entfernt, und die Linie, die 60% von der Endkante der Aussichtsport entfernt ist, ist 60% vom oberen Teil des Subjekts entfernt, wenn die Animation endet. Dies wurde durch die sehr hellgrauen Linien im Live-Demo zu diesem Beispiel veranschaulicht.
Subjektgröße zählt
Wie wir gesehen haben, als wir die Einbettungen mit Längen setzten, kann die Größe des Subjekts einen Unterschied machen. Beim Festlegen von Animationsbereichen beziehen sich Prozentwerte auf die Größe des Animationsanbindungsbereichs, nicht auf den Scrollport. Bei den meisten benannten Bereichen hängt die Größe des Anbindungsbereichs teilweise von der Größe des Subjekts ab. Da sich die Prozentsätze auf die Größe des Bereichs beziehen, wirkt sich der benannte Bereich auf die aufgelöste Größe der Einbettungen aus. Abhängig vom Namen kann sich auch die Startposition ändern, was sich auf die Lage des Bereichs und damit auf die Lage der Fortschrittspunkte auswirken kann.
In diesem Beispiel definieren wir einen aktiven Bereich, der 40% der Größe des Subjekts ist:
.animated_element {
animation-range-start: exit-crossing -20%;
animation-range-end: exit-crossing 20%;
}
Die Animation dauert 40% des Animationsanbindungsbereichs. Wenn Sie scrollen, stellen Sie fest, dass je größer das Subjekt ist, desto länger der Bereich ist. Mit exit-crossing wird der Animationsbereich nicht zugeschnitten; er ist so groß wie das Subjekt, selbst wenn das Subjekt größer als der Ansicht ist, wobei der Bereich an die Startkante des Scrollports grenzt und über die Endkante hinausgeht, wenn das Subjekt größer als der Scrollport ist.
Mit den -20%- und 20%-Einbettungen, wird die Animation des 50px-Subjekts über 20px: Die Animation beginnt, wenn das Ende des Subjekts -10px vom Bereichsstart entfernt ist, oder 60px vom Austreten des Bildschirms entfernt ist, und endet, wenn das Ende des Subjekts 40px vom Austreten des Bildschirms entfernt ist. Das mittlere Subjekt animiert über 100px: Die Animation beginnt, wenn das Ende des Subjekts -50px vom Bereichsstart entfernt ist, was 50px über die Endkante des Scrollports hinaus entspricht, und endet, wenn das Ende des Subjekts 50px in den Scrollport reicht. Das große Subjekt animiert über 200px, beginnend, wenn der Boden 600px von der Startkante des Containers entfernt ist, mit nur 150px in Sicht, und endet, wenn der Boden 400px von dieser Startkante entfernt ist, wenn 100px aus der Startkante gescrollt haben.
Prozentsätze relativ zum Scrollport
Wenn es darum geht, mit Prozentsätzen zu versetzen, ist der am wenigsten komplizierte benannte Timelinenamensbereich contain. Bei contain ist der Animationsbereich so groß wie der Scrollport, was bedeutet, dass die Start- und Endprozentsätze relativ zum Scrollport sind. Aus diesem Grund möchten Sie bei Verwendung von Einbettungen möglicherweise contain verwenden, anstatt den Bereich standardmäßig lassen und zu cover auflösen.
Der contain-Bereich enthält die Animation vollständig innerhalb des Scrollports. Er stellt den Bereich dar, während sich die hauptsächliche Box entweder vollständig innerhalb der, oder vollständig über seiner Sichtbarkeitsbereich innerhalb der Ansicht erstreckt. Mit contain, wenn das Subjekt die gleiche Größe oder kleiner als der Ansicht hat, kann es vollständig sichtbar sein. Wenn das Element die gleiche Größe wie der Container hat, befindet sich jedoch die Animation über 0px. Dies bedeutet, dass es ausgeführt wird, aber es ist für den Benutzer nicht sichtbar.
Mit anderen Worten, ohne die Größe des Containers oder der Subjekte zu kennen, können wir unsere Animation auf die Mitte des Scrollports beschränken, obwohl die Animation über 0px erfolgt, wenn das Subjekt die gleiche Größe wie der Scrollport hat.
.animated_element {
animation-range-start: contain 25%;
animation-range-end: contain 75%;
}
Die horizontalen Linien markieren die mittlere Hälfte des Scrollports und die mittlere Hälfte jedes Subjekts.