Rumah >hujung hadapan web >tutorial js >7 Petua Prestasi untuk Animasi JavaScript Bebas Jank
mata utama
transform
. opacity
will-change
requestAnimationFrame
untuk mengurangkan risiko ketinggalan dan memastikan animasi yang lebih lancar, kerana kaedah ini melaksanakan kod animasi pada masa terbaik untuk penyemak imbas. setTimeout/setInterval
Untuk memastikan bahawa animasi web berkompeten untuk tugas -tugas kritikal ini, adalah penting bahawa pergerakan itu mesti dilakukan dengan lancar pada waktu yang tepat supaya pengguna dapat melihatnya sebagai bantuan daripada apa -apa yang menghalang mereka daripada berusaha untuk melaksanakan aplikasi .
Reka bentuk animasi yang buruk boleh membawa kepada kesan yang menjengkelkan - Jank, yang dijelaskan oleh jankfree.org:
Pelayar moden cuba menyegarkan kandungan pada skrin serentak dengan kadar refresh peranti. Bagi kebanyakan peranti hari ini, skrin menyegarkan 60 kali sesaat, atau 60Hz. Sekiranya terdapat pergerakan pada skrin (seperti menatal, peralihan, atau animasi), penyemak imbas harus membuat 60 bingkai sesaat untuk memadankan kadar penyegaran. Stutter adalah sebarang gagap, jitter, atau jeda mudah yang pengguna melihat apabila laman web atau aplikasi gagal bersaing dengan kadar penyegaran.Jika animasi terjebak, pengguna akhirnya akan berinteraksi dengan aplikasi anda kurang dan kurang, yang akan menjejaskan kejayaannya. Jelas sekali, tiada siapa yang mahu itu.
Dalam artikel ini, saya telah mengumpul beberapa petua prestasi untuk membantu anda menyelesaikan masalah animasi JavaScript dan lebih mudah mencapai matlamat 60fps (bingkai sesaat), membolehkan gerakan lancar di rangkaian.
1.
sama ada anda bercadang untuk menggunakan kekunci kekunci CSS/CSS atau JavaScript untuk menghidupkan sifat CSS, memahami sifat mana yang menyebabkan geometri halaman berubah (susun atur) - yang bermaksud bahawa lokasi unsur -unsur lain di halaman mesti dikira semula, atau ia akan dikira semula, atau ia akan dikira semula, atau ia akan dikira semula, atau melibatkan operasi lukisan - ini sangat penting. Tugas susun atur dan lukisan sangat mahal untuk mengendalikan penyemak imbas, terutamanya apabila terdapat banyak elemen di halaman. Oleh itu, jika anda mengelakkan animasi sifat CSS yang mencetuskan pengeposan atau lukisan operasi dan melekat dengan sifat seperti transform
dan opacity
, anda akan melihat peningkatan yang ketara dalam prestasi animasi, kerana pelayar moden mengoptimumkan sifat -sifat ini dilakukan dengan sangat baik.
Pada pencetus CSS, anda boleh mencari senarai terkini sifat CSS yang mengandungi maklumat mengenai tindakan yang mereka cetus dalam setiap pelayar moden, termasuk perubahan pertama dan seterusnya.
2. Jika elemen yang dihidupkan adalah pada lapisan synthesizernya sendiri, beberapa pelayar moden akan menggunakan pecutan perkakasan untuk mengerjakan kerja ke GPU. Jika digunakan dengan betul, ini boleh memberi kesan positif terhadap prestasi animasi.
Untuk membuat elemen duduk di lapisan sendiri, anda perlu menaik tarafnya. Salah satu cara ialah menggunakan harta CSS. Harta ini membolehkan pemaju memberi amaran kepada penyemak imbas terlebih dahulu bahawa mereka mahu membuat beberapa perubahan kepada elemen supaya pelayar dapat membuat pengoptimuman yang diperlukan terlebih dahulu.
Walau bagaimanapun, tidak disyorkan agar anda mengangkat terlalu banyak elemen ke lapisan mereka sendiri, atau berbuat demikian. Malah, setiap lapisan yang dicipta oleh penyemak imbas memerlukan memori dan pengurusan, yang boleh mahal. will-change
, kelebihan dan kekurangannya dalam pengenalan Nick Salloum kepada atribut CSS akan mengubah atribut.
will-change
3.
atau . requestAnimationFrame
setTimeout/setInterval
kodnya adalah seperti berikut:
Walaupun ini berfungsi, risiko ketinggalan adalah tinggi, kerana fungsi panggil balik berjalan pada satu ketika dalam bingkai, yang mungkin pada akhirnya, yang boleh menyebabkan satu atau lebih bingkai hilang. Hari ini, anda boleh menggunakan kaedah JavaScript asli yang direka untuk animasi web yang lancar (animasi DOM, kanvas, dan lain -lain), yang dipanggil setInterval()
. setTimeout()
Jalankan kod animasi anda pada masa yang terbaik untuk penyemak imbas, biasanya pada permulaan bingkai.
<code class="language-javascript">var timer; function animateElement() { timer = setInterval(function() { // 动画代码在此处 }, 2000); } // 要停止动画,请使用 clearInterval function stopAnimation() { clearInterval(timer); }</code>kod anda mungkin kelihatan seperti ini:
<code class="language-javascript">var timer; function animateElement() { timer = setInterval(function() { // 动画代码在此处 }, 2000); } // 要停止动画,请使用 clearInterval function stopAnimation() { clearInterval(timer); }</code>
"Prestasi Kemas Kini Tim Evko dengan RequestAnimationFrame" di SitePoint menyediakan pengenalan video yang hebat mengenai pengekodan menggunakan requestAnimationFrame()
.
4. Dengan 60 bingkai sesaat, penyemak imbas hanya mempunyai 16.67ms setiap bingkai untuk melakukan tugasnya. Tidak banyak masa, jadi mengekalkan kod anda yang diselaraskan mungkin memberi kesan kepada kelancaran animasi anda.
kod decoupling yang mengendalikan menatal, mengubah saiz, peristiwa tetikus dan peristiwa lain dari kod yang menggunakan
untuk mengendalikan kemas kini skrin adalah cara yang baik untuk mengoptimumkan prestasi kod animasi.
requestAnimationFrame()
Untuk perbincangan yang mendalam tentang tip pengoptimuman ini dan kod sampel yang berkaitan, lihat Paul Lewis 'membuat animasi yang lebih kuat, lebih berkuasa, dan lebih cepat dengan RequestAnimationFrame.
5.
Pelayar menggunakan benang utama untuk menjalankan JavaScript, serta tugas lain seperti pengiraan gaya, susun atur, dan operasi lukisan. Kod JavaScript yang lama boleh menjejaskan tugas-tugas ini secara negatif, yang boleh menyebabkan bingkai dilangkau dan menyebabkan kegagapan animasi. Oleh itu, memudahkan kod anda pastinya merupakan cara yang baik untuk memastikan animasi anda berjalan lancar. Untuk operasi JavaScript kompleks yang tidak memerlukan akses kepada DOM, pertimbangkan untuk menggunakan pekerja web. Benang pekerja melakukan tugasnya tanpa menjejaskan antara muka pengguna.
6.
Alat pemaju penyemak imbas menyediakan cara untuk memantau kesukaran penyemak imbas yang menjalankan kod JavaScript anda atau perpustakaan pihak ketiga. Mereka juga memberikan maklumat praktikal mengenai kadar bingkai dan banyak lagi.
Anda boleh mengakses Chrome Devtools dengan mengklik kanan pada halaman web dan memilih semak dalam menu konteks. Sebagai contoh, menggunakan alat prestasi untuk merakam laman web anda akan memberi anda pemahaman yang mendalam tentang kesesakan prestasi pada halaman tersebut:
Klik butang "Rekod" dan berhenti rakaman selepas beberapa saat:
Pada ketika ini, anda harus mempunyai banyak data untuk membantu anda menganalisis prestasi halaman anda:
Teknik ini secara khusus berkaitan dengan mengoptimumkan kod kanvas HTML5.
Jika bingkai anda melibatkan operasi lukisan kompleks, idea yang baik adalah melakukan semua operasi lukisan sekali atau hanya sekali apabila perubahan berlaku, dan kemudian lukiskan kanvas luar skrin pada setiap bingkai.
anda boleh mencari maklumat terperinci dan contoh kod dan lebih lanjut mengenai tip ini dalam artikel kanvas pengoptimuman MDN.
Kesimpulan
Mengoptimumkan prestasi kod adalah tugas yang diperlukan jika anda tidak mahu memenuhi jangkaan pengguna pada rangkaian hari ini, tetapi ia tidak mudah. Mungkin terdapat beberapa sebab untuk prestasi animasi yang lemah, tetapi jika anda cuba menggunakan petua yang disenaraikan di atas, anda akan mengambil langkah besar ke arah mengelakkan perangkap prestasi animasi yang paling biasa, meningkatkan pengalaman pengguna laman web atau aplikasi anda.
Soalan Lazim (FAQ) pada Animasi JavaScript Tanpa Lags
Bagaimana untuk memastikan animasi JavaScript yang lancar?
, yang membolehkan penyemak imbas mengoptimumkan animasi. Anda juga boleh menggunakan peralihan CSS atau animasi untuk animasi mudah, kerana mereka umumnya lebih cekap daripada JavaScript. Di samping itu, susun atur susun atur dielakkan dengan mengikat operasi membaca dan menulis DOM bersama -sama. requestAnimationFrame
requestAnimationFrame
dalam JavaScript adalah alat utama untuk membuat animasi yang lancar. Ia memberitahu penyemak imbas bahawa anda mahu animasi dilaksanakan dan meminta penyemak imbas untuk memanggil fungsi yang ditentukan untuk mengemas kini animasi sebelum mengecat semula seterusnya. Kaedah ini membolehkan penyemak imbas mengoptimumkan animasi, menghasilkan animasi yang lebih lancar dan lebih cekap. requestAnimationFrame
Apakah susun atur susun atur dan bagaimana untuk mengelakkannya dalam animasi JavaScript?
will-change
Harta
Apakah yang dimaksudkan dengan sifat -sifat will-change
transform
dan opacity
dalam
transform
Bagaimana menggunakan pekerja web untuk meningkatkan prestasi animasi JavaScript? opacity
Animasi "Benang Bukan Main" merujuk kepada menjalankan animasi pada benang berasingan yang berasingan dari thread JavaScript utama. Ini dapat meningkatkan prestasi animasi dengan ketara, kerana ia membolehkan mereka berjalan lancar walaupun benang utama sibuk. Ini boleh dicapai dengan menggunakan animasi CSS, pekerja web, atau API animasi web.
API Animasi Web menyediakan cara untuk membuat animasi menggunakan JavaScript, yang berfungsi dengan cekap sebagai animasi CSS. Ia membolehkan anda mengawal dan memanipulasi animasi secara langsung dari JavaScript, memberikan anda fleksibiliti yang lebih besar daripada animasi CSS. Walau bagaimanapun, ia masih merupakan teknologi eksperimen dan tidak disokong sepenuhnya oleh semua pelayar.
Atas ialah kandungan terperinci 7 Petua Prestasi untuk Animasi JavaScript Bebas Jank. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!