FA-TOOLS — Header Component
آموزش انیمیشن در css

آموزش انیمیشن در CSS: از مفاهیم پایه تا بهینه‌سازی کارایی (Performance)

فهرست مطالب مقاله

  • تفاوت CSS Transition و CSS Animation چیست؟
  • دستور keyframes@: قلب تپنده انیمیشن‌ها
  • ویژگی‌های اصلی انیمیشن در CSS
  • مفهوم timing-function و توابع cubic-bezier
  • بهینه‌سازی کارایی: اجرای ۶۰ فریم بر ثانیه با کارت گرافیک (GPU)
  • آموزش گام‌به‌گام ساخت ۳ انیمیشن کاربردی
  • کنترل انیمیشن‌ها با جاوا اسکریپت
  • پرسش‌های متداول
  • عیب‌یابی سریع مشکلات انیمیشن

خلاصه سریع و کلیدی:

انیمیشن‌های CSS امکان حرکت و تغییر حالت عناصر وب را بدون نیاز به کدهای سنگین جاوا اسکریپت فراهم می‌کنند. با یادگیری دستور @keyframes، تنظیم ویژگی‌های هشت‌گانه انیمیشن و استفاده هوشمندانه از ویژگی‌های پردازش‌شده توسط کارت گرافیک (مانند transform و opacity)، می‌توانید واسط‌های کاربری سریع، روان و خیره‌کننده‌ای بسازید که نرخ ۶۰ فریم بر ثانیه را روی تمام دستگاه‌ها حفظ کنند.

انیمیشن‌ها یکی از ابزارهای قدرتمند برای ارتقای تجربه کاربر (UX) و تعاملی‌تر کردن صفحات وب هستند. استفاده صحیح از انیمیشن در CSS باعث هدایت چشم کاربر به بخش‌های مهم، ارائه بازخورد فوری به رفتارهای او و جذاب‌تر شدن ظاهر سایت می‌شود. در این مقاله جامع، تمام ابعاد انیمیشن‌سازی در CSS را بررسی می‌کنیم تا بتوانید انیمیشن‌هایی کاملاً حرفه‌ای و بهینه‌سازی‌شده خلق کنید.

تفاوت CSS Transition و CSS Animation چیست؟

تفاوت CSS Transition و CSS Animation چیست؟

پاسخ کوتاه: CSS Transition برای تغییر حالت نرم بین دو وضعیت (مثلاً تغییر رنگ دکمه هنگام Hover) با رویداد ماشه‌انگیز استفاده می‌شود؛ اما CSS Animation برای ساخت حرکت‌های پیچیده چندمرحله‌ای، بدون نیاز به تعامل کاربر و با قابلیت تکرار مداوم طراحی شده است.

اگر تنها می‌خواهید وضعیت یک عنصر از نقطه A به نقطه B تغییر کند، Transition ابزار ساده‌تر و مناسب‌تری است. اما وقتی سناریوی حرکت شما بیش از دو فریم دارد، چرخه بی‌پایان دارد یا باید بلافاصله پس از بارگذاری صفحه شروع شود، باید به سراغ نمونه کدهای CSS مربوط به `@keyframes` و ویژگی‌های انیمیشن بروید.

ویژگی مقایسه Transition و Animation
مراحل تغییر وضعیت Transition فقط ۲ مرحله (مبدا و مقصد) دارد؛ Animation بی‌نهایت مرحله دارد.
نیاز به رویداد (Trigger) Transition معمولاً به hover یا focus نیاز دارد؛ Animation خودکار اجرا می‌شود.
کنترل تکرار و جهت Transition قابلیت تکرار خودکار ندارد؛ Animation از تکرار و تغییر جهت پشتیبانی می‌کند.
پیچیدگی کد Transition بسیار کوتاه است؛ Animation نیازمند تعریف کی‌فریم جداگانه است.

دستور keyframes@: قلب تپنده انیمیشن‌ها

دستور keyframes@: قلب تپنده انیمیشن‌ها

پاسخ کوتاه: دستور @keyframes گام‌های زمانی و استایل‌های یک انیمیشن را در طول دوره زمانی مشخص تعریف می‌کند. با درصدها (۰٪ تا ۱۰۰٪) یا کلیدواژه‌های from و to نقاط کلیدی تغییر ظاهر مشخص می‌شوند.

برای ساخت یک انیمیشن ابتدا باید الگوی حرکتی را با @keyframes نام‌گذاری و تعریف کنید، سپس آن را به عنصر مورد نظر در ساختار کدهای HTML متصل نمایید.

دو روش اصلی برای تعریف کی‌فریم‌ها وجود دارد:

  • روش ساده (from / to): مناسب برای انیمیشن‌های خطی دو مرحله‌ای.
  • روش درصدی (Percentages): مناسب برای ساخت رفتارهای پیچیده چند مرحله‌ای.
@keyframes slideAndFade {
  0% {
    opacity: 0;
    transform: translateY(20px);
  }
  50% {
    opacity: 0.5;
  }
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}

ویژگی‌های اصلی انیمیشن در CSS

ویژگی‌های اصلی انیمیشن در CSS

برای فراخوانی و کنترل یک `@keyframes` روی یک عنصر، هشت ویژگی اختصاصی وجود دارد که می‌توانید از آن‌ها استفاده کنید:

  1. animation-name: نام انیمیشن تعریف‌شده در @keyframes.
  2. animation-duration: مدت‌زمان یک دوره کامل اجرای انیمیشن (مثلاً 2s یا 500ms).
  3. animation-timing-function: نحوه شتاب‌گیری و سرعت حرکت در طول زمان (مانند ease, linear).
  4. animation-delay: میزان تاخیر قبل از شروع انیمیشن.
  5. animation-iteration-count: تعداد دفعات تکرار انیمیشن (عدد مشخص یا infinite).
  6. animation-direction: جهت اجرای انیمیشن (normal, reverse, alternate, alternate-reverse).
  7. animation-fill-mode: وضعیت عنصر قبل از شروع یا بعد از پایان انیمیشن (forwards, backwards, both, none).
  8. animation-play-state: امکان توقف یا ادامه انیمیشن (running, paused).

بررسی ویژه: animation-fill-mode

یکی از نکات گیج‌کننده برای مبتدیان، رفتار عنصر پس از اتمام انیمیشن است. به‌طور پیش‌فرض عنصر به حالت اولیه خود قبل از اجرای انیمیشن برمی‌گردد. اگر می‌خواهید عنصر استایل فریم آخر (۱۰۰٪) را حفظ کند، مقدار forwards را به این ویژگی بدهید.

سینتکس خلاصه (Shorthand)

می‌توانید تمام این ویژگی‌ها را در یک خط خلاصه کنید. ترتیب استاندارد به این صورت است:

/* name | duration | timing-function | delay | iteration-count | direction | fill-mode */
.element {
  animation: slideAndFade 2s ease-in-out 0.5s infinite alternate forwards;
}

مفهوم timing-function و توابع cubic-bezier

مفهوم timing-function و توابع cubic-bezier

نرخ تغییر سرعت در طول زمان، حس واقعی بودن حرکت را ایجاد می‌کند. دنیای واقعی خطی نیست؛ اشیا هنگام حرکت کند شروع می‌شوند، سرعت می‌گیرند و متوقف می‌شوند.

  • linear: سرعت کاملاً ثابت از ابتدا تا انتها (مناسب برای چرخش دایره‌ای).
  • ease: شروع آهسته، شتاب سریع، و پایانی بسیار آهسته (پیش‌فرض).
  • ease-in: شروع بسیار آهسته و افزایش تدریجی سرعت تا پایان.
  • ease-out: شروع سریع و کاهش تدریجی سرعت در پایان.
  • ease-in-out: شروع و پایان آهسته همراه با سرعت گرفتن در اواسط حرکت.
  • steps(n): تقسیم انیمیشن به n گام ناپیوسته (عالی برای انیمیشن‌های فریم‌به‌فریم مانند Sprite Sheet).

برای کنترل دقیق‌تر می‌توانید از منحنی بزیه یا cubic-bezier(x1, y1, x2, y2) استفاده کنید. این تابع چهار پارامتر بین 0 تا 1 می‌گیرد و امکان ساخت افکت‌های خاص مانند حالت کشسانی (Bounce / Elastic) را فراهم می‌آورد.

/* ایجاد افکت پرش و کشسانی در پایان حرکت */
.bounce-element {
  animation-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55);
}

بهینه‌سازی کارایی: اجرای ۶۰ فریم بر ثانیه با کارت گرافیک (GPU)

بهینه‌سازی کارایی: اجرای ۶۰ فریم بر ثانیه با کارت گرافیک (GPU)

پاسخ کوتاه: برای جلوگیری از لگ و کندی انیمیشن، فقط ویژگی‌های transform و opacity را انیمیت کنید. تغییر ویژگی‌هایی مانند width، height یا margin باعث محاسبه مجدد چیدمان (Layout / Reflow) توسط CPU می‌شود و فریم‌ریت سایت را به شدت کاهش می‌دهد.

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

  1. Layout (Reflow): محاسبه موقعیت و ابعاد عناصر روی صفحه.
  2. Paint (Repaint): پر کردن پیکسل‌ها و رنگ‌آمیزی متن، پس‌زمینه و حاشیه‌ها.
  3. Composite: ترکیب لایه‌های مختلف و ارسال آن‌ها به پردازنده گرافیکی (GPU).

وقتی ویژگی‌هایی مثل left یا top را تغییر می‌دهید، مرورگر مجبور است هر ۳ مرحله را برای تمام عناصر صفحه تکرار کند. اما ویژگی‌های transform و opacity مستقیم وارد مرحله Composite می‌شوند و توسط GPU پردازش می‌گردند.

نکته فنی مهم (will-change):

استفاده از ویژگی will-change: transform; به مرورگر اعلام می‌کند که این عنصر به‌زودی انیمیت خواهد شد تا آن را پیش‌دستی کرده و در لایه‌ای مجزا قرار دهد. حتماً آن را فقط برای عناصر سنگین استفاده کنید و پس از اتمام کار حذفش کنید، چرا که مصرف حافظه RAM مرورگر را افزایش می‌دهد.

ارتقای کیفیت فنی و بهینه‌سازی کدهای بخش کاربری، بخشی مهم از فرایند توسعه وب است. اگر وب‌سایت شما بر پایه وردپرس است، برای بهبود سرعت کلی سایت علاوه‌بر بهینه‌سازی کدهای انیمیشن، استفاده از افزونه‌های افزایش سرعت و کش وردپرس هم ضروری است تا بارگذاری منابع پایه بدون تاخیر انجام شود.

آموزش گام‌به‌گام ساخت ۳ انیمیشن کاربردی

۱. دکمه با افکت نبض (Pulsing Button)

این افکت برای جلب توجه کاربر به دکمه‌های فراخوان (CTA) بسیار موثر است.

.pulse-btn {
  background-color: #2563eb;
  color: #ffffff;
  border: none;
  padding: 12px 24px;
  border-radius: 6px;
  cursor: pointer;
  animation: pulse 1.5s infinite;
}

@keyframes pulse {
  0% {
    transform: scale(1);
    box-shadow: 0 0 0 0 rgba(37, 99, 235, 0.7);
  }
  70% {
    transform: scale(1.05);
    box-shadow: 0 0 0 12px rgba(37, 99, 235, 0);
  }
  100% {
    transform: scale(1);
    box-shadow: 0 0 0 0 rgba(37, 99, 235, 0);
  }
}

۲. لودر چرخنده (Spinning Loader)

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

.loader {
  width: 40px;
  height: 40px;
  border: 4px solid #f3f3f3;
  border-top: 4px solid #3498db;
  border-radius: 50%;
  animation: spin 1s linear infinite;
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

۳. ظـهور نرم کارت‌ها (Fade-in & Slide-up)

مناسب برای نمایش کارت‌های محصول یا پست‌های وبلاگ هنگام بالا آمدن صفحه.

.card {
  animation: fadeUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}

@keyframes fadeUp {
  0% {
    opacity: 0;
    transform: translateY(30px);
  }
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}

کنترل انیمیشن‌ها با جاوا اسکریپت

گرچه منطق انیمیشن درون CSS قرار می‌گیرد، اما زمان شروع، توقف یا تغییر انیمیشن‌ها معمولاً با اسنیپت‌های جاوا اسکریپت مدیریت می‌شود. شما می‌توانید رویدادهای (Events) انیمیشن را با کدهای JS شنود کنید:

  • animationstart: فراخوانی در لحظه شروع انیمیشن.
  • animationiteration: فراخوانی در پایان هر دوره تکرار انیمیشن.
  • animationend: فراخوانی هنگام به پایان رسیدن کامل انیمیشن.

برای مثال، اگر بخواهید وضعیت اجرای انیمیشن را برای بازرسانی بعدی کاربر ذخیره نمایید، می‌توانید از ذخیره‌سازی داده در مرورگر با localstorage کمک بگیرید تا حالت انیمیشن ماندگار شود.

const element = document.querySelector(‘.card’);

// شنود پایان انیمیشن
element.addEventListener(‘animationend’, () => {
  console.log(‘انیمیشن با موفقیت به پایان رسید’);
});

پرسش‌های متداول

۱. چطور انیمیشن CSS را روی گوشی‌های موبایل غیرفعال کنیم؟

با استفاده از Media Query دستور @media (prefers-reduced-motion: reduce) می‌توانید انیمیشن‌ها را برای کاربرانی که تنظیمات کاهش حرکت را در سیستم‌عامل خود فعال کرده‌اند، غیرفعال یا ساده کنید.

۲. چرا انیمیشن من در مرورگر لگ دارد و روان اجرا نمی‌شود؟

احتمالاً در حال انیمیت کردن ویژگی‌های چیدمان مثل width، height، top یا margin هستید. انیمیشن خود را فقط با استفاده از transform و opacity بازنویسی کنید.

۳. چگونه انیمیشن را پس از پایان در فریم اخر نگه داریم؟

کافی است مقدار animation-fill-mode: forwards; را به استایل عنصر اضافه کنید تا تغییرات ۱۰۰٪ کی‌فریم حفظ شوند.

۴. آیا انیمیشن‌های CSS سرعت سئو و صفحات سایت را کاهش می‌دهند؟

اگر از ویژگی‌های بهینه‌شده برای کارت گرافیک استفاده کنید، تاثیر منفی روی عملکرد مرورگر نخواهند داشت. با این حال انیمیشن‌های سنگین متعددی که همزمان اجرا می‌شوند می‌توانند پردازنده دستگاه‌های ضعیف‌تر را درگیر کنند.

عیب‌یابی سریع مشکلات انیمیشن

مشکل ۱: انیمیشن بلافاصله پرش می‌کند و به حالت اولیه برمی‌گردد.

علت: عدم تعریف animation-fill-mode.
راه‌حل: مقدار forwards یا both را اضافه کنید تا فریم پایانی حفظ شود.

مشکل ۲: تغییر کلاس جاوا اسکریپتی انیمیشن را مجدداً اجرا نمی‌کند.

علت: مرورگر تغییر کلاس را بدون ری‌فلو (Reflow) تشخیص نمی‌دهد.
راه‌حل: قبل از اضافه کردن مجدد کلاس انیمیشن با JS، دستور void element.offsetWidth; را اجرا کنید تا اجرای مجدد انیمیشن تریگر شود.

مشکل ۳: لرزش تصویر یا لبه‌های تار در طول انیمیشن transform.

علت: عدم قرارگیری پیکسل‌ها در مختصات صحیح توسط پردازنده گرافیکی.
راه‌حل: دستور backface-visibility: hidden; یا transform: translateZ(0); را به عنصر اضافه کنید.

سوالات متداول

تفاوت اصلی CSS Transition و CSS Animation چیست؟

ترنزیشن برای تغییر حالت‌های ساده بین دو وضعیت استفاده می‌شود، در حالی که انیمیشن برای ساخت حرکت‌های پیچیده، چندمرحله‌ای و تکرارشونده بدون نیاز به رویداد ماشه‌انگیز طراحی شده است.

دستور keyframes@ در CSS چه کاربردی دارد؟

این دستور گام‌های زمانی و استایل‌های انیمیشن را در طول دوره اجرا مشخص می‌کند و امکان تعیین تغییرات ظاهر عنصر در نقاط مختلف انیمیشن را فراهم می‌سازد.

چگونه انیمیشن CSS را بهینه‌سازی کنیم تا کند نشود؟

برای حفظ نرخ ۶۰ فریم بر ثانیه، بهتر است فقط ویژگی‌های transform و opacity را انیمیت کنید، زیرا این ویژگی‌ها توسط کارت گرافیک (GPU) پردازش می‌شوند.

چگونه عنصر را پس از پایان انیمیشن در وضعیت فریم آخر نگه داریم؟

کافی است مقدار forwards را برای ویژگی animation-fill-mode تنظیم کنید تا عنصر پس از اتمام اجرای انیمیشن، استایل‌های کی‌فریم پایانی را حفظ کند.

Table of Contents

آخرین نوشته‌ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *