Homepage » Coding » Hogyan készítsünk animált Favicon Loader-et JavaScript-el

    Hogyan készítsünk animált Favicon Loader-et JavaScript-el

    Favicons az online márkaépítés kulcsfontosságú részét képezik vizuális cue-t ad felhasználóknak, és segítsen nekik megkülönbözteti a webhelyét másoktól. Bár a legtöbb favicon statikus, lehetséges animált faviconok létrehozása is.

    A folyamatosan mozgó favicon minden bizonnyal bosszantó a legtöbb felhasználó számára, és károsítja a hozzáférhetőséget, de ha csak rövid ideig animálódik válaszul egy felhasználói akcióra vagy egy háttér eseményre, például egy oldalterhelés extra vizuális információt nyújt-ezért javítja a felhasználói élményt.

    Ebben a bejegyzésben megmutatom, hogyan hozhat létre egy animált kör alakú rakodó egy HTML vászonban, és hogyan használhatja azt faviconként. egy animált favicon betöltő nagyszerű eszköz vizualizálja a műveletek előrehaladását az oldalon végrehajtott műveletek, például a fájl feltöltése vagy a képfeldolgozás. Nézd meg a a bemutatóhoz tartozó demó tovább Github is.

    1. Hozza létre a elem

    Először is készítsen egy vászon animációt hogy 100 százalékos teljes kört húz (ez fontos lesz, ha meg kell növelnünk az ív).

       

    A szabványos favicon-méretet, 16 * 16 képpontot használom a vászonra. Használhat egy nagyobb méretet, ha akarja, de vegye figyelembe, hogy a vászonkép lesz a 16-ra csökkent2 pixel terület ha faviconként alkalmazzák.

    2. Ellenőrizze, hogy támogatott

    Benne Feltöltés alatt() eseménykezelő, mi kaphat egy hivatkozást a vászon elemre [önéletrajz] használni a querySelector () metódus, és hivatkozzon 2D-s rajz kontextusobjektuma [ctx] a getContext () eljárás.

     onload = function () cv = document.querySelector ('# cvl'), ctx = cv.getContext ('2d'); ha (!! ctx) / *… * /; 

    Ellenőrizni kell ha a vászon a UA annak biztosításával, hogy a rajz kontextus [ctx] létezik és nincs meghatározva. Elhelyezzük a terhelési eseményhez tartozó összes kód bele ha feltétel.

    3. Hozza létre a kezdeti változókat

    Hozzuk létre három további globális változó, s a az ív kezdőszöge, tc a azonosító a setInterval () időzítő, és pct a ugyanazon időzítő százalékos értéke. A kód tc = pct = 0 0-t rendel hozzá kezdő érték a tc és pct változók.

     onload = function () cv = document.querySelector ('# cvl'), ctx = cv.getContext ('2d'); ha (!! ctx) s = 1,5 * Math.PI, tc = pct = 0; ; 

    Hogy megmutassuk, hogyan értékeli az s számítottam, hadd gyorsan elmagyarázzam, hogyan ívszögek munka.

    Ívszögek

    A szögben (az ívet meghatározó két sugarakból álló szög) egy kör kerülete jelentése 2π rad, hol rad a radian egység szimbólum. Ez teszi szög egy negyed ívre egyenlő 0.5π rad.

    KÉP: Wikipédia

    Amikor vizualizálja a betöltési folyamatot, azt akarjuk, hogy a kört a körön lehessen rajzolni a felső pozícióból az alapértelmezett jog helyett.

    Az óra járásával megegyező irányba (az alapértelmezett irány ív a vászonra rajzolódik) a megfelelő pozícióból, a felső pont háromnegyed után, vagyis egy szögben 1.5π rad. Ezért létrehoztam a változót s = 1,5 * Math.PI később az ívek kezdőszöge a vászonra vonható.

    4. Stílus a kör

    A rajz kontextus objektumhoz definiáljuk a vonalvastagság és strokeStyle a kör tulajdonságai a következő lépésben fogunk felhívni. A strokeStyle tulajdonsága a színe.

     onload = function () cv = document.querySelector ('# cvl'), ctx = cv.getContext ('2d'); ha (!! ctx) s = 1,5 * Math.PI, tc = pct = 0; ctx.lineWidth = 2; ctx.strokeStyle = 'fukszia'; ; 

    5. Rajzolja meg a kört

    Mi kattintáses eseménykezelő hozzáadása a Betöltés gombra [#lbtn] melyik 60 milliszekundumú setInterval időzítőt indít, amely végrehajtja a kör rajzolásáért felelős funkciót [updateLoader ()] minden 60 ms-ban, amíg a kör teljesen meg nem húzódik.

    A setInterval () eljárás visszaad egy időzítő azonosítót annak az időzítőnek az azonosítása, amely a tc változó.

     onload = function () cv = document.querySelector ('# cvl'), ctx = cv.getContext ('2d'); ha (!! ctx) s = 1,5 * Math.PI, tc = pct = 0, btn = document.querySelector ('# lbtn'); ctx.lineWidth = 2; ctx.strokeStyle = 'fukszia'; btn.addEventListener ('click', függvény () tc = setInterval (updateLoader, 60);); ; 

    6. Hozza létre a updateLoader () egyéni funkció

    Itt az ideje a szokás létrehozására updateLoader () funkció hívta setInterval () eljárás a gomb megnyomásakor (az esemény bekapcsolódik). Hadd mutassam meg először a kódot, majd elmegyünk a magyarázattal.

     updateLoader () ctx.clearRect (0, 0, 16, 16) függvény; ctx.beginPath (); ctx.arc (8, 8, 6, s, (pct * 2 * Math.PI / 100 + s)); ctx.stroke (); ha (pct === 100) clearInterval (tc); Visszatérés;  pct ++;  

    A clearRect () eljárás törli a vászon téglalap alakú területét paraméterei: a bal felső sarok (x, y) koordinátái. A clearRect (0, 0, 16, 16) vonal mindent töröl a létrehozott 16 * 16 képpontos vászonban.

    A beginPath () eljárás új utat hoz létre a rajzhoz és a szélütés () eljárás az újonnan létrehozott úton fest.

    A végén a updateLoader () funkció, a százalékos szám [pct] 1-vel növekszik, és a növekedés előtt ellenőrizze, hogy 100-nak felel meg. Amikor 100 százalék, akkor a setInterval () időzítő (az időzítő azonosítója, tc) törölve a clearInterval () eljárás.

    A. \ T ív() módszer a (x, y) az ív középpontjának koordinátái és sugara. A negyedik és az ötödik paraméter a kezdő és végső szögek ahol az ív rajza kezdődik és véget ér.

    Már eldöntöttük a betöltőkör kezdőpontját, amely a szögben van s, és ez lesz az azonos az összes iterációban.

    A végső szög ugyanakkor lesz növekszik a százalékos számmal, kiszámíthatjuk a a növekmény mérete a következő módon. Mondjuk 1% -ot (a 100-ból 1) szögnek felel meg α 2-bőlπ egy körben (2π = az egész kerület szöge), akkor ugyanaz az alábbi egyenlet írható:

    1/100 = α/ 2π

    Az egyenlet átrendezése:

     α = 1 * 2π / 100 α = 2π/ 100 

    Tehát 1% a 2. szögnek felel megπ/ 100 körben. Így a végszög minden százalékos növekedéskor kiszámítása 2-es szorzással történikπ/ 100 a százalékos érték alapján. Ezután az eredmény hozzáadott s (kezdőszög), így az ívek ugyanabból a kiindulási helyzetből készült mindig. Ezért használtuk fel a pct * 2 * Math.PI / 100 + s képlet a végpont szögének kiszámításához a fenti kódrészletben.

    7. Adja hozzá a favicon-ot

    Helyezzünk egy favicon link elem a HTML-be szekciót közvetlenül vagy JavaScript segítségével.

      

    Ban,-ben updateLoader () funkció, először is keresse meg a faviconot használni a querySelector () módszert, és hozzárendeljük a lnk változó. Aztán meg kell exportálja a vászonképet minden alkalommal, amikor egy ív rajzolódik kódolt képbe a toDataURL () módszer, és hozzárendelje az adat URI-tartalmat favicon-képként. Ez létrehoz egy animált faviconot, amely a ugyanaz, mint a vászonrakodó.

     onload = function () cv = document.querySelector ('# cvl'), ctx = cv.getContext ('2d'); ha (!! ctx) s = 1,5 * Math.PI, tc = pct = 0, btn = document.querySelector ('# lbtn'), lnk = document.querySelector ('link [rel = "ikon"]') ; ctx.lineWidth = 2; ctx.strokeStyle = 'fukszia'; btn.addEventListener ('click', függvény () tc = setInterval (updateLoader, 60);); ; updateLoader () ctx.clearRect (0, 0, 16, 16) függvény; ctx.beginPath (); ctx.arc (8, 8, 6, s, (pct * 2 * Math.PI / 100 + s)); ctx.stroke (); lnk.href = cv.toDataURL ('image / png'); ha (pct === 100) clearTimeout (tc); Visszatérés;  pct ++;  

    Megnézheti a teljes kódot Githubon.

    Bónusz: Használja a betöltőt az aszinkron eseményekre

    Ha használni kell ezt a vászon animációt egy betöltési művelettel együtt egy weblapon hozzárendelheti a updateLoader () funkció mint az eseménykezelő haladás() intézkedés esetén.

    Például a JavaScript így változik AJAX-ban:

     onload = function () cv = document.querySelector ('# cvl'), ctx = cv.getContext ('2d'); ha (!! ctx) s = 1,5 * Math.PI, lnk = document.querySelector ('link [rel = "ikon"]'); ctx.lineWidth = 2; ctx.strokeStyle = 'fukszia';  var xhr = új XMLHttpRequest (); xhr.addEventListener ('progress', updateLoader); xhr.open ('GET', 'https://xyz.com/abc'); xhr.send () eljárást; ; updateLoader (evt) ctx.clearRect (0, 0, 16, 16) függvény; ctx.beginPath (); ctx.arc (8, 8, 6, s, (evt.loaded * 2 * Math.PI / evt.total + s)); ctx.stroke (); lnk.href = cv.toDataURL ('image / png');  

    Ban,-ben ív() módszer, cserélje ki a százalékos értéket [pct] a ... val töltött az esemény tulajdonsága-azt jelzi, hogy a fájl mennyi betöltése történt, és helyette 100 használja a teljes a ProgressEvent tulajdonát képezi, amely a terhelendő összmennyiséget jelenti.

    Van nincs szükség setInterval () ilyen esetekben, mint a haladás() esemény automatikusan kikapcsol a betöltés folyamatában.