ساخت انیمیشن با جاوا اسکریپت – آموزش از صفر تا صد


جاوا اسکریپت به عنوان یکی از سنگ بناهای توسعه وب امروزی قابلیتهای بسیار فراوان و گستردهای دارد و میتوان این زبان را در زمره یکی از جذابترین و در عین حال پرکاربردترین زبانهای برنامه نویسی دنیا قرار دارد. یکی از قابلیتهای جذابی که با این زبان امکانپذیر است، قابلیت ساخت انیمیشن است که در این مطلب از «مجله فرادرس» قصد داریم مفاهیم پایه و مقدماتی ساخت انیمیشن با جاوا اسکریپت را مورد بررسی قرار دهیم. در مطلب پیشِ رو قرار است که در کنار بحث در مورد ساخت انیمیشن با جاوا اسکریپت و روشهای ایجاد انیمیشنهای تعاملی، به پیادهسازی مثالهای عملی و جذابی بپردازیم. کاربران پس از خواندن این مطلب درک مطلوبی از ساخت انیمیشن با JavaScript بهدست خواهند آورد و میتوانند به عنوان نوعی تمرین جاوا اسکریپت به پیادهسازی انواع انیمیشنها بپردازند.
- میآموزید چگونه با جاوا اسکریپت انیمیشنهای تعاملی و پویا ایجاد کنید.
- یاد میگیرید از حلقه انیمیشن برای ساخت حرکت روان در مرورگر استفاده کنید.
- با کاربرد عنصر Canvas در طراحی انیمیشنهای گرافیکی آشنا میشوید.
- میتوانید پروژههایی مانند ساعت یا منظومه شمسی متحرک طراحی کنید.
- دلایل و مزایای ساخت انیمیشن با جاوا اسکریپت را میآموزید.
- مراحل ایجاد و کنترل انیمیشنهای واکنشگرا با Canvas را بررسی میکنید.
دلایل ساخت انیمیشن با جاوا اسکریپت چیست؟
انتخاب جاوا اسکریپت برای امور انیمیشنسازی مزیت متمایزی نسبت به ساخت انیمیشن با CSS و سایر فناوریهای وب دارد. ساخت انیمیشن با جاوا اسکریپت آزادی و کنترل عمل بیشتری را در مقایسه با انیمیشنهای CSS به ارمغان میآورد.
در حالی که CSS با اجازه دادن به کاربر در تنظیم نقاط شروع و پایان انیمیشن و همچنین برخی از مراحل میانی، کارها را ساده میکند اما کار واقعی و انتقال بین حالتهای انیمیشن در این مراحل بهوسیله مرورگر مدیریت میشود. اتکا به مرورگر برای انجام این کار محدودیتهای زیادی دارد زیرا کاربر باید در نوشتن دستورالعملهای خود بسیار دقیق باشد که این محدودیت به خصوص برای انیمیشنهای پیچیدهتر خودش را بهخوبی نشان میدهد. تصاویر زیر نحوه ساخت انیمیشن با CSS را نشان میدهد:

اگر انیمیشن دارای فریمهای کلیدی باشد ممکن است به چندین حالت میانی نیاز باشد، مانند تصویر زیر:

دو تصویر بالا در اصل نوعی انیمیشن نیستند و برای تبدیل تصاویر بالا به انیمیشن نیاز به درونیابی بین نقاط و اتصال آنها است که این کار به وسیله مرورگر انجام خواهد شد. تصویر زیر بیانگر این مفهوم است:

برای ساخت انیمیشن، جاوا اسکریپت به کاربر کنترل عملی بیشتری بر هر جنبه از انیمیشن میدهد. این بدان معنی است که کاربر میتواند طیف گستردهای از انیمیشنها را بدون نگرانی در مورد چالشهای فنی ایجاد کند. به عنوان مثال ساخت انیمیشن بارش برف بدون استفاده از جاوا اسکریپت در مرورگرهای وب تقریباً غیرممکن است. در ادامه این آموزش، پیچیدگیهای انیمیشنسازی با جاوا اسکریپت را بررسی خواهیم کرد.
حلقه انیمیشن در جاوا اسکریپت چیست؟
یکی از تفاوتهای فنی کلیدی بین انیمیشنهای CSS و جاوا اسکریپت، «حلقه انیمیشن» (Animation Loop) است. این حلقه تابعی محسوب میشود که در فواصل زمانی منظم، معمولاً ۶۰ بار در ثانیه اجرا شده و حاوی کدی است که مسئول تنظیم و تغییر مقادیر ویژگیهایی است که انیمیشن را تعریف میکند.
برای درک بهتر این مفهوم مثالی ذکر خواهیم کرد. در مثال فرضی ما، دایره آبی ثابتی موجود است که اگر کاربر روی دکمه فرضی «Move» که برای آن تعریفشده است، کلیک کند دایره در صفحه به سمت راست حرکت خواهد کرد.

هر بار با کلیک روی دکمه، دایره کمی به سمت راست به حرکت خود ادامه میدهد. هر سریعتر دکمه زده شود، حرکت دایره نیز سریعتر خواهد بود. با زدن کلید Move به صورت مکرر، دایره آبیرنگ از صفحه محو میشود و دوباره از سمت چپ در صفحه ظاهر خواهد شد. این حلقه پیوسته از انیمیشن چیزی است که به ما کنترل و انعطافپذیری در ایجاد حرکات پویا و جذاب میدهد. قطعه کد انیمیشن فرضی ما به صورت زیر است:
برای تعامل فعال با کدهای این مثال روی کامپیوتر شخصی خود و آزمایش آن، کار خود را با ساخت نوعی سند جدید HTML شروع خواهیم کرد و کل قطعه کد ارائهشده در بالا را کپی کرده و در سند جایگذاری میکنیم. سپس فایل را با نامی دلخواه ذخیره کرده و آن را در مرورگر وب دلخواه خود بازخواهیم کرد. پس از بارگیری، شاهد همان مثال قبلی خواهید بود که اکنون به صورت محلی در کامپیوتر ما اجرا میشود. این رویکرد عملی به کاربر امکان میدهد مفاهیم انیمیشن را به طور مستقیم کشف کرده و کد را مطابق با ترجیحات خود تنظیم کند. خروجی انیمیشن در مروگر به صوت محلی به صورت زیر است:

حال مثال فوق از ساخت انیمیشن با جاوا اسکریپت را با جزئیات دقیقتری مورد بررسی قرار میدهیم. تمرین جاوا اسکریپت بالا علاوه بر اینکه نوعی پروژه جذاب است، به عنوان آزمونی عملی از دانش پایه در HTML ،CSS و جاوا اسکریپت نیز عمل میکند. در مثال بالا، حرکت دایره با فراخوانی تابع animateهر زمان که دکمه moveرویداد کلیک را ثبت میکند، آغاز میشود که قطعه کد زیر برای انجام این کار است:
حال کدهای خود تابع animateبه صورت زیر است:
در کد بالا xPosروی صفر تنظیم شده است و با هر تماس برای متحرکسازی، مقدار آن ۱۰ واحد افزایش خواهد یافت. این افزایش، به لطف ویژگی transform، دایره را به سمت راست حرکت میدهد که کد زیر برای انجام این عمل است:
وقتی xPosبهاندازهای بزرگ شد که دایره در سمت راست ناپدید شود، xPosبه -500بازنشانی خواهد شد، طبق قطعه کد زیر:
کد بالا باعث میشود که دایره دوباره با کلیکهای متوالی روی دکمه حرکت از سمت چپ ظاهر شود. تا به اینجا همهچیز واضح و روشن است.
چیزی که الان داریم در اصل انیمیشن نیست. با کلیک بر روی دکمه move، تابع animateفعال میشود و هر بار دایره چند پیکسل به سمت راست حرکت میکند. برای اینکه دایره به صورت خودکار حرکت کند، به حلقه انیمیشن نیاز است. این حلقه انیمیشن شامل فراخوانی تابع animateبه طور مکرر در فواصل زمانی منظم است. ساخت حلقه انیمیشن به وسیله تابع requestAnimationFrameتسهیل میشود. حال کد بهروز شده در این مرحله از ساخت انیمیشن با جاوا اسکریپت به صورت زیر است:
کد بهروز شده دو تغییر کلیدی با کد اولیه دارد:
- در کد جدید به صراحت تابع animateفراخوانی شده تا به صورت خودکار اجرا شود و این قابلیت نیاز به کلیک بر روی دکمه moveرا از بین میبرد.
- در پایان تابع animate، از requestAnimationFrameبرای فراخوانی تابع animateدر هر بازه تجدید فریم استفاده شده و حلقه انیمیشن ایجاد شده است.
علاوه بر این، ما در این مثال کدهای مرتبط با دکمه حرکت را حذف میکنیم زیرا دیگر به آنها نیازی نیست ولی با این حال این کار اختیاری است. خروجی کلی انیمیشن ساخته شده با جاوا اسکریپت این بار به صورت زیر است:

تغییرات گستردهای در کدهای بالا انجام نشده است و فقط با اضافه شدن فراخوان requestAnimationFrame، تابع animateقبلی به نوعی حلقه انیمیشن جذاب تبدیل شده است. این حلقه اکنون به صورت پویا دایره آبیرنگ را با هر بهروزرسانی فریم، ۱۰ پیکسل به سمت راست حرکت میدهد.
پیچیده تر کردن انیمیشن ساخته شده با جاوا اسکریپت
در این بخش مثال بالا را کمی پیچیدهتر و جذابتر میکنیم. تا اینجا، با مفهوم حلقه انیمیشن آشنا شدیم و نوعی انیمیشن تعاملی را پیادهسازی کردیم. دایره محرک بالا را میتوان بدون کدنویسی اضافی با نوعی انیمیشن CSS که فقط شامل دو فریم کلیدی است، راحتتر ساخت. در این بخش، مثال قبلی را تقویت کرده تا واقعاً قابلیتهای انیمیشنی که کاملاً با کدهای جاوا اسکریپت ساخته شده است را به نمایش بگذاریم. برای رسیدن به این هدف کدهای زیر را به کدهای قبلی اضافه کرده و اصلاحات لازم را انجام خواهیم داد.
اصلاحاتی که در کد صورت گرفت نوعی جهش اضافی از نوع حرکت سینوسی به دایره متحرک وارد میکند که این کار فقط با کدهای جاوا اسکریپت امکانپذیر است. این بار خروجی انیمیشن ساخته شده به صورت زیر خواهد بود:

افکت پرش یا جهش تصویر بالا که به کد اضافه شده به وسیله تابع Math.sinبه دست میآید. هدف اصلی این مثال نشان دادن برخی از قابلیتهای ساخت انیمیشن در جاوا اسکریپت بود که دستیابی به آنها با استفاده از CSS به این سادگی نیست. در ادامه مثالی دیگر از ساخت انیمیشن با جاوا اسکریپت با رویکردی متفاوت ارائه خواهیم کرد.
ساخت انیمیشن با عناصر Canvas در جاوا اسکریپت
استفاده از جاوا اسکریپت برای فرمان دادن به عناصر canvas، ساخت انیمیشنها (تعاملی) را به طور قابلملاحظهای ساده میکند. در این بخش، اصول ساخت انیمیشنهای ساخته شده با عناصر canvasرا بررسی خواهیم کرد.
استفاده از این رویکرد برای ساخت انیمیشن با Javascript محدودیتهایی دارد. برای مثال هنگامیکه شکلی روی canvasکشیده میشود، ثابت میماند. برای متحرک کردن آن، ترسیم مجدد آن شکل و هر چیزی که قبل از آن شکل ترسیم شده است، لازم خواهد بود. ترسیم مجدد فریمهای پیچیده میتواند زمانبر باشد و عملکرد آن به طور قابلتوجهی بر اساس سرعت پردازش کامپیوتر متفاوت است.
Canvas در ساخت انیمیشن چیست؟
منظور از «Canvas» نوعی عنصر HTML است که فضای طراحی را در صفحه وب فراهم میکند. Canvas به توسعهدهندگان اجازه میدهد تا از جاوا اسکریپت برای دستکاری و ترسیم گرافیکها، اشکال و انیمیشنها به صورت پویا استفاده کنند. به بیانی دیگر و به صورت خلاصه عنصر Canvas ابزاری همهکاره برای ایجاد عناصر بصری تعاملی در صفحه وب است.
مراحل ساخت انیمیشن با جاوا اسکریپت به وسیله عناصر Canvas
برای ایجاد فریم در انیمیشن، مراحل زیر باید دنبال شود:
- پاک کردن canvas: اگر canvasکاملاً به وسیله اشکالی که کشیده میشود پر نشود (مثلاً هنگام استفاده از تصویر پسزمینه)، باید از متد clearRect()برای حذف هر شکلی که قبلاً ترسیم شده است، استفاده شود.
- ذخیره حالت canvas: اگر در حال ایجاد تغییراتی باشیم (مثلاً تغییر سبک و استایل) که بر وضعیت canvasتأثیر میگذارد، وضعیت فعلی canvasباید ذخیره شود. این کار تضمین میکند که قبل از ترسیم هر فریم جدید، حالت اولیه بازیابی میشود.
- رسم اشکال متحرک: مرحله اصلی که در آن رندر واقعی فریم اجرا میشود رسم اشکال متحرک است که شامل ترسیم اشکال یا عناصری خواهد بود که انیمیشن را تشکیل میدهند.
- بازیابی حالت canvas: اگر قبلاً حالت canvasذخیره شده باشد باید آن را بازیابی کرد. این کار تضمین میکند که canvasقبل از آماده شدن برای فریم بعدی به پیکربندی اصلی خود بازمیگردد.
این مراحل فرآیند اساسی برای ایجاد انیمیشنهای پویا و در حال تکامل بر روی canvasبه شیوهای ساختاریافته و سازمان یافته را تشکیل میدهند.
کنترل انیمیشن ساخته شده با Canvas
مدیریت و کنترل انیمیشن شامل کشیدن اشکال بر روی canvasبا استفاده از متدهای canvasمستقیم یا توابع سفارشی است. به طور معمول، این نقاشیها پس از پایان اجرای اسکریپت روی canvasقابلمشاهده میشوند. با این حال، برای انیمیشنها ما به متدی برای اجرای توابع در مدتزمان مشخصی نیاز داریم. راهحل بهروزرسانیهای برنامهریزیشده برای کنترل چنین انیمیشنهایی وجود دارد که عناصر زیر در آن دخیل هستند:
- setInterval(): اجرای مکرر تابع مشخصی را در هر بازه تعریفشده آغاز میکند.
- setTimeout(): تابع مشخصشده را پس از تأخیر تعیینشده اجرا میکند.
- requestAnimationFrame(callback): مرورگر را در مورد قصد انجام انیمیشن مطلع میکند و از مرورگر درخواست خواهد کرد تا قبل از ترسیم عناصر مجدد بعدی، تابع مشخصی را برای بهروزرسانی انیمیشن فراخوانی کند.
برای انیمیشنهای بدون تعامل کاربر، متد SetInterval در جاوا اسکریپت بسیار مفید است زیرا کد ارائهشده را مکرراً اجرا میکند. در سناریوهایی که شامل انیمیشنهای کنترلشده به وسیله کاربر خواهد بود، رویدادهای صفحهکلید یا ماوس میتوانند مورداستفاده قرار گیرند و setTimeout()برای آن مفید واقع خواهد شد. همچنین «AddEventListener» برای تنظیم شنونده رویداد در جاوا اسکریپت، به وسیله تعاملات کاربر باعث اجرای توابع انیمیشن میشود.
توجه: مثالهای زیر از متد window.requestAnimationFrame()برای کنترل انیمیشن استفاده میکنند. این متد با ترغیب مرورگر به فراخوانی فریم انیمیشن زمانی که سیستم آماده نقاشی کردن آن است، رویکرد روانتر و کارآمدتری برای انیمیشن ارائه میکند.
ساخت انیمیشن منظومه شمسی متحرک با جاوا اسکریپت
در این بخش از ساخت انیمیشن با جاوا اسکریپت در «مجله فرادرس»، به ساخت انیمیشن منظومه شمسی با جاوا اسکریپت با رویکرد استفاده از عناصر canvasخواهیم پرداخت. قطعه کد پایه HTML انیمیشن منظومه شمسی به صورت زیر است:
همچنین قطعه کد جاوا اسکریپت این مثال از ساخت انیمیشن به صورت زیر است:
خروجی مثال فوق در مرحله اول به صورت زیر است:

ساخت ساعت با جاوا اسکریپت
مثال زیر مربوط به ساخت ساعت با جاوا اسکریپت در قالب نوعی انیمیشن است له قطعه کد HTML آن به صورت زیر خواهد بود:
همچنین قطعه کد جاوا اسکریپت این مثال به صورت زیر است:
خروجی کدهای بالا به صورت زیر است:

توجه: در حالی که بهروزرسانیهای ساعت با سرعت یک بار در ثانیه انجام میشوند، تصویر متحرک با سرعت ۶۰ فریم در ثانیه بهروزرسانی خواهد شد که با نرخ تازهسازی نمایشگر مرورگر وب کاربر هماهنگ است.
انیمیشن پانورامای چرخشی (Loop)
مثال زیر از ساخت انیمیشن با جاوا اسکریپت مربوط به نمایش عکس پانوراما یا سراسرنما است. پانورامای پیوستهای که در این مثال ایجاد میشود از چپ به راست حرکت میکند. قطعه کد HTML آن به صورت زیر است:
HTML عنصر canvasرا که مسئول تصویر پانوراما بوده، در خود جای داده است. باید اطمینان حاصل شود که عرض و ارتفاع مشخص شده در کد HTML با مقادیر اختصاص داده شده به متغیرهای «canvasXSize» و «canvasYSize» در کد جاوا اسکریپت مطابقت دارد. قطعه کد جاوا اسکریپت مثال فوق به صورت زیر است:
خروجی کدهای بالا به صورت زیر است:

انیمیشن دنبال کردن ماوس در صفحه
آخرین انیمیشنی که قرار است در این بخش پیادهسازی آن انجام شود، انیمیشن دنبال کردن ماوس در صفحه خواهد بود که از سه بخش کد جاوا اسکریپت، HTML و Css تشکیل شده و قطعه کد HTML آن به صورت زیر است.
قطعه کد Css این پروژه جاوا اسکریپت به صورت زیر است:
در نهایت قطعه کد جاوا اسکریپت این پروژه ساخت انیمیشن با جاوا اسکریپت به صورت زیر است:
تصویر زیر نمایانگر خروجی کدهای بالا برای ساخت انمیشن دنبال کردن ماوس در صفحه است:

سخن پایانی
جاوا اسکریپت به عنوان یکی از کاربردیترین زبانهای برنامه نویسی نقش به سزایی در بهینهسازی تجربه کاربری در پلترفرمهای مبنیبر وب ارائه میکند و میتوان گفت که به طراحیها روح و جان تازهای میبخشد. یکی از مهمترین قابلیتهایی که با جاوا اسکریپت امکان پیادهسازی آن وجود دارد و در واقع یکی از کاربردهای جاوا اسکریپت محسوب میشود، امور مرتبط با انیمیشنسازی است.
در مطلب فوق از «مجله فرادرس» در کنار بررسی مفاهیم و مقدمات ساخت انیمیشن با جاوا اسکریپت، در رابطه با تفاوتها و همچنین برتریهای جاوا اسکریپت نسبت به CSS برای کارهای انیمیشنسازی سخن به میان آمد. همچنین در مطلب فوق پیادهسازی گامبهگام انیمیشنی ساده ارائه شد و به دنبال آن با رویکردی متمایز و با استفاده از عناصر canvasدر HTML، چندین مثال کاربردی نیز همراه با کدهای کامل ارائه شدند.