ویژگی تصویر

انیمیشن چرخش آیکون‌ها با CSS — مقدمه‌ای کاربردی

  /  CSS   /  انیمیشن چرخش آیکون ها با CSS
بنر تبلیغاتی الف

چرخش آیکون‌ها یکی از ساده‌ترین و در عین حال تأثیرگذارترین میکروانیمیشن‌ها در رابط‌های کاربری است. این نوع انیمیشن برای نشان دادن بارگذاری، تازه‌سازی، وضعیت فعال، یا صرفاً بهبود بازخورد بصری کاربرد دارد. در این مقاله شیوه‌های عملی، نکات عملکردی و دسترسی‌پذیری، و مثال‌های عملی با کد CSS و SVG بررسی می‌شود.

مزایا و کاربردها

  • نمایش وضعیت بارگذاری یا پردازش (spinner)
  • نمایش بازخورد در دکمه‌ها (مثلاً دکمه بارگذاری مجدد)
  • افزایش قابل درک بودن تغییر وضعیت (active/idle)
  • افزایش جلوه‌های بصری بدون نیاز به تصاویر اضافی

روش‌های پایه: transition vs keyframes

برای چرخش‌های تک‌بار یا هنگام هاور/فوکوس از transition و برای چرخش پیوسته از keyframes استفاده کنید.

نمونه ساده با transition (هاور)

.icon {
  display: inline-block;
  transition: transform 0.4s ease;
}
.icon:hover {
  transform: rotate(180deg);
}

این کد باعث می‌شود هنگام هاور روی عنصر با کلاس .icon، عنصر به مدت 0.4 ثانیه دورانی 180 درجه انجام دهد. استفاده از transform به جای تغییر موقعیت (top/left) باعث می‌شود که مرورگر تنها ترکیب (composite) را انجام دهد و بازکشانی (repaint) یا چیدمان مجدد (reflow) رخ ندهد.

نمونه پیوسته با keyframes (چرخش نامحدود)

@keyframes spin {
  to { transform: rotate(360deg); }
}
.icon-spin {
  animation: spin 1s linear infinite;
}

در این مثال، عنصر با کلاس .icon-spin به‌طور مداوم می‌چرخد. استفاده از timing function خطی (linear) برای اسپین‌های ثابت و صاف مناسب است.

بهینه‌سازی عملکرد

  • دنبال کنید که همیشه از transform برای چرخش استفاده شود تا از repaint و reflow جلوگیری شود.
  • با افزودن will-change: transform به عنصری که قرار است انیمیت شود، می‌توانید به مرورگر اطلاع دهید تا بهینه‌سازی‌های لازم را انجام دهد؛ اما از overuse پرهیز کنید چون حافظه افزایش می‌یابد.
  • برای انیمیشن‌های پیچیده یا تعداد زیاد آیکون‌ها، از SVG با transform استفاده کنید چون سبک‌تر و دقیق‌تر است.

جمع‌بندی جدول مقایسه‌ای

روشعملکردمناسب برای
transform: rotateبهینه، GPU-acceleratedتمامی چرخش‌ها
top/left یا marginغیر بهینه، منجر به reflowاجتناب شود
@keyframesپیوسته/مکررspinner یا انیمیشن‌های بی‌پایان

مثال‌های عملی و نکات پیشرفته

تبدیل ناخواسته: مثال اشتباه و اصلاح آن

/* اشتباه: باعث بازچینش می‌شود */.icon {
  position: relative;
  top: 0;
  transition: top 0.4s ease;
}
.icon:hover {
  top: -5px;
  transform: rotate(180deg);
}

در مثال بالا تغییر top باعث reflow می‌شود. بهتر است جابجایی و چرخش هر دو با transform انجام شوند.

/* اصلاح شده: استفاده از transform فقط */.icon {
  display: inline-block;
  transition: transform 0.4s ease;
}
.icon:hover {
  transform: translateY(-5px) rotate(180deg);
}

در نسخه اصلاح‌شده، با یک transform ترکیبی (translateY و rotate) عملکرد بهتری داریم و مرورگر می‌تواند عملیات را در لایه‌ی ترکیب انجام دهد.

چرخش آیکون SVG — مرکزیت و box

svg.icon {
  width: 48px;
  height: 48px;
  transform-origin: center;
  transform-box: fill-box; /* مهم برای SVG */  transition: transform 0.5s ease;
}
svg.icon:hover {
  transform: rotate(90deg);
}

برای SVGها باید transform-box: fill-box و transform-origin: center را اضافه کنید تا محور چرخش دقیقاً مرکز آیکون باشد. در غیر این صورت ممکن است محور چرخش در گوشه‌ها قرار گیرد.

پیشنهاد دسترسی‌پذیری: prefers-reduced-motion

@media (prefers-reduced-motion: reduce) {
  .icon-spin,
  .icon {
    animation: none !important;
    transition: none !important;
    transform: none !important;
  }
}

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

نمونه: دکمه با آیکون چرخان هنگام کلیک (با جاوااسکریپت کمکی)

<button id="refreshBtn" aria-pressed="false">
  <svg class="refresh-icon" ...>...</svg>
</button>

.refresh-icon { transition: transform 0.6s ease; }
.refresh-icon.spin { animation: spin 1s linear infinite; }

document.getElementById('refreshBtn').addEventListener('click', function(e){
  const icon = this.querySelector('.refresh-icon');
  this.setAttribute('aria-pressed', this.getAttribute('aria-pressed') === 'true' ? 'false' : 'true');
  icon.classList.add('spin');
  // شبیه‌سازی عملیات؛ در عمل پس از پایان عملیات spin را بردارید
  setTimeout(()=> icon.classList.remove('spin'), 1500);
});

در این نمونه، با کلیک روی دکمه کلاس spin به SVG اضافه می‌شود تا انیمیشن اسپین اجرا شود و پس از 1.5 ثانیه حذف می‌شود. همچنین aria-pressed برای دسترسی‌پذیری تنظیم می‌شود. در عمل باید حذف کلاس را بر اساس پایان عملیات واقعی تعیین کنید.

نکات پیشرفته و تجربی (Expert Tips)

  • از animation-fill-mode برای کنترل حالت بعد از پایان انیمیشن استفاده کنید (مثلاً forwards).
  • در انیمیشن‌های همزمان چند آیکون، از delay یا stagger برای کاهش “jank” استفاده کنید.
  • در صورت نیاز به همگام‌سازی با JS، به‌جای تنظیم استایل مستقیم از کلاس‌ها استفاده کنید تا قابل cache شدن و ساده باشد.
  • برای چرخش سه‌بعدی از rotateX/rotateY همراه با perspective روی والد استفاده کنید و backface-visibility را مدیریت کنید.

جمع‌بندی

چرخش آیکون‌ها با CSS ابزار قدرتمندی برای بهبود تجربه کاربری است، اگر با اصول عملکردی و دسترسی‌پذیری همراه شود. همیشه از transform استفاده کنید، برای کاربران تنظیم prefers-reduced-motion را رعایت کنید و از SVG و CSS variables برای انعطاف و مقیاس‌پذیری بهره ببرید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: