Homepage » Coding » Hogyan készítsünk animált SVG sebességmérőt

    Hogyan készítsünk animált SVG sebességmérőt

    A mérőóra olyan eszköz, amely vizuálisan jelzi az adott tartományon belüli értéket. A számítógépekben a “lemezterület-jelző” egy mérőmérőt használ, hogy megmutassa, mennyi lemezterületet használ a rendelkezésre álló teljes mennyiségtől. A mérőműszerek a tartományon belül zónákat vagy régiókat tartalmaznak, amelyek mindegyike saját színével különbözik. A front-end fejlesztés során használhatjuk a HTML5 címke az adott tartományon belüli adatok megjelenítéséhez.

    Ebben a bejegyzésben egy SVG mérőóra félkör alakú, és animálja. Nézd meg ezt a GIF-előnézetet hogyan működik a végleges verzió a Firefoxban:

    A mérő tartomány 0-100, és megjelenik három egyenlő zóna sárga, kék és piros. Megváltoztathatja a zónák tartományát és számát az Ön igényei szerint.

    A magyarázó célból manuális számításokat végzek, és a következő lépésekben használom az inline SVG attribútumokat / tulajdonságokat.

    Végső bemutatóm azonban CSS-t és JavaScript-et használ az SVG tulajdonságok kiszámításához és beillesztéséhez, hogy rugalmasabb legyen.

    1. Rajzoljon egy kört

    Rajzoljunk egy egyszerű kört az SVG-ben. A HTML5 új a címke lehetővé teszi, hogy az SVG-t közvetlenül a HTML-kódba adjuk. Benne tag, hozzáadjuk a Az SVG alakja így van:

     

    A CSS-ben add hozzá szélesség és magasság a burkolat tulajdonságai, amelyek nagyobbak vagy egyenlőek a kör átmérőjével (példánkban ez 300px). Be kell állítanunk a szélességet és a magasságot is #méter elem 100% -ra.

     #wrapper szélesség: 400px; magasság: 400px;  #meter szélesség: 100%; magasság: 100%; 

    2. Adjon körvonalat a körhöz és távolítsa el a kitöltést

    A ütés és stroke-szélességű Az SVG tulajdonságok egy körvonalat adnak a körhöz, és a töltse = "none" a tulajdonságot is eltávolítjuk a kör kitöltését is.

     

    3. csak a kör felét takarja

    A stroke dasharray Az SVG tulajdonság egy szaggatott vonalat hoz létre, és két értéket vesz fel, kötőjel hossza és rés hossza.

    A félkör alakú vázlat esetében a kötőjel hossza az értéknek meg kell egyeznie a kör félkörívével, úgy, hogy a kötőjel a kör kerületének felét lefedi, és a rés hossza az értéknek meg kell egyeznie vagy meg kell haladnia a maradék kerületet.

    Ha több, akkor a böngésző átalakítja a fennmaradó kerületre, így a teljes kerületértéket használjuk rés hossza. Így elkerülhetjük a fennmaradó kerület kiszámítását.

    Lássuk a számításokat:

    körméret=2 ??  ?? â¢Â ??  ??π×r

    hol r a sugár. 150-es sugarú körben a kerület:

    körméret=2 ??  ?? â¢Â ??  ??π×150körméret=942,48

    Ha 2-el osztjuk meg, akkor 471,24-et kapunk félkörméretre, így a stroke dasharray egy félkörös körvonalú ingatlant egy 150 sugarú körben 471, 943. Ez a félkör a mérő alacsony tartományú zónájának jelölésére szolgál.

       

    Amint láthatod, fejjel lefelé van, így kapcsoljuk be az SVG-t a hozzáadásával átalakít CSS tulajdonság a rotateX (180 fokkal lehetőséget) hoz HTML elem.

     #meter transform: rotateX (180deg); 

    4. Adja hozzá a többi zónát

    A középső zóna (kék) a félkör ⅔ részét kell fedeznie, és a 471 ⅔ értéke 314. Így adjunk hozzá egy másik kört az SVG-hez a stroke dasharray újra, de most az értékével 314, 943.

      < /circle>  

    A végső zóna (piros) lefednie kell a félkör utolsó cover részét, és a 471 ⅓ értéke 157, így ezt az értéket hozzáadjuk a stroke dasharray a harmadik kör tulajdonosa.

             

    5. Adja meg a mérő vázlatot

    Adjunk hozzá egy szürke körvonalat a mérőhöz, hogy jobban nézzen ki. A kötőjel hossza A körkörös körnek meg kell egyeznie a félkörmérettel. A kód összes többi körének elhelyezése előtt helyezzük el, hogy ez legyen először a böngésző, és ezért lesz a körkörök alatt jelenik meg a képernyőn.

    A stroke-szélességű az ingatlannak egy kicsit nagyobbnak kell lennie, mint a többi köré, annak érdekében, hogy valódi vázlat megjelenjen.

         < /circle>      

    Szerkezeti végek

    Mivel a körvonal nem fedi le a félkör végeit, 2 körvonalat is hozzáadunk 2px-ig a végéhez egy másik kör hozzáadásával kötőjel hossza 2px és a rés hossza a félkörméret mínusz 2px. Ezért a stroke dasharray ennek a körnek a tulajdonsága 2, 469.

      

    Maszk

    Most adjunk hozzá egy újabb kört az alacsony, az átlagos és a magas tartományú zónák után. Az új kör maszkként fog működni, hogy elrejtse a felesleges zóna régiókat, amikor a mérőmérő működni fog.

    Tulajdonságai ugyanazok lesznek, mint a körvonal köré, és a stroke színe is szürke lesz. A maszk később átméretezhető lesz a Javascript segítségével, hogy felfedje az alatta lévő zónákat a bemeneti csúszkára válaszul.

    A kombinált kód eddig az alábbi.

                      

    Ha a maszk alatt szeretnénk felfedni egy régiót, csökkentenünk kell a maszk méretét kötőjel hossza. Például, ha a stroke dasharray a maszk kör tulajdonsága 157, 943, az ívek a következő állapotban állnak:

    Tehát most mindössze annyit kell tennünk, hogy beállítsuk a stroke dasharray a maszk használata az animációhoz. De mielőtt ezt megtennénk, mint ahogy már említettem, a végső bemutatómhoz CSS-t és JavaScript-et használtam a legtöbb SVG tulajdonság kiszámításához és hozzáadásához.

    Az alábbiakban megtalálható a HTML, CSS és JavaScript kód, amely ugyanazzal az eredménnyel jár, mint a fenti.

    HTML

    Adtam hozzá egy tűt (gauge-needle.svg), egy tartomány-csúszka (bemenet # csúszka) a felhasználói bevitelhez és egy címkéhez (címke # LBL) a csúszkaérték 0-100 tartományban történő megjelenítéséhez.

    CSS

    Az alábbi CSS-kód stílusszabályokat ad az SVG-hez, mivel az SVG-formák ugyanúgy formázhatók, mint a HTML-elemek. Ha többet szeretne olvasni az SVG-vel a CSS-sel való stílusról, nézze meg ezt a bejegyzést. A csúszka kialakításához nézze meg ezt a bejegyzést.

     #wrapper pozíció: relatív; margó: auto;  #meter szélesség: 100%; magasság: 100%; transzformálás: rotateX (180deg);  .circle fill: none;  .outline, #mask stroke: # F1F1F1; stroke-width: 65;  .köteles stroke-width: 60;  #slider, #lbl pozíció: abszolút;  #slider kurzor: mutató; balra: 0; margó: auto; jobb: 0; top: 58%; szélesség: 94%;  #lbl háttérszín: # 4B4C51; határ-sugár: 2px; fehér szín; font-family: új futár; betűméret: 15pt; font-súly: félkövér; párnázás: 4px 4px 2px 4px; jobbra: -48px; top: 57%;  #meter_needle magasság: 40%; balra: 0; margó: auto; pozíció: abszolút; jobb: 0; legjobb 10%; transzformációs eredet: alsó középpont; / * orientáció fix * / transzformáció: forgatás (270deg); 

    JavaScript

    A JavaScript-ben először kiszámítjuk és beállítjuk a burkolat és az összes ív méretét, majd hozzáadjuk a megfelelő stroke dasharray értékeket a körökbe. Ezután egyéni eseményt kötünk a tartomány csúszkához az animáció végrehajtásához.

     / * Sugár beállítása minden kör számára * / var r = 250; var circles = document.querySelectorAll ('. kör'); var total_circles = körök.hossz; a (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); 

    A szokás range_change_event () Funkció

    A mérő viselkedését a range_change_event () egyéni funkció, amely a maszk méretének és a tű animációjának beállításáért felelős.

    A csúszkaértéket (felhasználói bemenet) 0-100 között veszi át, átalakítja a félkörív-egyenértékre (meter_value) 471-0 közötti érték (471 a 150-es sugarú félkörméret), és ezt állítja be meter_value mint a kötőjel hossza a maszk stroke dasharray ingatlan.

    A range_change_event () az egyéni funkció a tűt a 0-100 fokozatba eső felhasználói bemenet (0-100 tartományba eső) konvertálása után is forgatja..

    270 ° -ot adunk a tűk forgatásához a fenti kódban, mert az általam használt kép függőleges tűvel van ellátva, és először 270 ° -kal kellett elforgatni, hogy a lap balra feküdjön.

    Végül megkötöztem range_change_event () funkció a tartomány csúszkához, úgyhogy a mérőműszer ezzel együtt működtethető.

    Nézd meg a demó vagy nézd meg a forráskódot Github-tároló.