mata teras
- adalah fungsi penolong yang digunakan untuk menulis animasi yang disegerakkan dengan kitaran lukisan penyemak imbas, dengan itu mencapai kesan animasi yang lebih lancar dan lebih banyak. Ia disokong oleh semua pelayar moden dan serasi dengan pelayar yang lebih tua.
requestAnimationFrame
Fungsi - boleh direka untuk menerima satu siri fungsi sebagai parameter, yang dipanggil secara urutan, dengan itu melaksanakan urutan animasi. Fungsi ini dapat menjejaki kemajuan animasi dan mengira masa akhir animasi.
requestAnimationFrame
animate
Mewujudkan animasi lebih cekap daripada - atau
requestAnimationFrame
kerana ia berfungsi serentak dengan kadar penyegaran penyemak imbas. Ia boleh digunakan dengan mana-mana kerangka JavaScript atau perpustakaan dan boleh mengendalikan pelbagai animasi, termasuk sifat CSS, animasi kanvas, animasi SVG, dan animasi berasaskan interaksi pengguna atau pengguna.setTimeout
setInterval
Animasi elemen dom melibatkan mengubah gaya CSS setiap milisaat untuk mewujudkan ilusi gerakan. Ini bermakna lulus fungsi panggil balik ke
sekali lagi untuk beratur bingkai animasi seterusnya. setTimeout
Fungsi penolong baru ini menjadi animasi. Ia pada mulanya dilihat di Firefox 4 dan secara beransur -ansur telah diterima pakai oleh semua pelayar, termasuk IE 10. Nasib baik, mudah untuk menjadikannya serasi dengan pelayar yang lebih tua. setTimeout
requestAnimationFrame
window.requestAnimationFrame(callbackFunction);(berjalan selepas kelewatan masa yang ditentukan),
menjalankan fungsi panggil balik pada masa akan datang penyemak imbas menarik skrin. Ini membolehkan anda menyegerakkan dengan kitaran lukisan penyemak imbas supaya anda tidak terlalu kerap atau tidak cukup kerap, yang bermaksud animasi anda akan sangat lancar dan tidak membebankan CPU. setTimeout
requestAnimationFrame
Pada masa ini setiap pelayar mempunyai versi prefixed , jadi mari kita mengesan versi mana yang disokong dan merujuknya:
requestAnimationFrame
Perhatikan bagaimana kami menggunakan notasi kurungan persegi untuk mengakses sifat pada objek tetingkap. Kami menggunakan notasi kurungan persegi kerana kami membina nama harta secara dinamik menggunakan penyambungan rentetan. Jika penyemak imbas tidak menyokongnya, kami akan kembali kepada fungsi biasa yang memanggil
var _requestAnimationFrame = function(win, t) { return win["webkitR" + t] || win["r" + t] || win["mozR" + t] || win["msR" + t] || function(fn) { setTimeout(fn, 60) } }(window, "equestAnimationFrame");
setTimeout
Pembinaan fungsi animasi
Sekarang mari kita membina fungsi mudah yang akan berulang kali memanggil kami untuk mensimulasikan animasi. Untuk melaksanakan animasi, kita memerlukan fungsi luaran sebagai titik masuk dan fungsi dalaman (dipanggil fungsi langkah) yang akan dipanggil berulang kali.
window.requestAnimationFrame(callbackFunction);
Setiap kali kita memanggil fungsi langkah, kita perlu menjejaki kemajuan animasi untuk mengetahui bila ia berakhir. Kami akan mengira masa apabila animasi harus berakhir dan mengira kemajuan berdasarkan masa yang tinggal untuk setiap kitaran.
var _requestAnimationFrame = function(win, t) { return win["webkitR" + t] || win["r" + t] || win["mozR" + t] || win["msR" + t] || function(fn) { setTimeout(fn, 60) } }(window, "equestAnimationFrame");
Perhatikan bahawa kami menggunakan new Date()
untuk mendapatkan masa semasa dalam milisaat. Tanda Plus membuang objek tarikh ke jenis data angka. rate
Pembolehubah adalah nombor antara 0 dan 1, menunjukkan kadar kemajuan animasi.
Penambahbaikan fungsi anime
Sekarang kita perlu mempertimbangkan input dan output fungsi. Mari biarkan fungsi menerima fungsi dan tempoh sebagai parameter.
function animate() { var step = function() { _requestAnimationFrame(step); } step(); }
kita boleh memanggil fungsi ini seperti ini:
function animate() { var duration = 1000 * 3, // 3 秒 end = +new Date() + duration; var step = function() { var current = +new Date(), remaining = end - current; if (remaining < 60) { // 如果剩余時(shí)間少于 60 毫秒,則在此結(jié)束動(dòng)畫 return; } else { var rate = 1 - remaining / duration; // 執(zhí)行一些動(dòng)畫操作 } _requestAnimationFrame(step); } step(); }
Dalam fungsi run
, saya akan meletakkan beberapa kod yang menghidupkan lebar nod dari "100px" hingga "300px".
function animate(item) { var duration = 1000 * item.time, end = +new Date() + duration; var step = function() { var current = +new Date(), remaining = end - current; if (remaining < 60) { item.run(1); // 1 = 進(jìn)度為 100% return; } else { var rate = 1 - remaining / duration; item.run(rate); } _requestAnimationFrame(step); } step(); }
Fungsi animasi yang lebih baik
Ia berfungsi dengan baik, tetapi apa yang saya mahukan adalah dapat memasukkan pelbagai fungsi yang dipanggil dalam urutan. Dengan cara ini, selepas animasi pertama berakhir, animasi kedua akan bermula. Kami akan merawat array sebagai timbunan, muncul item satu demi satu demi satu. Mari tukar input:
animate({ time: 3, // 以秒為單位的時(shí)間 run: function(rate) { /* 使用 rate 執(zhí)行某些操作 */ } });
Apabila animasi pertama dijalankan, item
adalah null, remaining
kurang dari 60 milisaat, jadi kami pop item pertama dari array dan mula melaksanakannya. Dalam bingkai terakhir animasi, remaining
juga kurang dari 60, jadi kami melengkapkan animasi semasa, muncul item seterusnya dari array dan mula menghidupkan item seterusnya. Juga ambil perhatian bahawa saya telah lulus nilai rate
melalui formula pelonggaran. Nilai dari 0 hingga 1 kini berkembang dalam bahagian padu, menjadikannya kelihatan kurang sengit. Untuk memanggil fungsi animasi, kami melakukan perkara berikut:
animate({ time: 3, run: function(rate) { document.getElementById("box").style .width = (rate * (300 - 100) + 100) + "px"; } });
Sila ambil perhatian bahawa lebar kotak pertama berkembang, mengambil 2 saat, kemudian ketinggian berkembang, dan mengambil 2 saat.
Pengoptimuman kod
mari membersihkan kod kami sedikit. Sila ambil perhatian bahawa kami memanggil getElementById
beberapa kali, yang tidak begitu baik. Mari cache itu dan cache semasa cache nilai permulaan dan akhir.
function animate(list) { var item, duration, end = 0; var step = function() { var current = +new Date(), remaining = end - current; if (remaining < 60) { if (item) item.run(1); // 1 = 進(jìn)度為 100% item = list.shift(); // 獲取下一個(gè)項(xiàng)目 if (item) { duration = item.time * 1000; end = current + duration; item.run(0); // 0 = 進(jìn)度為 0% } else { return; } } else { var rate = remaining / duration; rate = 1 - Math.pow(rate, 3); // 緩動(dòng)公式 item.run(rate); } _requestAnimationFrame(step); }; step(); }
Perhatikan bahawa kita tidak perlu mengubahsuai fungsi utama, kerana fungsi run
sentiasa menjadi sebahagian daripada objek mandiri dan boleh mengakses semua sifat objek melalui pembolehubah this
. Sekarang, apabila kita menjalankan fungsi langkah, kita cache semua pembolehubah. Itu sahaja. Fungsi penolong animasi yang mudah yang mengambil kesempatan daripada requestAnimationFrame
dan menyediakan kejatuhan untuk pelayar yang lebih tua.
(bahagian demo skrip ditinggalkan kerana kod JavaScript tidak dapat dijalankan dalam persekitaran ini.)
(bahagian Soalan Lazim menggunakan RequestAnimationFrame untuk animasi mudah juga ditinggalkan, kerana kandungannya sangat diduplikasi dari teks asal, dan anda hanya perlu menyimpan titik teras untuk menyelesaikan pseudo-asal.)
Atas ialah kandungan terperinci Animasi ringkas menggunakan RequestAnimationFrame. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Mekanisme pengumpulan sampah JavaScript secara automatik menguruskan memori melalui algoritma pembersihan tag untuk mengurangkan risiko kebocoran ingatan. Enjin melintasi dan menandakan objek aktif dari objek akar, dan tidak bertanda dianggap sebagai sampah dan dibersihkan. Sebagai contoh, apabila objek tidak lagi dirujuk (seperti menetapkan pembolehubah kepada null), ia akan dikeluarkan dalam pusingan seterusnya kitar semula. Punca kebocoran memori yang biasa termasuk: ① Pemasa atau pendengar peristiwa yang tidak jelas; ② Rujukan kepada pembolehubah luaran dalam penutupan; ③ Pembolehubah global terus memegang sejumlah besar data. Enjin V8 mengoptimumkan kecekapan kitar semula melalui strategi seperti kitar semula generasi, penandaan tambahan, kitar semula selari/serentak, dan mengurangkan masa menyekat benang utama. Semasa pembangunan, rujukan global yang tidak perlu harus dielakkan dan persatuan objek harus dihiasi dengan segera untuk meningkatkan prestasi dan kestabilan.

Terdapat tiga cara biasa untuk memulakan permintaan HTTP dalam node.js: Gunakan modul terbina dalam, axios, dan nod-fetch. 1. Gunakan modul HTTP/HTTPS terbina dalam tanpa kebergantungan, yang sesuai untuk senario asas, tetapi memerlukan pemprosesan manual jahitan data dan pemantauan ralat, seperti menggunakan https.get () untuk mendapatkan data atau menghantar permintaan pos melalui .write (); 2.AXIOS adalah perpustakaan pihak ketiga berdasarkan janji. Ia mempunyai sintaks ringkas dan fungsi yang kuat, menyokong async/menunggu, penukaran JSON automatik, pemintas, dan lain -lain. Adalah disyorkan untuk memudahkan operasi permintaan tak segerak; 3.Node-Fetch menyediakan gaya yang serupa dengan pengambilan penyemak imbas, berdasarkan janji dan sintaks mudah

Jenis data JavaScript dibahagikan kepada jenis primitif dan jenis rujukan. Jenis primitif termasuk rentetan, nombor, boolean, null, undefined, dan simbol. Nilai -nilai tidak berubah dan salinan disalin apabila memberikan nilai, jadi mereka tidak mempengaruhi satu sama lain; Jenis rujukan seperti objek, tatasusunan dan fungsi menyimpan alamat memori, dan pembolehubah menunjuk objek yang sama akan mempengaruhi satu sama lain. Typeof dan Instanceof boleh digunakan untuk menentukan jenis, tetapi memberi perhatian kepada isu -isu sejarah TypeOfNull. Memahami kedua -dua jenis perbezaan ini dapat membantu menulis kod yang lebih stabil dan boleh dipercayai.

Helo, pemaju JavaScript! Selamat datang ke berita JavaScript minggu ini! Minggu ini kami akan memberi tumpuan kepada: Pertikaian tanda dagangan Oracle dengan Deno, objek masa JavaScript baru disokong oleh pelayar, kemas kini Google Chrome, dan beberapa alat pemaju yang kuat. Mari mulakan! Pertikaian tanda dagangan Oracle dengan percubaan Deno Oracle untuk mendaftarkan tanda dagangan "JavaScript" telah menyebabkan kontroversi. Ryan Dahl, pencipta Node.js dan Deno, telah memfailkan petisyen untuk membatalkan tanda dagangan, dan dia percaya bahawa JavaScript adalah standard terbuka dan tidak boleh digunakan oleh Oracle

Rangka kerja JavaScript mana yang terbaik? Jawapannya ialah memilih yang paling sesuai mengikut keperluan anda. 1. REACT adalah fleksibel dan bebas, sesuai untuk projek sederhana dan besar yang memerlukan penyesuaian tinggi dan keupayaan seni bina pasukan; 2. Angular menyediakan penyelesaian lengkap, sesuai untuk aplikasi peringkat perusahaan dan penyelenggaraan jangka panjang; 3. Vue mudah digunakan, sesuai untuk projek kecil dan sederhana atau perkembangan pesat. Di samping itu, sama ada terdapat timbunan teknologi sedia ada, saiz pasukan, kitaran hayat projek dan sama ada SSR diperlukan juga faktor penting dalam memilih rangka kerja. Singkatnya, tidak ada kerangka terbaik, pilihan terbaik adalah yang sesuai dengan keperluan anda.

IIFE (Segera Dilanjutkan FunctionExpression) adalah ekspresi fungsi yang dilaksanakan dengan segera selepas definisi, digunakan untuk mengasingkan pembolehubah dan mengelakkan mencemarkan skop global. Ia dipanggil dengan membungkus fungsi dalam kurungan untuk menjadikannya ungkapan dan sepasang kurungan segera diikuti olehnya, seperti (fungsi () {/code/}) ();. Penggunaan terasnya termasuk: 1. Elakkan konflik berubah -ubah dan mencegah pertindihan penamaan antara skrip berganda; 2. Buat skop peribadi untuk menjadikan pembolehubah dalaman tidak kelihatan; 3. Kod modular untuk memudahkan permulaan tanpa mendedahkan terlalu banyak pembolehubah. Kaedah penulisan biasa termasuk versi yang diluluskan dengan parameter dan versi fungsi anak panah ES6, tetapi perhatikan bahawa ungkapan dan ikatan mesti digunakan.

Janji adalah mekanisme teras untuk mengendalikan operasi tak segerak dalam JavaScript. Memahami panggilan rantaian, pengendalian ralat dan gabungan adalah kunci untuk menguasai aplikasi mereka. 1. Panggilan rantai mengembalikan janji baru melalui .then () untuk merealisasikan persamaan proses tak segerak. Setiap .then () menerima hasil sebelumnya dan boleh mengembalikan nilai atau janji; 2. Pengendalian ralat harus menggunakan .catch () untuk menangkap pengecualian untuk mengelakkan kegagalan senyap, dan boleh mengembalikan nilai lalai dalam tangkapan untuk meneruskan proses; 3. Gabungan seperti janji.all () (berjaya hanya berjaya selepas semua kejayaan), janji.race () (penyempurnaan pertama dikembalikan) dan janji.allsettled () (menunggu semua penyelesaian)

CACHEAPI adalah alat yang disediakan oleh penyemak imbas kepada permintaan rangkaian cache, yang sering digunakan bersempena dengan ServiceWorker untuk meningkatkan prestasi laman web dan pengalaman luar talian. 1. Ia membolehkan pemaju menyimpan sumber secara manual seperti skrip, helaian gaya, gambar, dan lain -lain; 2. Ia boleh memadankan tindak balas cache mengikut permintaan; 3. Ia menyokong memotong cache tertentu atau membersihkan seluruh cache; 4. Ia boleh melaksanakan keutamaan cache atau strategi keutamaan rangkaian melalui perkhidmatan pekerja yang mendengar acara mengambil; 5. Ia sering digunakan untuk sokongan luar talian, mempercepat kelajuan akses berulang, sumber utama dan kandungan kemas kini latar belakang; 6. Apabila menggunakannya, anda perlu memberi perhatian kepada kawalan versi cache, sekatan penyimpanan dan perbezaan dari mekanisme caching HTTP.
