Sådan beregnes og animeres keyframe-værdier ved hjælp af JavaScript
Når du bygger dynamiske webapplikationer, kan en kombination af JavaScript med CSS-animationer skabe jævne, visuelt tiltalende overgange. En fælles udfordring er at animere elementer baseret på dataværdier i realtid. Et godt eksempel er at skabe keyframe-animationer, der afspejler en statuslinjes aktuelle procentdel ved hjælp af SVG og streg-dashoffset.
Denne teknik kan være særlig nyttig, når du viser dynamiske værdier som et antal abonnenter, som i dette eksempel, hvor antallet af abonnementer opdateres i realtid. For at få animationen til at fungere problemfrit kan vi konvertere dette tal til en procentdel og anvende det direkte på CSS-animationen.
JavaScript kan dog være forvirrende, når man har at gøre med CSS-animationer, især når man beregner værdier som procenter for at manipulere keyframes effektivt. I dette tilfælde er det afgørende at forstå, hvordan man udtrækker og manipulerer dynamiske data med JavaScript for at sikre, at dine animationer afspejler den korrekte værdi.
Denne artikel vil guide dig gennem brugen af JavaScript til at fjerne numeriske data, beregne procenter og anvende dem på keyframes ved hjælp af egenskaben streg-dashoffset. Til sidst vil du have en klar forståelse af, hvordan JavaScript og CSS kan arbejde sammen for at skabe responsive animationer.
Kommando | Eksempel på brug |
---|---|
fetch() | Metoden fetch() bruges til at anmode om data fra en ressource (f.eks. tekstfil, API). I dette script bruges det til at hente abonnentdata fra en tekstfil til behandling i statuslinjen. |
parseInt() | Funktionen parseInt() konverterer en streng til et heltal. Her fjerner den værdien før skråstregen (f.eks. 42/50) for at få det aktuelle antal abonnenter. |
split() | Split()-metoden opdeler en streng i et array baseret på et skilletegn. I dette tilfælde bruger den '/' til at adskille det aktuelle antal abonnenter fra målet (42 fra 42/50). |
strokeDashoffset | strokeDashoffset er en SVG-attribut, der styrer, hvordan en streg tegnes. Det manipuleres her for dynamisk at ændre SVG-cirklens fyldning baseret på abonnementsprocenten. |
setTimeout() | Denne metode kalder en funktion efter en specificeret forsinkelse. Den bruges her til at indstille intervallet for drejning af etiketterne, så nye etiketter vises efter et par sekunder. |
cloneNode() | cloneNode(true) bruges til at oprette en kopi af en node, inklusive dens børn. Dette er vigtigt for at duplikere etiketskabelonen og føje den til DOM dynamisk. |
visibility | Denne CSS-egenskab styres via JavaScript for at skjule eller vise etiketter. Det sikrer, at kun én etiket er synlig ad gangen under rotation. |
strokeDasharray | strokeDasharray definerer mønsteret af bindestreger og mellemrum i et SVG-strøg. Den er indstillet til en bestemt værdi (450) for at matche cirklens omkreds, som er animeret med strokeDashoffset. |
Animering af SVG-cirkler med JavaScript: En trin-for-trin guide
I dette eksempel oprettede vi en dynamisk animation til en SVG-cirkel ved hjælp af en kombination af JavaScript og CSS. Hovedmålet er at animere en cirkels fremskridt, så den visuelt repræsenterer antallet af abonnementer i realtid. Cirklen bruger slag-stregforskydning CSS-egenskab, som styrer, hvor meget af cirklens streg, der er synligt. JavaScript bruges til at hente og beregne procentdelen af fremskridt og derefter anvende denne værdi på stregen, hvilket giver mulighed for jævn animation baseret på realtidsdata.
En nøglekomponent er hente funktion, som henter data fra en fil eller server, i dette tilfælde abonnementsantallet. Scriptet udtrækker den numeriske del af dataene ved at bruge strengmanipulationsmetoder som f.eks dele(), og konverterer resultatet til et brugbart tal med parseInt(). Ved at dividere det aktuelle abonnementantal med målet, beregner vi fremskridtet som en decimal (procent). Denne procentsats anvendes derefter på slag-stregforskydning at skabe den visuelle effekt.
Det andet script håndterer etiketrotation, som tilføjer et lag af dynamisk indhold til skærmen. Etiketter føjes til DOM ved hjælp af cloneNode() metode, som dublerer en eksisterende etiketskabelon. Hver etiket roteres med et bestemt interval, som styres af setTimeout() fungere. Denne metode udløser rotationen efter en specificeret forsinkelse, hvilket skaber en jævn overgang mellem etiketter uden at kræve brugerinteraktion.
Kombinationen af slag-stregforskydning for cirklen og etiketrotationsscriptet skaber en engagerende brugergrænseflade. Ved dynamisk at ændre både fremdriften af cirklen og de etiketter, der vises, giver vi brugerne en visuel indikation af fremskridt i realtid. Modulariteten af koden sikrer også, at disse funktioner nemt kan tilpasses til andre datadrevne applikationer, hvilket gør den til en fleksibel løsning for udviklere, der ønsker at implementere dynamiske UI-elementer.
Animering af SVG-fremskridtsbjælker med JavaScript og CSS Keyframes
Denne løsning bruger vanilla JavaScript og SVG til frontend dynamisk fremdriftslinje-animation. Scriptet udtrækker værdier, beregner procenter og anvender dem på et SVG-elements streg-dashoffset for jævn animation.
// HTML and SVG structure
<div id="labels"></div>
<svg width="200" height="200">
<circle id="circle" cx="100" cy="100" r="90" />
</svg>
// JavaScript to animate stroke-dashoffset
let labels = document.getElementById("labels");
const SubGoal = 50; // Total subscription goal
function updateProgress(data) {
const SubCount = parseInt(data.split('/')[0]); // Extract number
const SubPercent = SubCount / SubGoal; // Calculate percentage
const SubPercentStroke = 450 - 450 * SubPercent; // Set stroke offset
document.getElementById('circle').style.strokeDashoffset = SubPercentStroke;
}
// Example usage
fetch('subscribers.txt').then(response => response.text())
.then(data => updateProgress(data));
Dynamisk etiketrotation med JavaScript
Denne løsning roterer forskellige etiketter dynamisk med faste intervaller ved hjælp af JavaScript. Den understøtter både statiske og roterende skærme baseret på brugerindstillinger.
// Label rotation logic
var displaySettings = "RotatingDisplays";
var displayRotationSeconds = 2;
var displayRotationIndex = 0;
function rotateLabelDisplay() {
if (displayRotationIndex >= labels.children.length) {
displayRotationIndex = 0;
}
for (const label of labels.children) {
label.style.visibility = 'hidden';
}
let label = labels.children[displayRotationIndex];
label.style.visibility = 'visible';
displayRotationIndex++;
setTimeout(rotateLabelDisplay, displayRotationSeconds * 1000);
}
// Trigger rotation if display setting is enabled
if (displaySettings === "RotatingDisplays") {
rotateLabelDisplay();
} else {
labels.children[0].style.visibility = "visible";
}
Forbedring af animationer med JavaScript og CSS-variabler
Et vigtigt aspekt ved at bruge JavaScript at styre animationer er dens evne til at interagere med CSS variabler. Disse variabler giver udviklere mulighed for at skabe mere genbrugelig og let vedligeholdelig kode. For eksempel, i stedet for at hardkode animationsværdier som stroke-dashoffset direkte i JavaScript, kan du definere dem som CSS-variabler og manipulere dem ved hjælp af JavaScript. Dette giver en renere måde at administrere dine animationsegenskaber på og gør din kode mere modulær og skalerbar.
En anden kraftfuld funktion, når JavaScript kombineres med CSS, er brugen af begivenhedslyttere. Hændelsesdrevne animationer kan udløses baseret på brugerinteraktioner, som at klikke på en knap eller rulle ned på en side. I vores eksempel kan du forbedre animationen ved at tilføje interaktivitet. For eksempel kan streg-dashoffset genberegnes og anvendes dynamisk, når en bruger abonnerer eller udfører en anden handling. Dette skaber en meget engagerende og interaktiv oplevelse, der reagerer på realtidsdata.
Derudover at kombinere requestAnimationFrame med keyframes er en anden måde at skabe glatte og effektive animationer. Denne metode sikrer, at animationer udføres under browserens optimale genmalingscyklus, hvilket giver bedre ydeevne sammenlignet med traditionelle setInterval eller setTimeout. Denne teknik er især nyttig, når du har at gøre med hyppige animationer eller tunge JavaScript-processer, der ellers kan bremse brugergrænsefladen.
Ofte stillede spørgsmål om JavaScript og CSS-animationer
- Hvordan gør strokeDashoffset påvirke SVG-animationer?
- De strokeDashoffset styrer, hvor meget af SVG-stiens streg, der er synligt. Ændring af dens værdi giver mulighed for jævne fremskridtslignende animationer.
- Hvad er rollen fetch() i realtidsanimationer?
- fetch() bruges til at hente data fra en API eller fil. I animationer hjælper dette med at indlæse dynamiske værdier som abonnentantal, som derefter kan animeres på skærmen.
- Kan setTimeout() bruges til at styre animationsintervaller?
- Ja, setTimeout() kan bruges til at indføre forsinkelser i animationer, såsom at rotere etiketter med intervaller.
- Hvad er formålet med parseInt() i JavaScript-animationsscripts?
- parseInt() konverterer en streng (som "42/50") til et heltal, som er nødvendigt for at beregne procenter i dynamiske animationer.
- Hvorfor skal jeg bruge requestAnimationFrame() i stedet for setInterval()?
- requestAnimationFrame() er optimeret til animationer, hvilket sikrer jævnere overgange ved at synkronisere dem med browserens genmalingscyklus.
Endelige tanker om dynamiske keyframe-animationer
Kombinerer JavaScript med CSS giver mulighed for kraftfulde og dynamiske animationer, der kan reagere på realtidsdata. Ved at forstå, hvordan man beregner værdier som procenter og anvender dem på keyframe-animationer, kan du skabe engagerende og responsive brugergrænseflader, der afspejler live fremskridt eller dataopdateringer.
Med de teknikker, der er dækket i denne vejledning, kan du nemt manipulere egenskaber som f.eks slag-stregforskydning til SVG-animationer og roter elementer dynamisk. Denne kombination giver en skalerbar løsning til udviklere, der ønsker at integrere dynamiske animationer i deres projekter med realtidsdatainput.
Kilder og referencer til dynamiske animationer med JavaScript
- Detaljerede oplysninger om brug slag-stregforskydning til SVG-animationer kan findes på MDN Web Docs: streg-dashoffset .
- For yderligere indsigt i dynamiske keyframe-animationer ved hjælp af JavaScript og CSS, se Smashing Magazine: CSS Keyframe Animationer .
- Yderligere vejledning om at manipulere DOM med cloneNode() i JavaScript er tilgængelig på MDN Web Docs: cloneNode .
- Lær mere om at bruge hente() at hente data i realtid fra MDN Web Docs: Brug af Fetch .