Detaillierte Erläuterung der Idee, mit CSS-Animation den Punkteeffekt zu erzielen

Detaillierte Erläuterung der Idee, mit CSS-Animation den Punkteeffekt zu erzielen

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

Artikel empfehlen

Zehn wichtige Fragen zum Erlernen der Grundlagen von Javascript

Inhaltsverzeichnis 1. Was ist Javascript? 2. Was ...

MySQL 5.7.19 neueste Binärinstallation

Laden Sie zunächst die Zip-Archivversion von der ...

So implementieren Sie eine einzelne Dateikomponente in JS

Inhaltsverzeichnis Überblick Einzelne Dateikompon...

So richten Sie ein Bereitstellungsprojekt unter einem Linux-System ein

1. Ändern Sie die Firewall-Einstellungen und öffn...

Detaillierte Erklärung des Hash-Jump-Prinzips von Vue

Inhaltsverzeichnis Der Unterschied zwischen Hash ...

So zeigen Sie Linux-SSH-Dienstinformationen und den Ausführungsstatus an

Es gibt viele Artikel zur SSH-Serverkonfiguration...

Eine kurze Einführung in die Basiskomponenten der VUE uni-app

1. Scroll-Ansicht Beim vertikalen Scrollen müssen...

Detaillierte Erläuterung der Angular-Routing-Grundlagen

Inhaltsverzeichnis 1. Routing-bezogene Objekte 2....

Einführung in die Verwendung der unbestimmten Eigenschaft des Kontrollkästchens

Wenn wir das Dialogfeld „Ordnereigenschaften“ in W...

Eine kurze Diskussion über mehrere aufgetretene Browserkompatibilitätsprobleme

Hintergrund Das Lösen von Browserkompatibilitätsp...

So benennen Sie unter Linux eine Gruppe von Dateien auf einmal um

Unter Linux verwenden wir normalerweise den Befeh...