انیمیشن در طراحی رابط کاربری؛ UX، سرعت و دسترس‌پذیری

کاربر روی «افزودن به سبد» می‌زند، اما دکمه تکان می‌خورد و هیچ وضعیت قابل فهمی نشان نمی‌دهد. چند ثانیه بعد دو محصول به سبد اضافه شده‌اند، چون کاربر دوباره کلیک کرده است. اینجا انیمیشن زیبا نه‌تنها تجربه را بهتر نکرده، بلکه علت و معلول را پنهان کرده است. انیمیشن در طراحی رابط کاربری زمانی ارزش دارد که وضعیت، جهت، رابطه یا نتیجه یک عمل را روشن کند.

در این راهنما موشن گرافیک، UI Motion و میکروانیمیشن را از هم جدا می‌کنیم؛ سپس برای هدف، زمان، easing، دسترس‌پذیری، performance، RTL و سنجش اثر یک قرارداد عملی می‌سازیم. نمونه‌های CSS و Web Animations API، الگوی Reduced Motion، تست روی موبایل‌های رایج ایران و برنامه ۳۰روزه نیز آمده است.

پاسخ کوتاه: انیمیشن چه زمانی UX را بهتر می‌کند؟

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

پرسش پیش از ساختپاسخ قابل قبولنشانه توقف
کاربر بعد از حرکت چه چیزی را بهتر می‌فهمد؟وضعیت، مقصد یا نتیجه مشخص«صفحه مدرن‌تر می‌شود»
اگر اجرا نشود چه می‌شود؟معنای ثابت همچنان در دسترس استاطلاعات فقط با حرکت منتقل می‌شود
آیا عمل را معطل می‌کند؟خیر؛ تعامل قابل قطع و ادامه استکاربر باید پایان نمایش را صبر کند
آیا Reduced Motion دارد؟حرکت فضایی حذف یا جایگزین می‌شودتنها گزینه، اجرای کامل است
اثر چگونه سنجیده می‌شود؟فرضیه، KPI و guardrail مشخص استمعیار فقط سلیقه تیم است

حرکت «ضرورت هر سایت مدرن» نیست. برای فهم کل Journey و مسئله کاربر، ابتدا راهنمای طراحی تجربه کاربری را ببینید؛ motion یکی از ابزارهای آن فرایند است، نه جایگزین تحقیق و تست.

موشن گرافیک، UI Motion و میکروانیمیشن چه تفاوتی دارند؟

نوعهدف اصلینمونه وبریسک غالب
Motion graphicsروایت یا توضیحدموی فرایند ارسال یا ویدیوی heroحجم، autoplay، حواس‌پرتی و نبود جایگزین
UI Motionتوضیح تغییر رابطبازشدن drawer از محل منطقیکندی، گیجی فضایی و motion sickness
Microinteractionبازخورد یک عمل کوچکدکمه در حالت pending/success/errorبازخورد مبهم یا تکیه به رنگ/حرکت
Data animationنمایش تغییر مقدار/رابطهبه‌روزرسانی نمودار فروشتحریف مقیاس یا سخت‌شدن مقایسه
Decorative motionشخصیت و لذتتزئین کوتاه پس از موفقیتتکرار، مزاحمت و هزینه performance

یک فایل Lottie در hero معمولاً موشن گرافیک است؛ تغییر واضح حالت دکمه UI feedback؛ و انتقال کارت محصول به صفحه جزئیات، UI Motion. این تفکیک کمک می‌کند ابزار و معیار درست انتخاب شود. موشن گرافیک با نرخ تکمیل پیام سنجیده می‌شود، اما میکروتعامل با کاهش خطا، تکرار کلیک و زمان انجام کار.

هفت کارکرد مفید حرکت در رابط وب

۱. بازخورد و وضعیت سیستم

فشردن دکمه باید نتیجه فوری و قابل درک داشته باشد: حالت pressed، سپس pending و در پایان success یا error. انیمیشن نباید پاسخ واقعی سرور را جعل کند. تیک سبز قبل از ثبت سفارش، اعتماد را خراب می‌کند. متن وضعیت، آیکون و در صورت نیاز اعلان دسترس‌پذیر را کنار حرکت قرار دهید.

۲. پیوستگی فضایی

منو از محل trigger باز شود، popover نسبت به لبه واقعی origin بگیرد و drawer از همان سمتی وارد شود که در ساختار صفحه قرار دارد. در RTL، «سمت راست» همیشه پاسخ نیست؛ مکان trigger و جهت واقعی navigation تعیین‌کننده‌اند. scale از صفر نیز اغلب مصنوعی است؛ شروع ملایم نزدیک اندازه نهایی رابطه را بهتر حفظ می‌کند.

۳. نمایش سلسله‌مراتب و تغییر حالت

بازشدن accordion، تبدیل فیلتر به chip و رفتن فرم از مرحله اول به دوم می‌تواند ساختار را روشن کند. شرط مهم این است که focus، نام accessible و ترتیب DOM با ظاهر هماهنگ بمانند. حرکت جای heading، label یا state semantic را نمی‌گیرد.

۴. هدایت توجه

حرکت کوتاه می‌تواند خطای تازه یا تغییر قیمت را برجسته کند؛ اما pulse دائمی CTA با اعلان چشمک‌زن رقابت می‌کند و attention budget را می‌سوزاند. یک صفحه باید اولویت حرکت داشته باشد: رخداد حیاتی بر تبلیغ و تزئین مقدم است.

۵. توضیح فرایند یا مدل ذهنی

برای محصول پیچیده، انیمیشن مرحله‌ای ممکن است از متن طولانی واضح‌تر باشد. کنترل پخش، transcript/توضیح ثابت، زیرنویس و امکان پرش فراهم کنید. کاربر نباید برای دانستن قیمت یا شرط خدمت ویدیو را تا پایان ببیند.

۶. انتظار و پیشرفت

برای کار معلوم‌الحجم از progress determinate استفاده کنید؛ برای کار نامعلوم، وضعیت و امکان لغو/تلاش دوباره مهم‌تر از spinner خلاقانه است. skeleton اگر اندازه نهایی را حفظ کند می‌تواند تغییر چیدمان را کم کند، اما نباید محتوا یا سرعتی را وانمود کند که وجود ندارد. loading طولانی را با مهندسی performance حل کنید، نه با سرگرم‌کردن اجباری.

۷. شخصیت برند و لذت کنترل‌شده

حرکت برند باید پس از انجام موفق، کوتاه و غیرتکراری باشد. در بانک، درمانگاه یا پرداخت، وضوح و اطمینان از «بازیگوشی» مهم‌تر است. motion tokenهای برند می‌توانند شخصیت را در amplitude و easing نشان دهند، بدون اینکه زبان رابط را عوض کنند.

قرارداد Motion: قبل از Figma یا کدنویسی

برای هر حرکت مهم یک Motion contract بنویسید. این قرارداد اختلاف میان طراح، توسعه‌دهنده، QA و مالک محصول را کم می‌کند و از عددهای پراکنده در CSS جلوگیری می‌کند.

فیلدپرسشنمونه افزودن به سبد
Purposeچه چیزی باید فهمیده شود؟عمل ثبت شده و درخواست در حال پردازش است
Triggerکدام ورودی/رویداد؟فعال‌سازی دکمه با click/tap/keyboard
Statesحالت آغاز و پایان چیست؟idle→pending→success/error
Propertyچه چیزی تغییر می‌کند؟opacity/transform کوچک + متن وضعیت
Duration/easingریتم و منحنی چیست؟token سریع؛ نه عدد محلی تصادفی
Interruptورودی جدید چه می‌کند؟دکمه duplicate را نمی‌پذیرد؛ لغو روشن است
Reducedنسخه کاهش حرکت چیست؟تغییر آنی متن/آیکون بدون scale
Failuretimeout و خطا چگونه دیده می‌شوند؟بازگشت کنترل‌شده با دلیل و retry
Evidenceچه چیزی موفقیت را ثابت می‌کند؟تکرار کلیک، خطا، INP و task success

انیمیشن باید interruptible و input-driven باشد. اگر کاربر منو را هنگام بازشدن ببندد، motion باید از موقعیت فعلی به مقصد جدید برود، نه اینکه ابتدا سکانس قبلی را تمام کند. در درخواست شبکه، UI state را از نتیجه واقعی جدا نکنید.

زمان‌بندی: ۲۰۰ تا ۳۰۰ میلی‌ثانیه قانون قطعی نیست

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

نوعپیش‌فرض شروعنکته آزمون
رنگ/opacity hoverحدود ۲۰۰ms با easeفقط pointer دقیق؛ نه touch
Toast/menu enter۲۰۰–۲۲۰msفهم سریع بدون جهش
Drawer/moveحدود ۲۴۰msمسافت و دستگاه واقعی را بسنجید
Staggerفاصله حداکثر حدود ۵۰msلیست طولانی را معطل نکند
Illustrative motionتا حدود ۱sغیرمسدودکننده و قابل skip
Keyboard responseبدون motion تأخیریکلید، shortcut و focus فوری بمانند

برای navigation با کلیدهای جهت، shortcut، Tab و focus، انیمیشنِ پاسخ را حذف کنید؛ کاربر ماهر ورودی سریع می‌فرستد و transition می‌تواند رابط را عقب نگه دارد. ظاهر focus باید فوری و واضح باشد.

Easing چه چیزی را منتقل می‌کند؟

Easing سرعت در طول زمان را تعیین می‌کند. منحنی نامتناسب باعث می‌شود رابط سنگین، لغزنده یا بی‌ربط به input حس شود. برای شروع می‌توانید چند token محدود بسازید:

Tokenکاربردمقدار شروع
motion-enterورود و transform hovercubic-bezier(0.22, 1, 0.36, 1)
motion-movedrawer و جابه‌جاییcubic-bezier(0.25, 1, 0.5, 1)
motion-colorرنگ، background و opacity ساده200ms ease
motion-noneReduced Motion/keyboard/theme switch0ms

برای ورود UI از ease-in خالص دوری کنید؛ آغاز آهسته می‌تواند رابط را کند نشان دهد. Spring نیز مجوز bounce دائمی نیست. stiffness/damping را در کامپوننت‌های واقعی تست کنید و overshoot را برای فرم مالی، خطا و داده دقیق محدود نگه دارید.

نمونه CSS برای Toast، منو و hover

:root {
  --motion-fast: 200ms;
  --motion-ui: 220ms;
  --ease-enter: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-move: cubic-bezier(0.25, 1, 0.5, 1);
}

.toast {
  transform: translate3d(0, 6px, 0);
  opacity: 0;
  transition:
    transform var(--motion-ui) var(--ease-enter),
    opacity var(--motion-ui) var(--ease-enter);
}

.toast[data-open="true"] {
  transform: translate3d(0, 0, 0);
  opacity: 1;
}

.menu {
  transform-origin: top right;
  transform: scale(0.88);
  opacity: 0;
  transition:
    transform var(--motion-fast) var(--ease-enter),
    opacity var(--motion-fast) var(--ease-enter);
}

.menu[data-open="true"] {
  transform: scale(1);
  opacity: 1;
}

@media (hover: hover) and (pointer: fine) {
  .link {
    transition: color var(--motion-fast) ease,
                opacity var(--motion-fast) ease;
  }
  .link:hover { opacity: 0.8; }
}

منو را از scale(0) شروع نکنید؛ scale نزدیک به اندازه نهایی تغییر شدید را کم می‌کند. transform-origin باید بر اساس محل trigger و side واقعی popover تنظیم شود. برای RTL/LTR، داده موقعیت کامپوننت بهتر از حدس ثابت است.

دسترس‌پذیری Motion: Reduced Motion فقط یک checkbox نیست

حرکت بزرگ، parallax، zoom و pan می‌تواند برای بعضی افراد مبتلا به اختلالات دهلیزی، میگرن یا حساسیت به حرکت مشکل‌ساز باشد. معیار ۲.۳.۳ WCAG ۲.۲ درباره Animation from Interactions در سطح AAA می‌گوید حرکت غیرضروری ناشی از تعامل باید قابل غیرفعال‌شدن باشد، مگر اینکه برای عملکرد یا اطلاعات ضروری باشد.

مستند MDN برای prefers-reduced-motion توضیح می‌دهد که مقدار reduce ترجیح کاربر برای کم‌شدن حرکت غیرضروری را آشکار می‌کند. «کاهش» همیشه به معنی حذف هر transition نیست؛ opacity کوتاه یا تغییر آنی می‌تواند جای pan/scale را بگیرد.

@media (prefers-reduced-motion: reduce) {
  .menu,
  .toast,
  .drawer {
    transform: none;
    transition: none;
  }

  .decorative-loop {
    animation: none;
  }
}

قانون سراسری * { animation: none !important; } ممکن است indicator ضروری یا منطق وابسته به event پایان animation را بشکند. Reduced variant را در سطح component طراحی و تست کنید. اگر motion برای فهم ضروری به نظر می‌رسد، یک نمایش ثابت یا متن جایگزین بسازید.

سه معیار WCAG که باید جدا ببینید

موضوعقاعده کاربردیسطح/مرجع
حرکت ناشی از تعاملغیرضروری باید قابل disable باشد۲.۳.۳، AAA
حرکت خودکار طولانیبرای بیش از ۵ ثانیه و کنار محتوا، pause/stop/hide لازم است۲.۲.۲، A
فلشاز محتوای خطرناک و بیش از آستانه سه فلش پرهیز شود2.3.1/2.3.2

توضیح رسمی Pause, Stop, Hide میان حرکت خودکار و animation ناشی از activation تفاوت می‌گذارد. carousel، ticker و ویدیوی background را صرفاً با hover متوقف نکنید؛ کنترل باید بدون گروگان‌گرفتن focus قابل استفاده باشد. برای فرایند کامل، طراحی فراگیر با WCAG ۲.۲ و ممیزی دسترس‌پذیری وب را بخوانید.

Performance: مشکل فقط حجم فایل نیست

مرورگر برای نمایش تغییر ممکن است Style، Layout، Paint و Composite انجام دهد. انیمیشن width، height، top یا margin می‌تواند layout و paint را در هر frame فعال کند. در مقابل، transform و opacity معمولاً گزینه‌های مناسب‌تری برای compositing هستند.

راهنمای رسمی web.dev برای انیمیشن پربازده توصیه می‌کند پیش از animateکردن propertyهای دیگر، اثر آن‌ها بر rendering pipeline بررسی شود و layout/paint فقط با ضرورت پذیرفته شود. این قاعده مطلق عملکرد نیست؛ DevTools و دستگاه واقعی باید نتیجه را تأیید کنند.

قواعد اجرایی Performance

  • برای حرکت فضایی، فقط transform و opacity را پیش‌فرض بگیرید.
  • transition: all ننویسید؛ propertyهای مجاز را صریح فهرست کنید.
  • loop خارج viewport را با IntersectionObserver متوقف کنید.
  • will-change را فقط نزدیک و حین motion سنگین فعال و بعد حذف کنید.
  • blur/filter را برای تعامل اصلی animate نکنید؛ در صورت ضرورت blur را محدود نگه دارید.
  • در SVG، transform را روی wrapper <g> با origin روشن اعمال کنید.
  • در drag، مقدارهای transform را مستقیم به engine بدهید؛ CSS variable می‌تواند مسیر را کند کند.
  • هنگام theme switch، transition را موقتاً خاموش کنید تا رنگ‌ها موج‌وار عوض نشوند.
[data-theme-switching="true"] * {
  transition: none !important;
}

.animating {
  will-change: transform, opacity;
}

.icon-motion {
  transform-box: fill-box;
  transform-origin: center;
}

انباشت layer حافظه مصرف می‌کند؛ will-change دائمی راه‌حل رایگان نیست. ضبط Performance، FPS/dropped frames، forced reflow و paint را روی صفحه واقعی ببینید. راهنمای layout thrashing در web.dev نیز اثر read/write درهم بر layout و latency را نشان می‌دهد.

انیمیشن و INP، CLS و LCP

انیمیشن می‌تواند روان به نظر برسد اما interaction را کند کند. مستند INP در web.dev این معیار را سنجه responsiveness در تعامل‌های click، tap و keyboard معرفی می‌کند. handler طولانی، محاسبه layout و JavaScript سنگین می‌تواند paint بعدی و بازخورد اولیه را عقب بیندازد.

معیارریسک Motionکنترل
INPhandler و layout سنگین پیش از frameبازخورد اولیه سریع، task شکسته و property ارزان
CLSورود عنصر با تغییر فضای layoutفضا از قبل رزرو و transform بصری
LCPhero animation/video بار اولیه را سنگین می‌کندasset budget، poster/fallback و اولویت محتوای اصلی
CPU/Batteryloop، canvas یا particle دائمیpause خارج viewport و stop در Reduced Motion
Data usageویدیو/Lottie/تصویر بزرگفرمت و کیفیت متناسب، lazy load و fallback

Baseline را در Lab و Field جدا بگیرید و mobile/desktop و مسیرهای واقعی را تفکیک کنید. برای RUM، attribution و بودجه هر معیار به راهنمای Core Web Vitals و برای تصمیم سرمایه‌گذاری به راهنمای سرعت، UX و تبدیل مراجعه کنید.

CSS، WAAPI، کتابخانه، Lottie یا View Transition؟

راهکاربرای چه کاری؟مزیتهزینه/ریسک
CSS transitionstate ساده، hover و enter/exitکم‌کد و مناسب property محدودکنترل sequence پیچیده کم
CSS keyframessequence معلوم و تکرار کنترل‌شدهتعریف declarativeloop و event پایان ممکن است بد استفاده شوند
WAAPIplay/pause/reverse و زمان پویادسترسی JS به engine مرورگرمدیریت state/cleanup لازم
کتابخانه JSgesture، spring، orchestration پیچیدهAPI و primitive آمادهbundle، abstraction و lock-in
SVGآیکون و diagram برداریمقیاس‌پذیر و DOM-awareorigin و accessibility باید درست باشد
Lottieموشن گرافیک exportشدهworkflow طراح/توسعهJSON همیشه سبک نیست؛ renderer و asset تست شوند
Videoروایت/تصویر پیچیدهcodec بهینه برای frameهای زیادحجم، autoplay، کنترل و زیرنویس
View Transitionتغییر نما در SPA/MPAsnapshot و transition مرورگرsupport/focus/reading order و fallback

Web Animations API در MDN مدل timing و animation و کنترل‌هایی مانند play/pause را معرفی می‌کند. برای جابه‌جایی میان نماها، View Transition API می‌تواند SPA و MPA را پوشش دهد؛ اما feature detection، fallback، focus و ترتیب خواندن همچنان مسئولیت محصول است.

CSS همیشه سریع‌تر از JavaScript و Lottie همیشه سبک‌تر از ویدیو نیست. property، renderer، asset، main-thread work و دستگاه تعیین‌کننده‌اند. یک prototype واقعی بسازید و با data budget، CPU، حافظه، accessibility و maintainability مقایسه کنید.

نمونه WAAPI با Reduced Motion و لغوپذیری

const reduceMotion = window.matchMedia(
  '(prefers-reduced-motion: reduce)'
).matches;

let currentAnimation;

function openPanel(panel) {
  currentAnimation?.cancel();

  if (reduceMotion) {
    panel.style.opacity = '1';
    panel.style.transform = 'none';
    return;
  }

  currentAnimation = panel.animate(
    [
      { transform: 'translate3d(0, 8px, 0)', opacity: 0 },
      { transform: 'translate3d(0, 0, 0)', opacity: 1 }
    ],
    {
      duration: 220,
      easing: 'cubic-bezier(0.22, 1, 0.36, 1)',
      fill: 'both'
    }
  );
}

در محصول واقعی، تغییر زنده تنظیم سیستم را نیز با event مربوط به matchMedia مدیریت کنید، cleanup داشته باشید و visibility/focus را جدا تنظیم کنید. اگر keyboard action باید فوری باشد، مسیر بدون motion را بر اساس نوع input یا قرارداد component اجرا کنید.

سیستم طراحی Motion و Tokenها

عددهای تصادفی ۱۸۰، ۲۷۰ و ۴۰۰ میلی‌ثانیه در کامپوننت‌ها motion debt می‌سازند. یک لایه token کوچک تعریف کنید و فقط با شاهد، استثنا بسازید:

  • Duration: instant، fast، ui، illustrative؛
  • Easing: enter، move، color، linear-progress؛
  • Distance: none، subtle، component، page؛
  • Stagger: none و short؛
  • Reduced: none، opacity-only یا static-state؛
  • Priority: critical status، navigation، feedback، decorative؛
  • Input: pointer-fine، touch، keyboard و programmatic.

برای هر component در Storybook یا مستند داخلی، stateهای idle/hover/focus/active/loading/success/error/disabled، RTL، Reduced Motion و slow device را نشان دهید. Motion spec باید origin، property، interruption و cleanup را کنار duration ثبت کند.

الگوهای فروشگاه و وب‌اپ ایرانی

JourneyMotion مفیداشتباه رایج
افزودن به سبدبازخورد فوری + pending + شمارنده معتبرپرواز طولانی تصویر و duplicate click
کد یک‌بارمصرفشمارش ثابت و status خواناپرش focus، تکان مداوم و اتکای صرف به countdown
پرداختstate واضح pending/confirmed/failedنمایش success پیش از تأیید و قفل‌کردن back
فیلتر کالاحفظ context و نمایش تغییر نتایجfade همه صفحه و reset scroll
خطای فرمfocus/summary/متن و highlight کوتاهshake تنها، بدون دلیل یا مسیر اصلاح
ارسال و رهگیریprogress مرحله‌ای با timestampحرکت جعلی مستقل از وضعیت واقعی
قیمت و موجودیبرجسته‌سازی کوتاه تغییرcount-up طولانی و پنهان‌شدن عدد دقیق

در پرداخت ایرانی، response درگاه، callback و reconciliation ممکن است فاصله داشته باشند. motion نباید «موفق» را قبل از authority سمت سرور نمایش دهد. برای کل Journey خرید، راهنمای UX فروشگاه اینترنتی مرز جست‌وجو، سبد، پرداخت و پس از خرید را پوشش می‌دهد.

RTL و فارسی: Motion را فقط mirror نکنید

  • جهت enter/exit را از ساختار و trigger بگیرید، نه یک قانون «همیشه از راست».
  • آیکون جهت‌دار، breadcrumb و stepper باید semantic direction را حفظ کنند.
  • ترکیب عدد فارسی/لاتین، تومان/ریال و متن دوجهته را هنگام count animation تست کنید.
  • فونت فارسی در weight یا line-height متفاوت می‌تواند layout را حین transition تغییر دهد.
  • روی گوشی میان‌رده/اقتصادی و WebView واقعی تست کنید؛ desktop قوی نماینده بازار نیست.
  • با شبکه کند، stateهای retry/offline/timeout را نمایش دهید؛ animation loop جای status نیست.
  • در tooltip و popover، origin را پس از flip خودکار placement به‌روزرسانی کنید.

چگونه اثر Motion را اندازه بگیریم؟

«کاربران دوست داشتند» یا افزایش زمان صفحه به‌تنهایی معیار موفقیت نیست. فرضیه را به رفتار و guardrail وصل کنید:

فرضیهOutcomeGuardrail
بازخورد سبد duplicate را کم می‌کندنرخ کلیک تکراری و خطای سبدINP، task time و failure rate
transition مرحله فرم context را بهتر می‌کندcompletion و backtrackingReduced Motion، abandon و error
دموی hero فهم محصول را بالا می‌برددرک پیام و اقدام مرتبطLCP، data usage و bounce
motion فیلتر تغییر را روشن می‌کندزمان یافتن کالا و اصلاح فیلترCLS، dropped frame و scroll loss

event باید trigger، state، نتیجه و نسخه motion را ثبت کند؛ اما داده شخصی غیرضروری در telemetry نریزید. segmentهای Reduced Motion، نوع دستگاه و input را فقط با اصول حریم خصوصی و اندازه کافی تحلیل کنید. برای event dictionary، experiment و تفسیر همبستگی/علیت، راهنمای UX داده‌آگاه و برای تبدیل اثر به business case، مدل محاسبه ROI تجربه کاربری مفید است.

ماتریس تست انیمیشن وب

محورسناریوشاهد
Inputmouse، touch، keyboard، screen readerفیلم + نتیجه task/focus
Preferenceno-preference و reduce؛ تغییر زندهcomponent test
DirectionRTL، LTR و متن دوجهتهscreenshot/recording
Deviceگوشی اقتصادی/میان‌رده، desktop و WebViewtrace و dropped frames
Networkکند، offline، timeout و retrystate transition log
Lifecycleopen-close سریع، route change، unmountبدون ghost/exception/leak
Contentمتن بلند فارسی، zoom و font late-loadبدون clipping/CLS
PerformanceCPU throttle، long task و theme switchPerformance trace/INP
Accessibilitypause/stop/hide، flash و focus orderissue + retest

انیمیشن را ضبط و frame-by-frame بازبینی کنید. shift یک پیکسل، jump در آغاز و پایان، origin غلط و frame افتاده در سرعت عادی پنهان می‌مانند. تست visual را با assertion state نهایی و عدم بلوکه‌شدن interaction ترکیب کنید.

اشتباه‌های رایج در طراحی Motion

  • حرکت برای مدرن‌بودن: هدف و مسئله کاربر تعریف نشده است.
  • عدد واحد برای همه: ۳۰۰ms به context، فاصله و input بی‌توجه است.
  • animation روی keyboard: کاربر سریع را معطل و focus را مبهم می‌کند.
  • transition: all: property ناخواسته را هم animate و debug را دشوار می‌کند.
  • width/top/margin: layout و paint بی‌دلیل ایجاد می‌کنند.
  • will-change دائمی: layer و حافظه را بی‌حساب مصرف می‌کند.
  • scroll reveal برای همه محتوا: خواندن و search/find را شکننده می‌کند.
  • parallax بدون off: خطر vestibular و حواس‌پرتی دارد.
  • Reduced Motion سراسری کور: state ضروری یا event منطق را می‌شکند.
  • Lottie=همیشه سبک: asset، renderer و دستگاه سنجیده نشده‌اند.
  • spinner به‌جای status: زمان، خطا، retry و نتیجه نامعلوم می‌ماند.
  • موفقیت جعلی: UI پیش از authority سرور نتیجه را اعلام می‌کند.
  • mirror کور RTL: جهت واقعی hierarchy و trigger نادیده گرفته می‌شود.
  • سنجش با engagement: وقت بیشتر ممکن است نشانه اصطکاک باشد.

برنامه ۳۰روزه برای Motion سالم

هفته اول: inventory و حذف ریسک

  • همه motionهای auto، interaction، decorative و loading را فهرست کنید.
  • برای هرکدام purpose، owner، property و Reduced variant ثبت کنید.
  • flash، autoplay، parallax، transition:all و layout animation پرریسک را مهار کنید.
  • سه Journey پرتکرار و دستگاه نماینده ایران را برای baseline انتخاب کنید.

هفته دوم: قرارداد و token

  • duration/easing/distance/stagger/reduced/input token بسازید.
  • Toast، menu، drawer، button و form error را به state contract متصل کنید.
  • مسیر فوری keyboard و hover فقط برای pointer دقیق را پیاده کنید.
  • Reduced Motion را در componentها طراحی کنید، نه فقط در CSS global.

هفته سوم: performance و accessibility

  • propertyهای layout/paint را با transform/opacity مناسب جایگزین کنید.
  • loop خارج viewport را pause و will-change را محدود کنید.
  • INP/CLS/LCP، trace و dropped frame را روی گوشی واقعی بگیرید.
  • Reduced Motion، pause/stop/hide، focus و screen reader را retest کنید.

هفته چهارم: pilot و governance

  • یک Journey را با فرضیه و guardrail pilot کنید.
  • variant بدون motion یا motion کمتر را در مقایسه نگه دارید.
  • Motion checklist را وارد Definition of Done و code review کنید.
  • نتیجه، استثنا، debt و owner بازبینی فصلی را ثبت کنید.

چک‌لیست قبل از انتشار

  • هر حرکت purpose و state آغاز/پایان روشن دارد.
  • task به پایان animation وابسته و مسدود نیست.
  • keyboard response فوری و focus قابل مشاهده است.
  • hover فقط برای (hover: hover) and (pointer: fine) فعال است.
  • transform origin با trigger و RTL/LTR سازگار است.
  • propertyهای layout/paint فقط با دلیل و trace پذیرفته شده‌اند.
  • transition: all و will-change دائمی وجود ندارد.
  • Reduced Motion در هر component تست شده است.
  • اطلاعات فقط با حرکت، رنگ یا صدا منتقل نمی‌شود.
  • حرکت خودکار طولانی کنترل pause/stop/hide دارد.
  • stateهای timeout، retry، offline و error پوشش داده شده‌اند.
  • گوشی واقعی، CPU/network کند، RTL و متن بلند تست شده‌اند.
  • INP، CLS، LCP، dropped frames و memory guardrail دارند.
  • فرضیه outcome و معیار توقف/rollback مشخص است.

سوالات متداول درباره انیمیشن در طراحی رابط کاربری

میکروانیمیشن چیست؟

حرکت کوچک و هدفمندی است که به یک state یا تعامل مشخص پاسخ می‌دهد؛ مانند تبدیل دکمه از idle به pending و سپس success/error. ارزش آن در بازخورد و وضوح است، نه تزئین. متن، آیکون و semantic state باید بدون motion نیز قابل فهم باشند.

مدت مناسب انیمیشن رابط کاربری چقدر است؟

برای تعامل‌های رایج، ۲۰۰ تا ۳۰۰ میلی‌ثانیه نقطه شروع معقولی است، اما قانون ثابت نیست. فاصله، اندازه، دستگاه، input و هدف را تست کنید. حرکت illustrative می‌تواند طولانی‌تر باشد، به شرطی که کار را مسدود نکند. پاسخ keyboard باید فوری بماند.

CSS بهتر است یا JavaScript و Lottie؟

برای transition ساده CSS معمولاً انتخاب کم‌هزینه‌تری است. WAAPI یا کتابخانه برای کنترل زمان، gesture و orchestration پیچیده مفید است؛ Lottie برای asset روایی مناسب است. performance به property، asset، renderer و دستگاه بستگی دارد؛ prototype و trace تصمیم را مشخص می‌کنند.

چگونه انیمیشن را برای Reduced Motion طراحی کنیم؟

با prefers-reduced-motion: reduce حرکت فضایی، scale، parallax و loop غیرضروری را حذف یا با تغییر آنی/opacity کوتاه جایگزین کنید. نسخه reduced را برای هر component تست کنید و اطلاعات ضروری را به پایان animation وابسته نکنید.

آیا انیمیشن به سئو آسیب می‌زند؟

خود حرکت به‌تنهایی حکم منفی عمومی ندارد؛ اما asset سنگین، JavaScript طولانی، layout shift و تأخیر تعامل می‌تواند LCP، INP، CLS و تجربه واقعی را بدتر کند. محتوای اصلی، semantics و navigation نیز نباید فقط پس از اجرای animation در دسترس قرار گیرند.

جمع‌بندی: Motion باید علت و معلول را روشن کند

انیمیشن خوب خودش را نمایش نمی‌دهد؛ رابطه میان input، state و نتیجه را قابل فهم می‌کند. از Motion contract شروع کنید، زمان و easing را token کنید، keyboard و Reduced Motion را مسیر درجه‌یک بدانید، transform/opacity را پیش‌فرض بگیرید و نتیجه را با task success، خطا، INP و accessibility بسنجید.

بزرگ‌ترین ارتقا معمولاً افزودن animation بیشتر نیست؛ حذف حرکت‌های بی‌هدف و ساخت چند feedback قابل اتکاست. پس از یک pilot محدود، الگوهای موفق را وارد design system و Definition of Done کنید.

مطالب مرتبط

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

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