Bagaimana Membuat Pembuat Favicon Animasi dengan JavaScript
Favicons adalah bahagian penting dalam penjenamaan dalam talian, mereka memberikan isyarat visual kepada pengguna, dan membantu mereka membezakan laman web anda dari orang lain. Walaupun kebanyakan favikon adalah statik, adalah mustahil buat favicons animasi juga.
Favicon sentiasa bergerak pasti menjengkelkan untuk kebanyakan pengguna, dan juga merosakkan aksesibiliti, namun apabila ia hanya animasi untuk masa yang singkat sebagai tindak balas kepada tindakan pengguna atau peristiwa latar belakang, seperti beban halaman, boleh memberikan maklumat visual tambahan-oleh itu meningkatkan pengalaman pengguna.
Dalam siaran ini, saya akan menunjukkan kepada anda cara membuatnya loader pekeliling animasi dalam kanvas HTML, dan bagaimana anda boleh menggunakannya sebagai favicon. An loader favicon animasi adalah alat yang hebat untuk menggambarkan kemajuan apa-apa tindakan dilakukan pada halaman, seperti muat naik fail atau pemprosesan imej. Anda boleh lihat di demo yang dimuatkan dalam tutorial ini pada Github juga.
1. Buat
elemen
Pertama, kita perlu buat animasi kanvas itu menarik bulatan penuh, 100 peratus secara keseluruhan (ini akan menjadi penting apabila kita perlu menambah arka).
Saya menggunakan saiz favicon standard, 16 * 16 piksel, untuk kanvas. Anda boleh menggunakan saiz yang lebih besar daripada itu jika anda mahu, tetapi perhatikan bahawa imej kanvas akan menjadi berskala ke 162 kawasan piksel apabila ia digunakan sebagai favicon.
2. Periksa jika
disokong
Di dalam onload ()
pengendali acara, kami dapatkan rujukan untuk elemen kanvas [CV
] menggunakan querySelector ()
kaedah, dan rujuk objek konteks lukisan 2D [ctx
] dengan bantuan getContext ()
kaedah.
onload = function () cv = document.querySelector ('# cvl'), ctx = cv.getContext ('2d'); jika (!! ctx) / * ... * /;
Kami juga perlu menyemak jika kanvas disokong oleh UA dengan memastikan bahawa objek lukisan objek [ctx
] wujud dan tidak ditakrifkan. Kami akan meletakkan semua kod yang dimiliki oleh peristiwa beban ke dalam ini jika
keadaan.
3. Buat pembolehubah awal
Mari buat tiga lagi variabel global, s
untuk sudut permulaan arka, tc
untuk id untuk setInterval ()
pemasa, dan pct
untuk nilai peratusan pemasa yang sama. Kod ini tc = pct = 0
memberikan 0 sebagai nilai permulaan untuk tc
dan pct
pembolehubah.
onload = function () cv = document.querySelector ('# cvl'), ctx = cv.getContext ('2d'); jika (!! ctx) s = 1.5 * Math.PI, tc = pct = 0; ;
Untuk menunjukkan bagaimana nilai s
dikira, beritahu saya dengan cepat sudut arka kerja.
Sudut arka
The sudut tersuntik (sudut terdiri daripada dua sinar yang menentukan arka) lilitan bulatan adalah 2π rad, di mana rad adalah simbol unit radian. Ini menjadikan sudut untuk arka suku sama dengan 0.5π rad.
Bila menggambarkan kemajuan pemuatan, kami mahu bulatan di atas kanvas ditarik dari kedudukan teratas bukannya hak lalai.
Pergi mengikut arah jam (arc arah lalai ditarik pada kanvas) dari kedudukan yang betul, titik teratas adalah dicapai selepas tiga suku, iaitu pada sudut 1.5π rad. Oleh itu, saya telah membuat pembolehubah s = 1.5 * Math.PI
untuk kemudian menunjukkan sudut permulaan untuk arka untuk diambil dari pada kanvas.
4. Gaya bulatan
Untuk objek konteks lukisan, kita mentakrifkan lineWidth
dan strokeStyle
sifat bulatan kita akan membuat langkah seterusnya. The strokeStyle
harta benda mewakili warna.
onload = function () cv = document.querySelector ('# cvl'), ctx = cv.getContext ('2d'); jika (!! ctx) s = 1.5 * Math.PI, tc = pct = 0; ctx.lineWidth = 2; ctx.strokeStyle = 'fuchsia'; ;
5. Lukis bulatan
Kami tambah pengendali acara klik ke butang Beban [#lbtn
] yang mana mencetuskan pemasa setInterval sebanyak 60 milisaat, yang melaksanakan fungsi yang bertanggungjawab untuk melukis bulatan [updateLoader ()
] setiap 60ms sehingga bulatan sepenuhnya ditarik.
The setInterval ()
kaedah mengembalikan id pemasa untuk mengenal pasti pemasa yang diberikan kepada tc
pembolehubah.
onload = function () cv = document.querySelector ('# cvl'), ctx = cv.getContext ('2d'); jika (!! ctx) s = 1.5 * Math.PI, tc = pct = 0, btn = document.querySelector ('# lbtn'); ctx.lineWidth = 2; ctx.strokeStyle = 'fuchsia'; btn.addEventListener ('klik', fungsi () tc = setInterval (updateLoader, 60);); ;
6. Buat updateLoader ()
fungsi tersuai
Sudah waktunya untuk membuat adat updateLoader ()
fungsi yang akan menjadi dipanggil oleh setInterval ()
kaedah apabila butang diklik (peristiwa itu dicetuskan). Biarkan saya memperlihatkan kod anda terlebih dahulu, maka kita boleh pergi bersama penjelasannya.
fungsi updateLoader () ctx.clearRect (0, 0, 16, 16); ctx.beginPath (); ctx.arc (8, 8, 6, s, (pct * 2 * Math.PI / 100 + s)); ctx.stroke (); jika (pct === 100) clearInterval (tc); kembali; pct ++;
The clearRect ()
kaedah membersihkan kawasan segi empat segi kanvas didefinisikan oleh parameternya: koordinat (x, y) sudut kiri atas. The clearRect (0, 0, 16, 16)
talian memadamkan semuanya dalam kanvas 16 * 16 pixel yang telah kami buat.
The beginPath ()
kaedah mewujudkan laluan baru untuk lukisan, dan stroke ()
kaedah cat pada laluan yang baru diwujudkan.
Pada akhir updateLoader ()
fungsi, jumlah peratusan [pct
] meningkat sebanyak 1 kali, dan sebelum kenaikan kita semak jika ia sama dengan 100. Apabila ia 100 peratus, yang setInterval ()
pemasa (dikenal pasti oleh id pemasa, tc
) dibersihkan dengan bantuan clearInterval ()
kaedah.
Tiga parameter pertama dari arka ()
kaedah adalah (x, y) koordinat pusat arka dan jejarinya. Parameter keempat dan kelima mewakili mulakan dan tamat sudut di mana lukisan arka bermula dan berakhir.
Kami telah memutuskan titik permulaan bulatan pemuat, yang berada di sudut s
, dan ia akan menjadi sama dalam semua lelaran.
Sudut akhir bagaimanapun akan kenaikan dengan kiraan peratus, kita dapat mengira saiz kenaikan itu dengan cara berikut. Katakanlah 1% (nilai 1 daripada 100) adalah bersamaan dengan sudut α daripada 2π dalam kalangan (2π = sudut seluruh lilitan), maka yang sama boleh ditulis sebagai persamaan berikut:
1/100 = α/ 2π
Pada menyusun semula persamaan tersebut:
α = 1 * 2π / 100 α = 2π/ 100
Oleh itu, 1% bersamaan dengan sudut 2π/ 100 dalam bulatan. Oleh itu, sudut akhir dalam setiap kenaikan peratus ialah dikira dengan mengalikan 2π/ 100 dengan nilai peratusan. Kemudian hasilnya ditambah kepada s
(sudut permulaan), jadi arka itu diambil dari kedudukan permulaan yang sama setiap masa. Inilah sebabnya kami menggunakannya pct * 2 * Math.PI / 100 + s
formula untuk mengira sudut akhir dalam coretan kod di atas.
7. Tambah favicon
Mari letakkan a unsur pautan favicon ke dalam HTML seksyen, sama ada secara langsung atau melalui JavaScript.
Di dalam updateLoader ()
fungsi, pertama kita ambil favicon menggunakan querySelector ()
kaedah, dan serahkannya kepada lnk
pembolehubah. Kemudian kita perlu mengeksport imej kanvas setiap kali arka dilukis ke dalam imej yang dikodkan dengan menggunakan toDataURL ()
kaedah, dan memperuntukkan kandungan URI data sebagai imej favicon. Ini mewujudkan favicon animasi iaitu sama seperti loader kanvas.
onload = function () cv = document.querySelector ('# cvl'), ctx = cv.getContext ('2d'); jika (!! ctx) s = 1.5 * Math.PI, tc = pct = 0, btn = document.querySelector ('# lbtn'), lnk = document.querySelector ('link [rel = "icon" ; ctx.lineWidth = 2; ctx.strokeStyle = 'fuchsia'; btn.addEventListener ('klik', fungsi () tc = setInterval (updateLoader, 60);); ; fungsi updateLoader () ctx.clearRect (0, 0, 16, 16); ctx.beginPath (); ctx.arc (8, 8, 6, s, (pct * 2 * Math.PI / 100 + s)); ctx.stroke (); lnk.href = cv.toDataURL ('image / png'); jika (pct === 100) clearTimeout (tc); kembali; pct ++;
Anda boleh melihat kod penuh di Github.
Bonus: Gunakan loader untuk acara async
Apabila anda perlu menggunakan animasi kanvas ini bersempena dengan tindakan pemuatan dalam laman web, tetapkan updateLoader ()
fungsi sebagai pengendali acara untuk kemajuan ()
peristiwa tindakan itu.
Sebagai contoh, JavaScript kami akan berubah seperti ini di AJAX:
onload = function () cv = document.querySelector ('# cvl'), ctx = cv.getContext ('2d'); jika (!! ctx) s = 1.5 * Math.PI, lnk = document.querySelector ('pautan [rel = "icon"]'); ctx.lineWidth = 2; ctx.strokeStyle = 'fuchsia'; var xhr = XMLHttpRequest baru (); xhr.addEventListener ('kemajuan', updateLoader); xhr.open ('GET', 'https://xyz.com/abc'); xhr.send (); ; fungsi updateLoader (evt) ctx.clearRect (0, 0, 16, 16); ctx.beginPath (); ctx.arc (8, 8, 6, s, (evt.loaded * 2 * Math.PI / evt.total + s)); ctx.stroke (); lnk.href = cv.toDataURL ('image / png');
Di dalam arka ()
kaedah, gantikan nilai peratusan [pct
] dengan dimuatkan
harta acara-ia menunjukkan berapa banyak fail telah dimuat, dan sebagai ganti 100
menggunakan jumlahnya
harta ProgressEvent, yang menandakan jumlah keseluruhan akan dimuatkan.
Ada tidak perlu setInterval ()
dalam kes sedemikian, sebagai kemajuan ()
acara itu secara automatik dipecat semasa pemuatan berlangsung.