Der folgende Beitrag wurde von Julian Shapiro verfasst. Julian hat kürzlich Velocity.js veröffentlicht, einen performanteren Ersatz für jQuerys .animate(). Er hat kürzlich darüber geschrieben, wie JavaScript-Animationen so schnell sein können, auf dem Blog von David Walsh, ein Thema, das wir hier ebenfalls behandelt haben. In diesem Artikel stellt Julian Velocity.js selbst vor.
Velocity.js ist ein jQuery-Plugin, das die $.animate()-Funktion von jQuery neu implementiert, um eine deutlich höhere Leistung zu erzielen (wodurch Velocity in vielen Fällen auch schneller als CSS-Übergänge ist) und gleichzeitig mehrere neue Funktionen zur Verbesserung des Animations-Workflows bietet.
Mit nur 7 KB (gezippt) enthält Velocity alle Funktionen von $.animate() und packt zusätzlich noch Transform-Animationen, Schleifen, Klassen-Animationen und Scrolling hinein. Kurz gesagt, Velocity ist darauf ausgelegt, das Beste von jQuery, jQuery UI und CSS-Übergängen zu vereinen.
Velocity funktioniert überall – bis zurück zu IE8 und Android 2.3. Da die Syntax von Velocity mit der von $.animate() identisch ist, muss kein Code Ihrer Seite geändert werden.
Das Ziel von Velocity ist es, ein Vorreiter in Sachen DOM-Animationsleistung und Benutzerfreundlichkeit zu sein. Dieser Artikel konzentriert sich auf Letzteres. Um mehr über Ersteres zu erfahren, konsultieren Sie bitte die Leistungsvergleiche von Velocity auf VelocityJS.org. Insbesondere demonstriert dieser Artikel, wie Velocity zur Verbesserung Ihres UI-Animations-Workflows eingesetzt werden kann. In einem prägnanten Showdown werden acht Funktionen von Velocity mit ihren jQuery-Entsprechungen verglichen.
Wenn Sie der Meinung sind, dass Ihr aktueller UI-Workflow unübersichtlich, schlecht segregiert oder zu stark auf die breite Palette von Stilfunktionen von jQuery angewiesen ist, dann ist dieser Leitfaden für Sie.
Kurzer Überblick
Bevor wir uns in Velocity vertiefen, lassen Sie uns kurz die Grundlagen klären: Es ist anzumerken, dass sowohl $.animate() als auch $.velocity() eine flexible Optionssyntax unterstützen. Sie können Optionen als durch Kommas getrennte Werte übergeben oder ein eigenständiges Options-Objekt übergeben.
Hier ist ein Beispiel für die durch Kommas getrennte Syntax, bei der eine Ganzzahl als Dauer der Animation behandelt wird, ein String als Art der Animationseffekte (Easing) und eine Funktion als Callback (der nach Abschluss der Animation ausgelöst wird).
$div.animate(
{
opacity: 1
},
1000,
"linear",
function() {
alert("Done animating.");
}
);
Als Nächstes folgt ein Beispiel für die Objekt-Syntax.
$div.animate(
{
opacity: 1
},
{
duration: 1000,
easing: "linear",
complete: function() {
alert("Done animating!")
},
queue: "myQueue"
}
);
Neben saubererem Code bietet die Verwendung des Options-Objekts Zugriff auf zusätzliche Animationsparameter, die über die durch Kommas getrennte Syntax nicht spezifiziert werden können.
Ein Beispiel für eine solche Option, die von jQuery bereitgestellt wird, ist "queue". Velocity bietet ebenfalls die Queue-Option, und mehrere auf ein einziges Element angewendete Animationsaufrufe werden automatisch hintereinander in die Warteschlange gestellt.
Hier wird die Opazität eines Divs auf 1 für 1000 ms animiert und dann in den nächsten 1000 ms wieder auf 0 zurückgeführt.
$div
.animate({ opacity: 1 }, 1000)
.animate({ opacity: 0 }, 1000);
Nachdem die Grundlagen geklärt sind, beginnen wir nun mit dem Vergleich von Velocity mit jQuery.
Umkehren
Anstelle einer Eigenschaften-Map akzeptiert Velocity auch "reverse" als ersten Parameter. Reverse animiert das Ziel-Element zu seinen Werten vor dem vorherigen Velocity-Aufruf.
In jQuery wäre das so:
$div
/* Fade an element in while sliding it into view. */
.animate({ opacity: 1, top: "50%" })
/* The values below are what we originally set the element to in our stylesheet. Animate back to them. */
.animate({ opacity: 0, top: "-25%" });
In Velocity ist es einfacher, da es nicht nur weniger Code ist, sondern Sie auch keine Werte aus Ihrer Stylesheet wiederholen müssen.
$div
.velocity({ opacity: 1, top: "50%" })
.velocity("reverse");
Standardmäßig verwendet der Reverse-Befehl von Velocity dieselben Optionen, die in den vorherigen Velocity-Aufruf übergeben wurden. Diese Optionen können durch Übergabe neuer Optionen in den "reverse"-Aufruf erweitert werden. Zum Beispiel:
$div
.velocity({ opacity: 1, top: "50%" }, 1000)
/* Animate back to the prior visual state at half the duration of the previous animation. */
.velocity("reverse", 500);
Scrolling
Eine beliebte UI-Technik ist es, den Browser so zu scrollen, dass er mit einem Element weiter unten auf der Seite ausgerichtet ist, und dann dieses Element mit aufmerksamkeitsstarken Effekten zu animieren. Dies mit jQuery umzusetzen, erfordert unübersichtlichen, nicht performanten Code.
In jQuery erfordert die Animation der scrollTop-Eigenschaft, dass Sie sowohl das html-Element als auch das body-Element ansprechen, damit die Animation in älteren Versionen von Internet Explorer funktioniert.
$("html, body").animate(
{
scrollTop: $div.offset().top
},
1000,
function() {
/* We use a callback to fade in the div once the browser has completed scrolling. */
$div.animate({ opacity: 1 });
}
);
In Velocity sprechen Sie das Element an, zu dem gescrollt werden soll.
$div
.velocity("scroll", 1000)
.velocity({ opacity: 1 });
Genau wie beim "reverse"-Befehl von Velocity kann "scroll" als erster Parameter von Velocity anstelle einer Eigenschaften-Map übergeben werden. Wie der Reverse-Befehl akzeptiert auch der Scroll-Befehl Animationsoptionen und kann an andere Aufrufe angehängt werden.
Das Verhalten des Scroll-Befehls ist unkompliziert: Scrollen Sie den Browser zum oberen Rand des Elements, auf das sich der Velocity-Aufruf bezieht.
Schleifen
Oft muss eine Animation eines Elements wiederholt werden. Beispiele hierfür sind das Schütteln einer Dialogbox, um ungültige Benutzereingaben anzuzeigen, oder das Aufleuchten eines Benachrichtigungs-Icons, um die Aufmerksamkeit des Benutzers zu erregen.
In jQuery bedeutet die Wiederholung einer Animation, dass Sie Ihre Animationslogik durcheinanderbringen, indem Sie Teile davon in eine for-Anweisung aufteilen.
for (var i = 0; i < 5; i++) {
$div
/* Slide the element up by 100px. */
.animate({ top: -100 })
/* Then animate back to the original value. */
.animate({ top: 0 });
}
In Velocity setzen Sie einfach die Loop-Option auf eine Ganzzahl, die der gewünschten Anzahl von Schleifenzyklen entspricht. Ein einzelner Schleifenzyklus besteht darin, zu den Werten in der Eigenschaften-Map zu animieren und dann zu den ursprünglichen Werten zurückzukehren.
$div.velocity(
{ top: -100 },
{ loop: 5 }
);
Elemente ausblenden
Oft werden Sie ein Element einblenden, dessen Anzeige-Eigenschaft ursprünglich auf none gesetzt war, sodass das Element beim Laden der Seite nicht sofort sichtbar war. Das anschließende Einblenden dieser Elemente erfordert mehrere Zeilen jQuery.
$div
/* Use jQuery's $.show() function to make the element visible by switching its display property to "block"/"inline" as appropriate. */
.show()
/* Set the element's starting opacity to 0 so that it can be gradually faded in by the subsequent animation call. */
.css("opacity", 0)
/* Fade in and slide into view. */
.animate({
opacity: 1,
top: "50%"
});
In Velocity übergeben Sie einfach display als Option. Die display-Option akzeptiert denselben Satz von Werten wie ihr CSS-Eigenschafts-Gegenstück (z. B. "block", "inline" und "none").
$div.velocity(
{
opacity: 1,
top: "50%"
},
{
display: "block"
}
);
Wenn die display-Option auf einen anderen Wert als none gesetzt ist, wird die display-Eigenschaft des Elements zu Beginn der Animation auf den angegebenen Wert gesetzt. Umgekehrt wird bei Übergabe von none an display die display-Eigenschaft am Ende der Animation gesetzt.
$div
/* Fade out and slide out of view. */
.animate({ opacity: 0, top: "-50%" })
/* Then set the display property to "none" via a queued $.fadeOut() call. */
.fadeOut(1);
$div.velocity(
{
opacity: 0,
top: "-50%"
},
{
display: "none"
}
);
Wenn außerdem die opacity eines Elements zu einem Wert ungleich Null animiert wird, während seine display-Option auf einen Wert ungleich none gesetzt ist, setzt Velocity die Start-opacity-Wert praktisch auf 0.
Verzögerung
Velocity akzeptiert eine delay-Option, die das Einfügen von $.delay()-Aufrufen in Ihren Animationscode überflüssig macht.
$div
.delay(1000)
.animate({
opacity: 1
});
$div.velocity(
{
opacity: 1
},
{
delay: 1000
}
);
Neben der Konsolidierung der Animationslogik in einem einzigen Aufruf ermöglicht die Verwendung der integrierten Verzögerungsoption von Velocity, dass Velocity verkettete Animationen optimieren kann, indem Werte zwischen ihnen zwischengespeichert werden.
Sequenzen
Eine für Velocity einzigartige Funktion sind Sequenzen, die Makros für Animationen sind: Eine Animationssequenz wird einmal erstellt und kann dann bei Bedarf auf Elemente auf allen Ihren Seiten ausgelöst werden.
Die Vorteile von Sequenzen umfassen:
- Benennung Ihrer Animationen für eine bessere Codeorganisation.
- Trennung der UI-Animationslogik von der UI-Interaktionslogik.
- Paketierung von Animationen zur gemeinsamen Nutzung über Ihre Projekte und mit anderen Entwicklern.
Sequenzen werden durch Erweiterung des $.Velocity.Sequences-Objekts erstellt. Sie werden danach ausgelöst, indem der Name der Sequenz als erster Argument von Velocity übergeben wird.
Unten sehen Sie eine einfache "Hover"-Sequenz.
$.Velocity.Sequences.hover = function (element, options) {
var duration = options.duration || 750;
$.Velocity.animate(element,
{
translateY: "-=10px",
}, {
/* Delay is relative to user-adjustable duration. */
delay: duration * 0.033,
duration: duration,
loop: 3,
easing: "easeInOutSine"
});
};
Jetzt können Sie sie auf ein Element anwenden.
$div.velocity("hover");
In der obigen Sequenz wird das Element dreimal um 10px nach oben und dann wieder nach unten verschoben (loop: 3) mit einer kurzen Zwischenverzögerung.
Um mehr über die Nuancen von Sequenzen zu erfahren, lesen Sie die Dokumentation dazu.
Velocity verwendet seine eigene Sequenzfunktion, um vordefinierte fadeIn-, fadeOut-, slideUp- und slideDown-Funktionen vorzupacken (die identisch mit ihren jQuery-Entsprechungen sind).
Zum Beispiel: Ein Container-Div per Slide-Effekt nach unten einblenden.
$div.velocity("slideDown", function() {
/* Then fade in its children over a duration of 1000ms. */
$children.velocity("fadeIn", 1000);
});
Erzwungene Hardware-Beschleunigung
Das Erzwingen der Hardware-Beschleunigung (HA) für ein Element ist eine einfache Möglichkeit, die Animationsleistung auf mobilen Geräten dramatisch zu verbessern. Die Aktivierung von HA wird traditionell durch Setzen der Transform-Eigenschaft eines Elements auf translateZ(0) erreicht.
$div
.css("transform", "translateZ(0)")
.animate({ opacity: 1 })
.css("transform", "none");
In Velocity wird HA auf mobilen Geräten automatisch angewendet (auf Desktops gibt es keinen Leistungsvorteil). Velocitys Kontrolle über HA ist hoch optimiert.
$div.velocity({ opacity: 1 });
Zusammenfassend
Der Zweck dieses Leitfadens war es, die Konsolidierung der Animationslogik in Ihrem Code durch Velocity zu demonstrieren. Kurz gesagt, Velocity ist ein ausdrucksstarkes und effizientes Werkzeug zur Erstellung von UI-Animationen.
Obwohl jQuery außerordentlich leistungsfähig ist, war es nie das Designziel von jQuery, als optimierte Animationsmaschine zu fungieren, und leidet entsprechend unter weniger als idealer Leistung und Arbeitsabläufen. Mit nur 7 KB im gezippten Zustand packt Velocity genügend Funktionen und Geschwindigkeitsgewinne, damit Sie es als Ihre bevorzugte Animationsmaschine in Betracht ziehen können.
Um die restlichen Funktionen von Velocity, einschließlich Farb- und Transformationsanimationen, zu erkunden, sehen Sie sich die Dokumentation von Velocity unter VelocityJS.org an.
Bevor wir zum Abschluss kommen, hier sind einige extreme Beispiele für Web-Animationen, die durch die Ausdrucksstärke und Geschwindigkeit von Velocity ermöglicht werden.
Super Sache. Bedeutet das, dass wir die
transition-CSS-Eigenschaft nicht mehr verwenden sollten?Hallo Mike! Gerechtfertigte Frage. Hier ist ein Auszug aus einem meiner Kommentare woanders:
„Meine Empfehlung ist, reine CSS-Übergänge zu verwenden, wenn Sie ausschließlich für Mobilgeräte entwickeln und Ihre Animationen ausschließlich aus einfachen Zustandsänderungen bestehen. In solchen Fällen sind Übergänge eine performante und native Lösung, die es Ihnen ermöglicht, die gesamte Animationslogik in Ihren Stylesheets zu belassen und das Aufblähen Ihrer Seite mit JavaScript-Bibliotheken zu vermeiden. Wenn Sie jedoch aufwendige UI-Akzente entwerfen oder eine App mit einer zustandsbasierten Benutzeroberfläche entwickeln, sollten Sie immer eine Animationsbibliothek verwenden, damit Ihre Animationen performant bleiben und Ihr Workflow überschaubar bleibt. Eine Bibliothek, die hervorragende Arbeit bei der Verwaltung von CSS-Übergängen leistet, ist Transit.“
Das ist eine fantastische, sofort nutzbare Zusammenfassung. Danke.
Besser als GSAP?
Ich bin mir nicht sicher.
Das ist nicht der Punkt. GSAP ist besser für z. B. Spiele, und Velocity ist für UI. Velocity ist einfach zu bedienen und vollständig Open Source (GSAP erfordert Lizenzgebühren). Mehr unter http://davidwalsh.name/css-js-animation
+1
Ich stimme Michal zu, GSAP ist eine Suite von Tools für geskriptete, hochperformante HTML5-Animationen, Spiele usw. Was mir an GSAP wirklich gefällt, ist seine Kompatibilität mit allen wichtigen Browsern. Ich beschäftige mich zwar nicht wirklich mit GSAP oder nutze es, aber die normale Syntax ist für mich in Ordnung.
Okay, Julian, du hast mein Interesse geweckt. Besonders gefällt mir, wie Velocity CSS-Animationen als Blaupause für die eigentliche JS-Transformation nutzen kann. Sehr raffiniert.
Vielen Dank, Ryan. Wenn Sie mit Velocity experimentieren und Fragen haben, bin ich jederzeit auf Twitter unter @Shapiro erreichbar.
VelocityJS ist nicht für komplexe Sequenzierung wie GSAP gebaut. Aber es sieht sehr gut für einfache Animationen aus :)
GSAP ist eine erstaunliche, vollwertige Animationssuite mit enormer Leistung.
Velocity konzentriert sich darauf, ein sehr schnelles Werkzeug zur Verbesserung der UI-Animationsleistung und des Workflows zu sein.
Ich bin verwirrt, warum es in diesem speziellen Fall von jQuery abhängt. Es scheint, dass
$.queueder Grund dafür ist.Ist die Implementierung von Promises (nativ oder über eine Bibliothek wie RSVP) zu kompliziert oder unmöglich für Sie, Julian?
Oder spart $.animate Ihnen VIEL Arbeit, indem das Plugin unabhängig von jQuery ist.
Hallo Kevin,
Betr. jQuery: Wir arbeiten gerade daran, die jQuery-Abhängigkeit zu entfernen – https://github.com/julianshapiro/velocity/issues/5. Es wird nicht schwierig sein. Ich habe Velocity so konzipiert, dass es nur minimal von jQuery abhängig ist.
Betr. Promises: Das ist eine absolut vernünftige Funktionserweiterung. Wären Sie daran interessiert, ein GitHub-Issue dafür zu erstellen?
Danke, Mann :)
Promises würden dies so mächtig machen.
Hallo, Julian
Ich sehe das jetzt erst; ich werde bis Ende des Tages ein Ticket erstellen (falls es noch nicht geschehen ist).
Sie können technisch gesehen die nativen Promises von JavaScript (ES6) verwenden, um die jQuery-Variante durch eine ordnungsgemäßere Implementierung mit
Promise.resolve()zu ersetzen.Jake 'The Great' Archibald hat vor einiger Zeit einen großartigen Artikel auf HTMl5Rocks dazu.
Hallo, Kevin! Danke für das Follow-up. Ja, bitte eröffnen Sie ein Issue.
Ich werde mir den HTML5Rocks-Artikel heute Nachmittag ansehen :)
Bezüglich des Loopings, hier ist der jQuery-Weg :)
Demo: http://jsfiddle.net/tovic/KzRcF/1/embedded/js,result,html,css
Das ist eigentlich nur iterative Ketten-Queueing – kein Looping :)
Aber es ist eine ziemlich coole Technik. Sehr sauber.
Ich denke, velocity.js ist besser für einfache Animationen, nicht für fortgeschrittene wie gsap.
Schönes Tutorial, danke Bro :)
Schauen Sie sich diese Bibliothek an: http://motorcortexjs.com/
Sie wurde auf Velocity.js aufgebaut. Mit MotorCortex.js können Sie alle Ihre Animationen über externe CSS-ähnliche Syntaxdateien definieren und nur Ereignisse über JavaScript auslösen, um sie zu starten.
Vollständige Logik – Trennung von Animation und Design.
Ich war sehr frustriert von Velocity. Ich kann
reversemit CSS-Skalierung nicht verwenden, dercomplete-Callback verwirrt irgendwie alles und lässt das Objekt weiter hüpfen. Und als ich das UI-Pack ausprobierte, wurde ich immer wieder mit der Meldung "First argument was not a property map, a known action, or a registered sequence. Aborting." konfrontiert. Es gibt keine Hinweise darauf, was ich verwenden soll, denn überall wird$elementsverwendet. Also vermutete ich, es sollte so etwas wie$(‘div’)sein, aber die Fehlermeldung wurde weiterhin angezeigt. Bei der Beschreibung und den einfachen Aktionen empfahl ich Velocity, aber jetzt bin ich mir nicht mehr sicher, ob Sie bei Bedarf Unterstützung finden.Ich habe viel Zeit damit verschwendet, herauszufinden, was passiert, aber es gibt keine Kommentare und keine Dokumentation, die das abdeckt.
Bitte ignorieren Sie den obigen Kommentar, es lag ein Problem mit der JavaScript-Reihenfolge vor. Wenn Sie dieselbe Fehlermeldung "First argument was not a property map, a known action, or a registered sequence. Aborting." erhalten, überprüfen Sie Ihre Skriptreihenfolge und stellen Sie sicher, dass das UI-Pack unter Velocity geladen wird.
Erstaunliches Plugin, das einzige Problem, das weiterhin besteht, ist das mit der Skalierung.
Hallo Lucas!
Ich schätze es, dass Sie Ihre Bedenken äußern :)
Um ehrlich zu sein: Wenn Sie neu in jQuery/JavaScript/Programmierung/Web-Animation sind und Fragen zu grundlegenden Implementierungsdetails haben, sollten Sie StackOverflow.com besuchen.
Wenn Sie diesen Weg bereits beschritten haben und glauben, auf einen tatsächlichen Fehler in Velocity gestoßen zu sein, gibt es einen sehr aktiven GitHub-Issue-Kanal, auf dem ich alle Fehlerberichte sehr begrüße: https://github.com/julianshapiro/velocity/issues?state=open. Ich habe eine gute Erfolgsbilanz darin, sie unglaublich schnell zu beheben :-p
Alles, was Sie tun müssen, ist, Ihren Fehler mit JSFiddle oder CodePen zu demonstrieren und dann ein neues Issue zu eröffnen, das den Unterschied zwischen dem von Ihnen erwarteten Verhalten und dem von Velocity tatsächlich ausgeführten Verhalten beschreibt. Das gilt für jedes Projekt auf GitHub. Kommen Sie dazu und beteiligen Sie sich an der Diskussion :)
Damit ist das geklärt: Nichts von dem, was Sie in Ihrem Kommentar oben berichtet haben, wurde von jemand anderem berichtet. (Und Tausende von Entwicklern nutzen Velocity.)
Darüber hinaus sind die von Ihnen beschriebenen Probleme vage, und es ist daher schwierig, Ihnen spezifische Hilfe zu geben. Trotzdem hier mein bester Versuch, auf Ihre Bedenken einzugehen:
1) Die Verwendung von reverse bei Skalierung funktioniert bei all meinen Tests einwandfrei. Wenn Sie ein JS Fiddle-Beispiel erstellen können, schaue ich es mir gerne genauer an!
2) Versuchen Sie Ihren
complete-Callback-Code mit jQuerys$.animate()anstelle von$.velocity(). Wenn der Fehler weiterhin besteht, liegt das Problem bei Ihrem eigenen Code.3) Für das UI-Pack haben Sie entweder die Datei nach Velocity nicht geladen oder Sie geben einen falschen Effektnamen ein.
4) Ich weiß nicht, was Sie am Ende mit
$(“div”).meinen.5) Betr. Dokumentation: Es gibt viel Dokumentation auf VelocityJS.org.
Nochmals, entschuldigen Sie meine Direktheit, wenn ich annehme, dass Sie ein Anfänger in Sachen JavaScript-Programmierung sind. Aber wenn jemand grob Fehler in seinem eigenen Code mit Fehlern in Velocity verwechselt, muss ich positiv antworten, damit die Leser die Qualität und Zuverlässigkeit von Velocity nicht falsch einschätzen :)
Ups. Ich habe gerade erst Ihren Folgekommentar gesehen :) Danke für die netten Worte. Betr. Skalierungsproblem: Lassen Sie es uns gemeinsam lösen. Ich bin da, wenn Sie ein Codebeispiel zusammenstellen möchten.
Hallo Julian, ich bin sehr zufrieden mit der Geschwindigkeit (ba dum tiss), mit der Sie mir geantwortet haben. Ich glaube, ich habe gerade mein Problem gefunden. Meine Buttons haben Übergänge für Hover. Wenn ich diese Übergänge entferne, funktioniert der Skalierungseffekt einwandfrei: http://jsfiddle.net/hspNd/
Es funktioniert auch auf meiner Website. Meine Frage ist also: Sollte ich in diesem Fall jQuery hover anstelle von CSS-Animationen verwenden?
Haha :-D
1) Richtig, Ihre CSS-Übergangsdeklarationen werden mit den Velocity-Animationen in Konflikt geraten.
2) Gute Nachricht. Es gibt eine einfache Lösung: Platzieren Sie einfach alle *-transition CSS-Stile innerhalb der Hover-Klasse selbst :)
Danke Julian! Jetzt funktioniert alles einwandfrei. Es tut mir leid, dass ich mich nicht über den richtigen Kanal gemeldet habe. Ich habe es getan, weil ich von Velocity wirklich begeistert war und frustriert wurde, aber jetzt bin ich mir sicher, dass dies mein Muss in meinem Bootstrap für zukünftige Projekte sein wird.
Großartig. Freut mich zu hören, Lucas. Keine Entschuldigung – kein Problem. Schauen Sie einfach bei SO/GitHub vorbei, wenn Sie Hilfe bei irgendetwas benötigen :)
Hallo Julian,
Das sieht ziemlich gut aus. Was ist Ihrer Meinung nach der Unterschied zu Transit? Ich bin etwas verwirrt.
Höhen-/Scrolländerungen sind auf Mobilgeräten immer noch etwas holprig (teste ein altes GS3 – gebe jetzt der Hardware die Schuld), aber besser als CSS3-Übergänge oder reines jQuery (obwohl das keine große Herausforderung ist (;). Ich mag die Funktionalität dieses Plugins wirklich – es ist perfekt für UI – und hat eine extrem kleine Dateigröße (ernsthaft, wie...)
Hallo Julian,
Ich möchte die Animation stoppen, nachdem sie einmal ausgeführt wurde. Wie kann ich das tun? Ich benutze Ihren Beispielcode.
Danke! Und ich schätze Ihre großartige Arbeit! :)