Pagrindinis » Kodavimas » Kaip sukurti animuotą SVG spidometrą

    Kaip sukurti animuotą SVG spidometrą

    A matuoklis yra įrankis, kuris vizualiai nurodo vertę tam tikru intervalu. Kompiuteriuose, a “disko vietos indikatorius” naudoja matuoklio matuoklį, kad parodytų, kiek vietos diske yra naudojama iš viso turimo. Gabaritai turi zoną arba regionus, esančius jos diapazone, kiekvienas skiriasi pagal savo spalvą. Vykdant „front-end“, galime naudoti HTML5 žyma, kad būtų rodomi duomenys tam tikrame diapazone.

    Šiame pranešime mes padarysime SVG matuoklis pusiau apskrito formos, ir animuoti. Pažvelkite į šį „GIF“ peržiūrą kaip galutinė versija veiks „Firefox“:

    Matavimo prietaisas diapazonas yra 0-100, ir jis rodomas trys lygios zonos geltonos, mėlynos ir raudonos spalvos. Galite keisti zonų diapazoną ir skaičių pagal savo poreikius.

    Aiškinamiesiems tikslams atliksiu rankinius skaičiavimus ir naudosiu inline SVG atributus / savybes šiuose veiksmuose.

    Tačiau galutinis demonstravimas naudoja CSS ir JavaScript SVG savybių skaičiavimui ir įterpimui, kad jis taptų lankstesnis.

    1. Nupieškite ratą

    Nupieškime paprastą ratą SVG. Naujas HTML5 žyma leidžia pridėti SVG į HTML kodą. Viduje žyma, pridedame SVG forma tokia:

     

    CSS, pridėkime plotis ir aukštis pakuotės savybės, didesnės arba lygios apskritimo skersmeniui (mūsų pavyzdyje tai 300 pikselių). Taip pat turime nustatyti plotį ir aukštį #meteris elementas iki 100%.

     #wrapper plotis: 400px; aukštis: 400px;  #meteris plotis: 100%; aukštis: 100%; 

    2. Pridėti apskritimo kontūrą ir pašalinkite užpildą

    Su. \ T insultas ir smūgio plotis SVG ypatybės pridedame kontūrą prie rato ir naudojant fill = "none" taip pat pašaliname rato užpildą.

     

    3. padengti tik pusę apskritimo

    The insultas-dasharray SVG ypatybė sukuria brūkšniuotą kontūrą ir du vertes, brūkšnys ir spragų ilgis.

    Dėl pusinio apskritimo kontūro brūkšnys vertė turi būti lygi apskritimo pusrutuliui, kad brūkšnys padengtų pusę apskritimo apskritimo ir spragų ilgis vertė turi būti lygi arba didesnė už likusią perimetrą.

    Kai tai daugiau, naršyklė ją konvertuos į likusį perimetrą, taigi mes naudosime visą spragų ilgis. Tokiu būdu mes negalime apskaičiuoti likusio perimetro.

    Pamatysime skaičiavimus:

    perimetras=2Ã? Â? âÂ?π×r

    kur r yra spindulys. 150 metrų spinduliu perimetras yra:

    perimetras=2Ã? Â? âÂ?π×150perimetras=942,48

    Jei mes jį padalijame 2, mes gauname 471,24 pusiau perimetrams, todėl insultas-dasharray 150 ratų apskritimo puslankio kontūro nuosavybė 471, 943. Šis puslankis bus naudojamas matuoklio žemo diapazono zonai žymėti.

       

    Kaip matote, tai aukštyn kojom, todėl įjunkite SVG, pridėdami transformuoti CSS turtas, kurio vertė yra rotateX (180deg) į HTML elementas.

     #meter transform: rotateX (180deg); 

    4. Pridėkite kitas zonas

    The vidurinė zona (mėlyna) turi padengti circle pusiau apskritimo dalį ir 1 iš 471 yra 314. Taigi, pridėkime kitą ratą prie mūsų SVG naudojant insultas-dasharray dar kartą, bet dabar - su 314, 943.

      < /circle>  

    The galutinė zona (raudona) turi apimti paskutinę circle pusiau apskritimo dalį ir ⅓ iš 471 yra 157, todėl šią vertę pridėsime prie insultas-dasharray trečiojo rato nuosavybė.

             

    5. Pridėti matuoklio kontūrą

    Pridėkime matuoklį pilką kontūrą, kad jis atrodytų geriau. The brūkšnys kontūro rato turi būti lygus pusrutuliui. Mes įdėjome jį prieš visus kitus apskritimus kode, kad jis būtų pirmiausia pateikia naršyklė, ir todėl bus rodomi po regiono apskritimais ekrane.

    The smūgio plotis Turtas turi būti šiek tiek didesnis nei kitų apskritimų, kad būtų galima išreikšti tikrą kontūrą.

         < /circle>      

    Kontūro pabaiga

    Kadangi kontūras neapima puslo apskritimo galų, mes taip pat pridedame 2 eilutes apie 2px į galus, pridedant kitą ratą su brūkšnys 2px ir a spragų ilgis pusiau perimetro minus 2px. Todėl. \ T insultas-dasharray šio rato nuosavybė 2, 469.

      

    Kaukė

    Dabar pridėkime kitą apskritimą po žemo, vidutinio ir didelio diapazono zonų. Naujasis apskritimas veiks kaip kaukė, skirta paslėpti nereikalingus zonų regionus, kai bus naudojamas matuoklis.

    Jo savybės bus tokios pačios kaip kontūro rato savybės, o jo smūgio spalva taip pat bus pilka. Vėliau kaukė bus pakeista su „Javascript“, kad būtų atskleistos zonos po juo, atsakant į įvesties slankiklį.

    Bendrasis kodas iki šiol yra toks, kaip nurodyta toliau.

                      

    Jei norime atskleisti regioną po kaukė, turime sumažinti kaukės dydį brūkšnys. Pavyzdžiui, kai insultas-dasharray kaukės rato nuosavybė 157, 943, lankai bus tokioje būsenoje:

    Taigi, viskas, ką turime padaryti dabar, yra pakoreguoti insultas-dasharray kaukę naudojant „JavaScript“ animacijai. Tačiau prieš tai darydami, kaip minėjau anksčiau, paskutiniam demonstravimui naudoju CSS ir „JavaScript“, kad galėčiau apskaičiuoti ir pridėti daugumą SVG savybių.

    Žemiau rasite HTML, CSS ir „JavaScript“ kodus, kurie sukelia tą patį rezultatą kaip ir anksčiau.

    HTML

    Pridėjau adatos vaizdą (gauge-needle.svg), diapazono slankiklį (įvesties # slankiklį) į vartotojo įvestį ir etiketę (etiketė # lbl) rodyti slankiklio vertę nuo 0 iki 100.

    CSS

    Toliau pateikiamas CSS kodas į SVG prideda stiliaus taisykles, nes SVG formos gali būti formuojamos taip pat, kaip ir HTML elementai. Jei norite daugiau sužinoti apie tai, kaip sukurti SVG su CSS, pažiūrėkite į šį įrašą. Jei norite formuoti slankiklį, patikrinkite šį įrašą.

     #wrapper pozicija: santykinis; marža: auto;  #meteris plotis: 100%; aukštis: 100%; transformuoti: rotateX (180deg);  .circle fill: none;  .outline, #mask stroke: # F1F1F1; smūgio plotis: 65;  .gali stroke-width: 60;  #slider, #lbl pozicija: absoliutus;  #slider žymeklis: žymeklis; kairėje: 0; marža: auto; dešinėje: 0; viršuje: 58%; plotis: 94%;  #lbl fono spalva: # 4B4C51; pasienio spindulys: 2px; spalva: balta; font-family: „courier new“; šrifto dydis: 15pt; šrifto svoris: paryškintas; pagalvėlė: 4px 4px 2px 4px; dešinėje: -48px; viršuje: 57%;  #meter_needle aukštis: 40%; kairėje: 0; marža: auto; pozicija: absoliutus; dešinėje: 0; 10 geriausių%; transformacijos kilmė: apatinis centras; / * orientacija fiksuoti * / transformuoti: pasukti (270deg); 

    „JavaScript“

    „JavaScript“ pirmiausia apskaičiuojame ir nustatome įvynio ir visų lankų matmenis, tada pridedame tinkamą insultas-dasharray vertybių ratams. Po to mes prisiimsime pasirinktinį įvykį į diapazono slankiklį, kad galėtume atlikti animaciją.

     / * Visų apskritimų spindulys * / var r = 250; var circles = document.querySelectorAll („. ratas“); var total_circles = circles.length; už (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); 

    „Custom“ range_change_event () Funkcija

    Matuoklio elgesį atlieka range_change_event () individuali funkcija, atsakinga už kaukės dydžio ir adatos animacijos koregavimą.

    Tai užima slankiklio vertę (vartotojo įvestį), kuri yra tarp 0-100, konvertuoja į pusiau perimetro ekvivalentą (meter_value), kurių vertė yra tarp 471-0 (471 - pusiau perimetras, kai spindulys yra 150), ir nustato meter_value kaip brūkšnys kaukės insultas-dasharray nuosavybė.

    The range_change_event () pasirinktinė funkcija taip pat sukasi adatą po to, kai vartotojo įvestis (0-100 diapazone) konvertuojama į 0-180 laipsnio ekvivalentą.

    Prie adatos sukimosi pirmiau minėtame kode pridedama 270 °, nes naudojamas vaizdas yra vertikali adata ir pradžioje turėjau pasukti 270 ° kampą, kad jis būtų lygus į kairę.

    Galiausiai, aš susaistiau range_change_event () funkciją į diapazono slankiklį, kad matuoklis su juo būtų valdomas.

    Patikrinkite demo arba pažiūrėkite į mūsų šaltinį „Github“ saugykla.