Der folgende Beitrag ist ein Gastbeitrag von Michał Sajnóg, einem Front-End-Entwickler bei Netguru. Michał hat eine dieser Bibliotheken erstellt, die Animationen auslösen, wenn Sie zu einem bestimmten Punkt scrollen. Eines, das ich daran mag, ist, dass es so viel wie möglich an CSS überlässt, um die Animationen selbst zu erstellen und zu steuern. Ganz zu schweigen davon, dass es sich bewährt hat, indem es auf einer Reihe von Produktionsseiten gut funktioniert hat. Ich überlasse Michał das Wort.
Haben Sie schon einmal diese langen Webseiten gesehen, auf denen beim Scrollen nach unten verschiedene Animationen angewendet werden? Ich möchte Ihnen ein Plugin vorstellen, das ich geschrieben habe und das es sehr einfach macht, alle Arten von Animationen mit voller CSS-Kontrolle und ohne Aufwand zu handhaben.
Wenn Sie sofort loslegen möchten, ist der Code auf GitHub.
Das Problem mit anderen Bibliotheken
In meinem früheren Unternehmen haben wir WOW.js (oder ähnliche Bibliotheken) verwendet, um Elemente beim Scrollen zu animieren. Für einfache Projekte war es ganz nett, aber bei größeren Websites wollten wir mehr Kontrolle darüber haben, was tatsächlich passiert. In allen beliebten Bibliotheken wurden Animationen vollständig von JavaScript gehandhabt, indem Inline-CSS eingefügt wurde. Arghgh! Inline-Stile sind böse. Sie sind schwer zu kontrollieren und zu überschreiben. Obwohl es in einigen Fällen in Ordnung ist, sie mit JavaScript zu setzen, ist es immer noch viel sauberer, sie dort zu belassen, wo sie hingehören, und alle CSS-bezogenen Dinge in der CSS-Datei zu handhaben.
Ich habe beschlossen, eine Bibliothek mit einem klaren Ziel zu erstellen: die Position von Elementen erkennen und dann entsprechende Klassen hinzufügen, wenn sie im Viewport erscheinen.
Animationen komplett in CSS steuern
Ich wollte die Verantwortlichkeiten mit meiner neuen Bibliothek aufteilen
- Die gesamte Logik im JavaScript
- Alle Animationen im CSS
Dies ermöglicht es Ihnen, Ihre eigenen Animationen einfach hinzuzufügen und Dinge wie die Änderung dieser entsprechend dem Viewport zu tun.
Wie AOS funktioniert
Die Idee hinter AOS ist einfach: Alle Elemente und ihre Positionen basierend auf den von Ihnen vorgegebenen Einstellungen beobachten. Dann die Klasse aos-animate hinzufügen/entfernen. Natürlich ist es in der Praxis nicht immer so einfach, aber die Idee hinter AOS ist so simpel. Jeder Aspekt der Animation wird von CSS gehandhabt.
Beispielanimationen in CSS
Es gibt viele verschiedene Animationen, die sofort einsatzbereit sind, aber das Erstellen neuer ist ebenfalls einfach. Hier ist ein Beispiel
[aos="fade"] {
opacity: 0;
transition-property: opacity;
}
[aos="fade"].aos-animate {
opacity: 1;
}
Sie müssen sich keine Gedanken über Dauer oder Verzögerung machen. In CSS setzen Sie nur
- Stile für das Attribut
aosmit dem Namen Ihrer Animation - Setzen Sie
transition-property(standardmäßig ist diesall, sodass es performanter und vorhersagbarer ist, wenn Sie die Übergänge auf die beabsichtigten Eigenschaften einschränken) - Fügen Sie die Post-Transition-Eigenschaften bei
.aos-animatehinzu
Dinge wie Dauer/Verzögerung/Easing werden unabhängig von der Animation gesetzt.
Beispiel-HTML
<div class="some-item" aos="fade">Example Element</div>
oder mit einer anderen Übergangsdauer
<div class="some-item" aos="fade" aos-duration="500">Example Element</div>
**Tipp:** Sie können data-aos anstelle von aos verwenden, um Ihr HTML ordnungsgemäß zu validieren.
Live-Demos
Mit verschiedenen Animationen
Sehen Sie sich den Pen AOS – Animationen von Snik (@michalsnik) auf CodePen an.
Mit verwendeter Anker-Einstellung
Sehen Sie sich den Pen AOS – Anker von Snik (@michalsnik) auf CodePen an.
Mit Ankerplatzierung und unterschiedlichem Easing
Sehen Sie sich den Pen AOS – Anker & Ankerplatzierung von Snik (@michalsnik) auf CodePen an.
Mit einfachen benutzerdefinierten Animationen
Sehen Sie sich den Pen AOS – benutzerdefinierte Animationen von Snik (@michalsnik) auf CodePen an.
Zusätzliche Funktionen
- Anker – Animieren Sie ein Element basierend auf der Position eines anderen Elements
- Ankerplatzierung – Animieren Sie ein Element basierend auf seiner Position auf dem Bildschirm. Es muss nicht nur animiert werden, wenn es im Viewport erscheint, sondern zum Beispiel, wenn der untere Teil des Elements die Mitte des Bildschirms erreicht
- Beidseitige Animationen – Standardmäßig werden Elemente beim Scrollen nach oben und unten animiert, aber Sie können sie zwingen, nur einmal zu animieren
- Einfache Deaktivierung – Deaktivieren Sie Animationen auf Mobilgeräten mit vordefinierten Optionen wie
mobile,phone,tabletoder mit einer benutzerdefinierten Bedingung/Funktion - Async-fähig – Berechnet die Positionen von Elementen bei DOM-Änderungen neu, sodass Sie nach dem Laden von etwas über Ajax keine Sorgen haben müssen (es sei denn, Sie unterstützen IE9, da Mutation Observer benötigt wird)
- Keine Abhängigkeiten – Diese Bibliothek ist in reinem JS geschrieben und hat keine Abhängigkeiten
AOS ist vollständig Open Source, wenn Sie also eine interessante Idee haben oder etwas nicht so funktioniert, wie Sie es erwarten, öffnen Sie ein Issue und sehen Sie sich auf GitHub! Jeder Beitrag wird sehr geschätzt.
Dieses Plugin scheint so einfach zu bedienen zu sein, ich freue mich sehr, es entdeckt zu haben!
Ich freue mich, das zu hören :)
Ich kann das aus irgendeinem Grund nicht zum Laufen bringen. Ich verwende die CDN-Versionen und folge den Git-Setup-Anweisungen, und nichts funktioniert für mich. Irgendwelche Ideen, wo ich falsch liegen könnte?
Ich mag alle Standardanimationen, mit denen es geliefert wird, aber ich bevorzuge immer noch jlmakes’ 3,3 KiB scrollreveal.js: https://github.com/jlmakes/scrollreveal.js
Scroll Reveal ist auch eine großartige Bibliothek – keine Frage. AOS bietet ähnliche Funktionen, aber auf eine etwas andere Weise und gibt Ihnen mehr Kontrolle über die Animationen.
Die neueste Version von Chrome (51) enthält eine neue API namens "IntersectionObserver", die erkennt, wann Elemente in die Ansicht gelangen ("Schnittmenge bilden").
Sie ist derzeit nur in Chrome verfügbar, aber da Chrome der beliebteste Browser ist und die meisten Benutzer innerhalb kurzer Zeit sehr schnell auf die neueste Version aktualisiert werden, ist sie bereits weit verbreitet.
Vielen Dank für Ihren Beitrag. Es ist eine wirklich nette und sehr vielversprechende Funktion, aber ich möchte mehr Browser unterstützen und lasse es im Moment lieber so, es wurde getestet und scheint browserübergreifend gut zu funktionieren.
Dieses Plugin ist großartig! Ich frage mich, ob es besser wäre, die Funktion zu haben, die den Effekt nur einmal auslöst?
Dieses Plugin ist großartig! Ich frage mich, ob es besser wäre, die Funktion zu haben, die den Effekt nur einmal auslöst?**
Danke! Sie können die Option once beim Initialisieren von AOS setzen oder aos-once="true" für ein bestimmtes Element festlegen, und es wird dann nur einmal animiert :)
@pmeriton Danke! Sie können die
once-Option beim Initialisieren von AOS setzen oderaos-once="true"für ein bestimmtes Element festlegen, und es wird dann nur einmal animiert :)@Ben Es ist eine sehr schöne Funktion, aber ich möchte mehr Browser unterstützen und lasse es im Moment lieber so.
Wenn Ihnen HTML5-Gültigkeit am Herzen liegt (Google tut es...), sollten Sie alle benutzerdefinierten Attribute mit "data-" präfixieren.
Hallo Phil, Sie können entweder
aosoderdata-aosverwenden, beide Versionen funktionieren. Mein Freund hat diese Funktion vor einiger Zeit zu AOS hinzugefügt.Nun, dann erziehen Sie zu korrektem HTML und verwenden Sie die Version mit dem "data-"-Präfix. Wenn Sie mich fragen, sollte die andere gar nicht existieren.
Wenn ich data-aos (statt nur aos) auf Elementen verwende, die bereits beim Laden sichtbar sind, werden diese Elemente nicht animiert. Fühlt sich wie ein kleiner Bug an.
@Moo Ich werde das berücksichtigen, aber das wäre eine größere Änderung, da sie die Abwärtskompatibilität brechen würde.
@toni Es klingt tatsächlich nach einem Bug. Wenn Sie etwas finden, können Sie gerne dazu beitragen und ein Issue auf GitHub erstellen :) Dann ist es viel einfacher, weitere Änderungen und bestehende Probleme zu verfolgen.
Hey, das ist eine großartige Bibliothek,
Kann diese Bibliothek verwendet werden, um Parallax-Bild-Scrolling zu erstellen? Gibt es ein Beispiel?
Leider nein, dieses Plugin dient nicht diesem Zweck. Wenn Sie jedoch darauf bestehen, können Sie einige Anker auf Hintergrundelementen setzen und bestimmte Animationen wie Transformationen mit längerer Dauer auslösen und so einen Art Parallax-Effekt erzielen, aber das ist wahrscheinlich nicht die beste Lösung.
Für Parallax können Sie https://dixonandmoe.com/rellax/ ausprobieren. Es sieht nach einer interessanten Bibliothek aus und könnte Ihren Bedürfnissen entsprechen :)
Das ist großartig, danke! Ich benutze ScrollReveal schon eine Weile und suche nach einem reibungslosen, einfachen Ersatz. Das könnte es sein.
Eine Funktion, die ScrollReveal hat und die eine großartige Ergänzung hier wäre, ist die Distanz – wie weit ein Element während seiner Animation von A nach B reist. Würde das gerne, wenn möglich, hinzugefügt haben.
Ich freue mich darauf, es zu verwenden!
Danke @Daniel, ich freue mich, dass es dir gefällt.
Es ist eine interessante Funktion, ich würde sie gerne auf GitHub diskutieren. Fühlen Sie sich frei, ein Issue zu erstellen, wenn Sie eine Idee haben, es ist immer gut zu sehen, was andere Leute über mögliche Funktionen zu sagen haben :)
Heilige Scheiße… Ich mache gerade eine Website, die Animationen beim Scrollen mit sichtbaren Effekten benötigt. Super!
Habe mir die Demo http://michalsnik.github.io/aos/ auf einem Desktop-Bildschirm angesehen und die Dinge funktionieren gut, wenn sie so funktionieren sollen, wie sie funktionieren. Bin mir nicht ganz sicher, ob ich die volle Erklärung verstehe, da ich dies in FF 28 getestet habe.
Wäre es sinnvoll, dies überhaupt mit Velocity.js zu mischen? Ich meine, die Animationen leichtgängiger zu machen, indem man die Easing-Funktionen mit Velocity austauscht. Macht das überhaupt Sinn?
Eine weitere Sache, die mir aufgefallen ist. Wenn ich den Browser auf die Breite eines Smartphones verkleinere, sind die Animationen fast immer nur am oberen Rand des Viewports sichtbar.
Wenn ich zum Abschnitt "Zoom" scrolle, gibt es im schmalen Bereich überhaupt keine Animation. Vielleicht wäre es eine Sache, um die Demo noch großartiger zu machen, die Demo responsiv zu gestalten, d. h. auf einem schmalen Viewport (Porträt-Smartphone) eine einzelne Spalte von Animationen zu haben, die schön in der Mitte der Spalte zu sehen sind, anstatt dessen, was Sie jetzt haben, was denken Sie? So können Benutzer sehen, wie gut das auf dem Handy funktioniert, etwas, das ich heutzutage für wichtig halte.
Glückwunsch zur sonstigen guten Arbeit. Arbeite gerade an einem One-Page-Layout für einen Kunden und das könnte sehr nützlich sein.
Vielen Dank.
Hallo, Sie haben absolut Recht. Ich muss an dieser Demo arbeiten und sie responsiv machen, hoffentlich finde ich am Wochenende etwas Zeit :)
Es besteht die Möglichkeit, dass Sie auf Probleme gestoßen sind, als Sie das Fenster vergrößert haben, da es ein Problem gab, das ich heute behoben habe und es sollte jetzt besser funktionieren.
Was Velocity.js angeht – das ist eher nicht der Weg, den ich mit dieser Bibliothek gehen möchte. Der gesamte Animationsanteil wird in CSS gehandhabt, daher ist das Verschieben von Easings in JavaScript genau das Gegenteil von dem, was ich mit dieser Bibliothek erreichen wollte. Ich hoffe, Sie verstehen meinen Standpunkt :)
Kürzlich kam jedoch die Idee auf, die Unterstützung für die Animate.css-Bibliothek hinzuzufügen, und das ist etwas, über das ich nachdenken werde.
Viel Spaß und bis bald auf GitHub!
Nette Sache, das ist genau das, was ich brauchte.
Waaaa! Ich habe danach gesucht! WoW ist großartig, aber ein bisschen zu einfach… Ich habe früher mit superscrollorama gearbeitet… aber zu komplex und veraltet..
Vielen Dank, ich werde es definitiv benutzen! Tolle Arbeit!
Danke John, das weiß ich sehr zu schätzen :)
Gute Arbeit. Wir benutzen wow.js schon eine Weile, aber es hat sich immer etwas unappetitlich angefühlt, die Stilregeln inline einzufügen. Ich habe mir kurz den Quellcode-JS auf GitHub angesehen – glaubst du, dass die Verwendung von Hardware-Beschleunigung oder der Eigenschaft
will-changehelfen könnte? Referenz: https://dev.opera.com/articles/css-will-change-property/Hallo Bob, danke, dass du darauf aufmerksam gemacht hast. Ich habe das bereits auf meiner Roadmap und werde es bald ausprobieren, um zu sehen, ob es die Leistung in modernen Browsern in diesem Fall tatsächlich verbessert. Bleiben Sie dran
Großartige Ressource, ich habe sie bereits in einem meiner neuesten Projekte implementiert und es fühlt sich großartig an. Ich bin jedoch auf einen nervigen Bug gestoßen. Auf Mobilgeräten verursachen die Animationen einen Overflow-X, wodurch eine weiße Lücke auf der rechten Seite entsteht. Gibt es eine Möglichkeit, Animationen speziell auf Mobilgeräten zu deaktivieren?
Vielen Dank im Voraus.
Hey,
Danke! Sie könnten
overflow-x: hiddenaufbodysetzen und das sollte dieses Problem beheben.Wenn Sie dieses Plugin jedoch auf Mobilgeräten deaktivieren möchten, können Sie die Einstellung
disablebei der Initialisierung festlegen, wie folgt:mobile– deaktiviert AOS auf Tablets und Handysphone– deaktiviert AOS auf Handystablet– deaktiviert AOS auf TabletsSie können auch anstelle eines der vordefinierten Strings eine Variable verwenden oder sogar Ihre eigene Funktion übergeben :)
Ich hoffe, das ist hilfreich!
Hallo!
Ich liebe dein Plugin wirklich, es ist super einfach und super benutzbar. Ich habe nur eine Frage: Gibt es eine Möglichkeit, die Länge der Bewegung der Elemente während des Fades einzustellen?
Vielen Dank!
Gute Arbeit! Danke :)
Sieht großartig aus Michal, ich freue mich darauf, es in einigen neuen Projekten auszuprobieren. Danke!
Ich bin froh, diese Bibliothek entdeckt zu haben. Vielen Dank, dass Sie sie zur Verfügung gestellt haben. Frage: Könnte man diese Bibliothek möglicherweise in WordPress verwenden? Wenn ja, haben Sie Empfehlungen oder Tipps?
Vielen Dank im Voraus.