Im aktuellen Projekt müssen wir einen Effekt zum Sammeln von Punkten schaffen. Laut der Beschreibung des Chefs ähnelt dieser Effekt dem Sammeln von Energie im Alipay-Ameisenwald. Der Gesamteffekt besteht darin, dass mehrere integrale Elemente um den Baum herumschweben und wie funkelnde Sterne auf und ab gleiten. Nachdem Sie geklickt haben, um sie zu empfangen, gleiten sie entlang der Mitte des Baums und verschwinden. Die Energie des Baums nimmt allmählich zu und dehnt sich schließlich aus und wird etwas größer. 1. Allgemeines Denken Als erstes kommt einem dabei eine Grundstruktur in den Sinn, die von mehreren funkelnden kleinen Sternen halbkreisförmig umschlossen wird, die dann gleichzeitig auf die Erde fallen. Verwenden Sie CSS-Positionierung, Rahmenradius zum Zeichnen von Kreisen, Animationen und Klickaktionen zum Auslösen neuer Animationen. Der Punktinkrementeffekt ähnelt countUp.js, aber dieses Plug-In wird hier nicht verwendet und manuell implementiert. 1.1 Halbkreis-Umgebungseffekt Hierzu sind mathematische Kenntnisse erforderlich, die sich mit der Ermittlung des Bogenmaßes auf der Grundlage von Winkeln (Bogenmaß = Winkel * Pi/180) und der anschließenden Umwandlung in Koordinaten befassen, sodass die ganzzahligen Elemente das Gesamtintegral umgeben. Die Schlüsselcodes lauten wie folgt: dies.integral.forEach(i => { // Winkel in Bogenmaß umrechnen let angle = Math.PI / 180 * this.getRandomArbitrary(90, 270) // Koordinaten basierend auf dem Bogenmaß abrufen ix = xAxis + 100 * Math.sin(Winkel) iy = 100 + 100 * Math.cos(Winkel) // Bessel-Funktion i.timing = this.timeFun[parseInt(this.getRandomArbitrary(0, 3))] }) Beachten Sie, dass die Funktion getRandomArbitrary() darin besteht, eine Zufallszahl wie folgt zu erhalten: // Finde eine Zufallszahl zwischen zwei Zahlen getRandomArbitrary(min, max) { gibt Math.random() * (max - min) + min zurück; } timeFunc ist eine Reihe von Bessel-Funktionsnamen, um den Effekt eines integrierten Blinkens (Auf- und Abgleiten) zu erzielen. 1.2 Punkte blinken (nach oben und unten gleiten) Verwenden Sie CSS-Animationen, um die Punkte auf und ab gleiten zu lassen. Sie können sich dies beispielsweise mit transform: translateY(5px) vorstellen. Dabei bewegen Sie die Punkte eine bestimmte Distanz auf der Y-Achse und die Animation wird in einer Schleife abgespielt. Der Code lautet wie folgt: .foo { Anzeige: Flex; Schriftgröße: 10px; Elemente ausrichten: zentrieren; Inhalt ausrichten: zentriert; Breite: 30px; Höhe: 30px; Position: fest; oben: 0; links: 0; Animationsname: slideDown; /*Standard-Bessel-Funktion*/ Animations-Timing-Funktion: Ease-Out; /*Animationszeit*/ Animationsdauer: 1500ms; /*Wiedergabe einer Animationsschleife*/ Anzahl der Animationsiterationen: unendlich; -moz-box-shadow: -5px -5px 10px 3px rgb(277, 102, 63) Einschub; -webkit-box-shadow: -5px -5px 10px 3px rgb(277, 102, 63) Einschub; Boxschatten: -5px -5px 10px 3px rgb(277, 102, 63) Einschub; } /*Kleine integrale Blitze auf und ab*/ @keyframes slideDown { aus { transformieren: übersetzenY(0); } 50 % { transformieren: übersetzenY(5px); Hintergrundfarbe: RGB (255, 234, 170); } Zu { transformieren: übersetzenY(0); Hintergrund: RGB (255, 202, 168); } } Beachten Sie, dass ich zusätzlich zum Verschieben der Punkte nach oben und unten auch die Hintergrundfarbe entsprechend ändere. 1.3 Gesamtpunktzahl steigernder Effekt Nach dem Klicken zum Erhalten der Punkte werden die Gesamtpunkte akkumuliert. Dies ähnelt dem Effekt von countUp.js, aber dieses Plug-In kann hier für diese Funktion nicht verwendet werden. Das Projekt verwendet vue.js. Es ist leicht vorstellbar, dass man die Reaktionseigenschaften von Daten ändern kann, um die Zahlen zu ändern. Der Schlüssel liegt darin, die Änderung nicht auf einmal, sondern schrittweise vorzunehmen. Meine Idee hier ist Promise+setTimeout, also das Datenattribut einmal in einem bestimmten Zeitraum zu ändern, sodass es nicht so aussieht, als würde es sich plötzlich ändern. Damit der Animationseffekt flüssig aussieht, wird die Gesamtzeit (1500 Millisekunden) durch die Anzahl der kleinen Integrale geteilt, um einen Wert zu erhalten, der einem Schlüsselbild der Animation ähnelt. Dieser Wert wird als Anzahl der Änderungen verwendet und dann in einem bestimmten Intervall ausgeführt. Damit die Gesamtwirkung stimmig ist, sind alle Animationszeiten auf 1500 Millisekunden eingestellt. Die Schlüsselcodes lauten wie folgt: this.integralClass.fooClear = true dies.totalClass.totalAdd = true this.totalText = `${this.totalIntegral} Integral` let count = this.integral.length, timeoutID = null, tasks = [], totalTime = parseInt(1500 / Anzahl) const Ausgabe = (i) => neues Versprechen((Auflösung) => { timeoutID = setzeTimeout(() => { //Inkrementiere das Integral this.totalIntegral += this.integral[i].value // Ändern Sie die responsive Eigenschaft this.totalText = `${this.totalIntegral} Punkte` lösen(); }, Gesamtzeit * i); }) für (var i = 0; i < 5; i++) { Aufgaben.push(Ausgabe(i)); } Versprechen.alle(Aufgaben).dann(() => { Zeitüberschreitung löschen (Timeout-ID) }) 1.4 Kleine Punkte verschwinden, Gesamtpunkte wachsen Der letzte Schritt besteht darin, dass sich das kleine Integral in Richtung des Gesamtintegrals bewegt und verschwindet, und das Gesamtintegral sich ausdehnt. Das kleine Integral bewegt sich und verschwindet, die x-Achsenkoordinate bewegt sich zur x-Achsenkoordinate des Gesamtintegrals und die y-Achse bewegt sich zur y-Achsenkoordinate des Gesamtintegrals. Tatsächlich wird der Koordinatenpunkt derselbe wie das Gesamtintegral, sodass es so aussieht, als würde er sich in Richtung des Mittelpunkts bewegen. Wenn sich die Koordinaten aller kleinen Integrale hierher verschieben, können die Daten gelöscht werden. Die wichtigsten CSS sind wie folgt: .fooClear { Animationsname: ClearAway; Animations-Timing-Funktion: Ease-In-Out; Anzahl der Animationsiterationen: 1; Animationsfüllmodus: vorwärts; -Webkit-Animationsdauer: 1500 ms; -moz-Animationsdauer: 1500 ms; -o-Animationsdauer: 1500 ms; Animationsdauer: 1500ms; } /* Kleine Punkte löschen */ @keyframes löschen { Zu { oben: 150px; links: 207px; Deckkraft: 0; Sichtbarkeit: versteckt; Breite: 0; Höhe: 0; } } Die Gesamtpunktzahl wird erweitert. Meine Implementierungsidee hier ist transform: scale(1.5, 1.5);, das heißt, es wird auf der ursprünglichen Basis etwas größer und kehrt schließlich zur ursprünglichen Größe transform: scale(1, 1); zurück. Das Schlüssel-CSS lautet wie folgt: .totalAdd { Animationsname: Gesamtmaßstab; Animations-Timing-Funktion: Ease-In-Out; /*Die Animation wird nur einmal abgespielt*/ Anzahl der Animationsiterationen: 1; /*Die Animation bleibt beim letzten Keyframe*/ Animationsfüllmodus: vorwärts; -Webkit-Animationsdauer: 1500 ms; -moz-Animationsdauer: 1500 ms; -o-Animationsdauer: 1500 ms; Animationsdauer: 1500ms; } @keyframes totalScale { 50 % { transformieren: Skalierung(1,15, 1,15); -ms-transform:scale(1.15, 1.15); -moz-transform: Skala (1,15, 1,15); -webkit-transform: Maßstab(1,15, 1,15); -o-transform: Skala(1,15, 1,15); } Zu { transformieren: Skalierung(1, 1); -ms-transform:Skala(1, 1); -moz-transform: Skala(1, 1); -webkit-transform: Skala(1, 1); -o-transform: Skalierung(1, 1); } } An diesem Punkt ist die Logik der gesamten Animation geklärt. Lassen Sie uns zuerst eine Demo schreiben. Ich habe den Code auf GitHub gestellt, Punkteanimation. Die Wirkung ist wie folgt: 2. Im Projekt umsetzen Abschließend ist im Projekt noch ein Ajax Request enthalten, der Punkte sammeln soll. Ihr müsst nur noch die Animation in den erfolgreichen Callback dieses Ajax Requests einfügen und schon seid ihr fertig. Die wichtigsten JS-Codes lauten wie folgt: // Mit einem Klick Punkte erhalten aKeyReceive() { wenn (this.unreceivedIntegral.length === 0) { return bottomTip("Es wurden noch keine Punkte beansprucht") } wenn (diese.userInfo.memberAKeyGet) { let param = { Mitglieds-ID: this.userInfo.memberId, integralIds: this.unreceivedIntegral.map(u => u.id).join(","), integralerWert: this.unreceivedIntegral.reduce((acc, curr, index, arr) => { return acc + curr.value }, 0) } dies.$refs.resLoading.show(true) api.getAllChangeStatus(param).then(res => { let data = res.data wenn (Daten.Erfolg) { this.getRecordIntegralList() dies.playIntegralAnim() } anders { bottomTip(Daten.Nachricht) } }).schließlich(() => { dies.$refs.resLoading.show(false) }) } anders { dies.$refs.refPopTip.show() } }, // Animation zum Punktesammeln playIntegralAnim() { this.integralClass.fooClear = true dies.totalClass.totalAdd = true this.totalText = `${this.statisticsData.useValue} Punkte` let count = this.unreceivedIntegral.length, timeoutID = null, tasks = [], totalTime = parseInt(1500 / Anzahl) const Ausgabe = (i) => neues Versprechen((Auflösung) => { timeoutID = setzeTimeout(() => { this.statisticsData.useValue += this.unreceivedIntegral[i].value this.totalText = `${this.statisticsData.useValue} Punkte` lösen(); }, Gesamtzeit * i); }) für (sei i = 0; i < Anzahl; i++) { Aufgaben.push(Ausgabe(i)); } Versprechen.alle(Aufgaben).dann(() => { Zeitüberschreitung löschen (Timeout-ID) }) } Der endgültige Effekt nach dem Start des Projekts ist wie folgt: Beachten Sie, dass der Grund, warum die Seite hier blinkt, darin besteht, dass in der Ajax-Anforderung ein Ladezustand vorliegt. Wenn der Server absolut zuverlässig ist, ist dies tatsächlich entbehrlich. Zusammenfassen Damit ist dieser Artikel mit der ausführlichen Erläuterung der Idee, CSS-Animationen zum Erzielen des Punkteeffekts zu verwenden, abgeschlossen. Weitere relevante Inhalte zum Erzielen des Punkteeffekts mit CSS finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den verwandten Artikeln weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! |
<<: Detaillierte Erklärung der JavaScript-Funktion dieses Zeigeproblems
>>: Eine kurze Erläuterung zum Anpassen der Hostdatei in Docker
Das Verwendungsformat des mysqladmin-Tools ist: m...
Inhaltsverzeichnis 1. Was ist Javascript? 2. Was ...
1. Legen Sie den CORS-Antwortheader fest, um domä...
pt-Herzschlag Wenn die Datenbank zwischen Master ...
So installieren Sie MySQL 5.7.18 unter Linux 1. L...
Laden Sie zunächst die Zip-Archivversion von der ...
Inhaltsverzeichnis Überblick Einzelne Dateikompon...
1. Ändern Sie die Firewall-Einstellungen und öffn...
Inhaltsverzeichnis Der Unterschied zwischen Hash ...
Es gibt viele Artikel zur SSH-Serverkonfiguration...
1. Scroll-Ansicht Beim vertikalen Scrollen müssen...
Inhaltsverzeichnis 1. Routing-bezogene Objekte 2....
Wenn wir das Dialogfeld „Ordnereigenschaften“ in W...
Hintergrund Das Lösen von Browserkompatibilitätsp...
Unter Linux verwenden wir normalerweise den Befeh...