Hjemmeside » Coding » Sådan laver du et animeret SVG-hastighedsmåler

    Sådan laver du et animeret SVG-hastighedsmåler

    EN målemåler er et værktøj, der visuelt angiver en værdi inden for et givet interval. I computere a “diskpladsindikator” bruger en måler til at vise, hvor meget diskplads der anvendes fra den samlede tilgængelige. Målere har zoner eller regioner på tværs af dens rækkevidde, hver differentieret af sin egen farve. I front-end udvikling kan vi bruge HTML5-tag til at vise data inden for et bestemt område.

    I dette indlæg laver vi en SVG gauge meter med halvcirkelform, og animere det. Se et kig på dette eksempel GIF, der viser hvordan den endelige version vil fungere i Firefox:

    Måleren er rækkevidde er 0-100, og det viser tre lige zoner i gul, blå og rød. Du kan ændre rækkevidde og nummer på zonerne efter dine behov.

    Til forklaring vil jeg udføre manuelle beregninger og bruge inline SVG attributter / egenskaber i de følgende trin.

    Min endelige demo bruger dog CSS og JavaScript til beregning og indsættelse af SVG-egenskaber for at gøre det mere fleksibelt.

    1. Tegn en cirkel

    Lad os tegne en simpel cirkel i SVG. HTML5 er nyt tag giver os mulighed for at tilføje SVG lige ind i HTML-koden. Inde i tag, tilføjer vi SVG form sådan:

     

    I CSS, lad os tilføje bredde og højde Egenskaber til omslaget, begge større end eller lig med cirklens diameter (det er 300 px i vores eksempel). Vi skal også indstille bredden og højden af #måler element til 100%.

     #wrapper width: 400px; højde: 400px;  # meter bredde: 100%; højde: 100%; 

    2. Tilføj omrids til cirklen og fjern fill

    Med hjælp fra slag og slagtilfælde bredde SVG egenskaber vi tilføjer en omrids til cirklen, og ved at bruge fylde = "none" ejendom vi fjerner også cirkelens udfyldning.

     

    3. dækker kun halvdelen af ​​cirklen

    Det slagtilfælde-dasharray SVG-egenskaben skaber en stiplede kontur og tager to værdier, bindestreg længde og afstandslængde.

    For halvcirkelplanen, den bindestreg længde værdien skal være lig med cirkelens halvomkreds, således at bindestreg dækker halvdelen af ​​cirkelens omkreds og den afstandslængde værdibehov skal være lig med eller mere end den resterende omkreds.

    Når det er mere, vil det blive konverteret til den resterende omkreds af browseren, derfor bruger vi den fulde omkredsværdi for afstandslængde. På den måde kan vi undgå at beregne den resterende omkreds.

    Lad os se beregningerne:

    omkreds=2 ?? â ?? â ?? â ??π×r

    hvor r er radius. For en radius på 150 er omkredsen:

    omkreds=2 ?? â ?? â ?? â ??π×150omkreds=942,48

    Hvis vi deler det med 2, får vi 471.24 for halvomkreds, så værdien af slagtilfælde-dasharray Egenskaben for en halvcirkelplan i en radius cirkel på 150 cirkler er 471, 943. Denne halvcirkel vil blive brugt til at betegne måleområdet med lav rækkevidde.

       

    Som du kan se, er det på hovedet, så lad os slå SVG op ved at tilføje omdanne CSS ejendom med værdien af rotateX (180deg) til HTML-element.

     #meter transform: rotateX (180deg); 

    4. Tilføj de andre zoner

    Det midterste zone (blå) skal dække halvdelen af ​​halvcirklen, og ⅔ af 471 er 314. Så lad os tilføje en anden cirkel til vores SVG ved hjælp af slagtilfælde-dasharray ejendom igen, men nu med værdien af 314, 943.

      < /circle>  

    Det sidste zone (rød) skal dække den sidste ⅓ del af halvcirklen, og ⅓ af 471 er 157, så vi vil tilføje denne værdi til slagtilfælde-dasharray ejendom i den tredje cirkel.

             

    5. Tilføj Meter Outline

    Lad os tilføje en grå omrids til måleren for at få det til at se bedre ud. Det bindestreg længde af omrids cirklen skal være lig med halvomkredsen. Vi placerer det før alle de andre kredse i koden, så det bliver gjort først af browseren, og derfor vil det være vises under regionens cirkler på skærmen.

    Det slagtilfælde bredde Ejendommen skal være lidt større end for de andre kredse, for at give udseendet af en reel skitse.

         < /circle>      

    Outline Ends

    Da oversigten ikke dækker halvcirkelens ender, tilføjer vi også 2 linjer på ca. 2px til enderne ved at tilføje en anden cirkel med en bindestreg længde af 2px og a afstandslængde af halvomkredsen minus 2px. Derfor er værdien af slagtilfælde-dasharray egenskaben af ​​denne cirkel er 2, 469.

      

    Maske

    Lad os nu tilføje en anden cirkel efter de lave, gennemsnitlige og højkvalitetszoner. Den nye cirkel fungerer som en maske for at skjule de unødvendige zoneområder, når målemåleren skal betjenes.

    Dens egenskaber vil være de samme som i cirkelrunden, og dens slagfarve vil også være grå. Masken vil senere blive ændret med Javascript for at afsløre zoner under den som svar på en indgangsskyder.

    Den kombinerede kode hidtil er som nedenfor.

                      

    Hvis vi vil afsløre en region under masken, skal vi reducere størrelsen på masken bindestreg længde. For eksempel, når værdien af slagtilfælde-dasharray Maskens cirkel er egenskaben 157, 943, buerne vil stå i følgende tilstand:

    Så alt hvad vi skal gøre nu er at justere slagtilfælde-dasharray af masken ved hjælp af JavaScript til animation. Men før vi gør det, som jeg tidligere har nævnt, brugte jeg CSS og JavaScript til at beregne og tilføje de fleste SVG-egenskaber til min endelige demo.

    Nedenfor finder du HTML, CSS og JavaScript-koden, der fører til det samme resultat som ovenfor.

    HTML

    Jeg tilføjede et nålbillede (gauge-needle.svg), en række skyder (skyderen # input) til brugerens input og en etiket (etiket # LBL) for at vise skyderenværdien i området 0-100.

    CSS

    CSS-koden nedenfor tilføjer stilregler til SVG, da SVG-former kan styles på samme måde som HTML-elementer. Hvis du vil læse mere om, hvordan du stiler SVG med CSS, skal du kigge på dette indlæg. Til styling skyderen, tjek dette indlæg.

     #wrapper position: relative; margen: auto;  # meter bredde: 100%; højde: 100%; transformere: rotateX (180deg);  .circle fill: none;  .outline, #mask slag: # F1F1F1; slagbredde: 65;  .range slagbredde: 60;  #slider, #lbl position: absolute;  #slider cursor: pointer; venstre: 0; margen: auto; højre: 0; top: 58%; bredde: 94%;  #lbl baggrundsfarve: # 4B4C51; grænse-radius: 2px; farve: hvid; font-family: 'courier new'; skrifttypestørrelse: 15pt; font-weight: bold; polstring: 4px 4px 2px 4px; højre: -48px; top: 57%;  #meter_needle højde: 40%; venstre: 0; margen: auto; position: absolut; højre: 0; Top 10%; transformation-oprindelse: bottom center; / * orienteringsfix * / transform: roter (270deg); 

    JavaScript

    I JavaScript beregner og beregner vi først indpakningens dimensioner og alle buer, så tilføjer vi det rigtige slagtilfælde-dasharray værdier til cirklerne. Derefter vil vi binde en brugerdefineret begivenhed til glidebryderen for at udføre animationen.

     / * Indstil radius for alle cirkler * / var r = 250; varcirkler = document.querySelectorAll ('cirkel'); var total_circles = cirkler.længde; for (var i = 0; i < total_circles; i++)  circles[i].setAttribute('r', r);  /* Set meter's wrapper dimension */ var meter_dimension = (r * 2) + 100; var wrapper = document.querySelector("#wrapper"); wrapper.style.width = meter_dimension + "px"; wrapper.style.height = meter_dimension + "px"; /* Add strokes to circles */ var cf = 2 * Math.PI * r; var semi_cf = cf / 2; var semi_cf_1by3 = semi_cf / 3; var semi_cf_2by3 = semi_cf_1by3 * 2; document.querySelector("#outline_curves") .setAttribute("stroke-dasharray", semi_cf + "," + cf); document.querySelector("#low") .setAttribute("stroke-dasharray", semi_cf + "," + cf); document.querySelector("#avg") .setAttribute("stroke-dasharray", semi_cf_2by3 + "," + cf); document.querySelector("#high") .setAttribute("stroke-dasharray", semi_cf_1by3 + "," + cf); document.querySelector("#outline_ends") .setAttribute("stroke-dasharray", 2 + "," + (semi_cf - 2)); document.querySelector("#mask") .setAttribute("stroke-dasharray", semi_cf + "," + cf); /* Bind range slider event*/ var slider = document.querySelector("#slider"); var lbl = document.querySelector("#lbl"); var mask = document.querySelector("#mask"); var meter_needle = document.querySelector("#meter_needle"); function range_change_event()  var percent = slider.value; var meter_value = semi_cf - ((percent * semi_cf) / 100); mask.setAttribute("stroke-dasharray", meter_value + "," + cf); meter_needle.style.transform = "rotate(" + (270 + ((percent * 180) / 100)) + "deg)"; lbl.textContent = percent + "%";  slider.addEventListener("input", range_change_event); 

    Den tilpassede range_change_event () Fungere

    Meterens adfærd udføres af range_change_event () brugerdefineret funktion, der er ansvarlig for justeringen af ​​maskestørrelsen og nålens animation.

    Det tager gliderenværdien (brugerindgang), som er mellem 0-100, konverterer den til den halve omkredsækvivalent (meter_value) af en værdi mellem 471-0 (471 er halvomkredsen for radius 150), og angiver det meter_value som bindestreg længde af maskens slagtilfælde-dasharray ejendom.

    Det range_change_event () brugerdefinerede funktion roterer også nålen efter konvertering af brugerindgangen (kommer i 0-100 rækkevidden) til sin grad svarende til 0-180.

    270 ° tilføjes til nålens rotation i ovennævnte kode, fordi det billede, jeg brugte, er af en stående nål, og jeg var nødt til at rotere den 270 ° for første gang for at få den til at ligge fladt til venstre.

    Endelig bundet jeg range_change_event () funktionen til glidebryderen, så målemåleren kan betjenes med den.

    Tjek den demo eller kig på kildekoden på vores Github depot.