کاربر روی «افزودن به سبد» میزند، اما دکمه تکان میخورد و هیچ وضعیت قابل فهمی نشان نمیدهد. چند ثانیه بعد دو محصول به سبد اضافه شدهاند، چون کاربر دوباره کلیک کرده است. اینجا انیمیشن زیبا نهتنها تجربه را بهتر نکرده، بلکه علت و معلول را پنهان کرده است. انیمیشن در طراحی رابط کاربری زمانی ارزش دارد که وضعیت، جهت، رابطه یا نتیجه یک عمل را روشن کند.
در این راهنما موشن گرافیک، 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 |
| Failure | timeout و خطا چگونه دیده میشوند؟ | بازگشت کنترلشده با دلیل و 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 hover | cubic-bezier(0.22, 1, 0.36, 1) |
| motion-move | drawer و جابهجایی | cubic-bezier(0.25, 1, 0.5, 1) |
| motion-color | رنگ، background و opacity ساده | 200ms ease |
| motion-none | Reduced Motion/keyboard/theme switch | 0ms |
برای ورود 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 | کنترل |
|---|---|---|
| INP | handler و layout سنگین پیش از frame | بازخورد اولیه سریع، task شکسته و property ارزان |
| CLS | ورود عنصر با تغییر فضای layout | فضا از قبل رزرو و transform بصری |
| LCP | hero animation/video بار اولیه را سنگین میکند | asset budget، poster/fallback و اولویت محتوای اصلی |
| CPU/Battery | loop، 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 transition | state ساده، hover و enter/exit | کمکد و مناسب property محدود | کنترل sequence پیچیده کم |
| CSS keyframes | sequence معلوم و تکرار کنترلشده | تعریف declarative | loop و event پایان ممکن است بد استفاده شوند |
| WAAPI | play/pause/reverse و زمان پویا | دسترسی JS به engine مرورگر | مدیریت state/cleanup لازم |
| کتابخانه JS | gesture، spring، orchestration پیچیده | API و primitive آماده | bundle، abstraction و lock-in |
| SVG | آیکون و diagram برداری | مقیاسپذیر و DOM-aware | origin و accessibility باید درست باشد |
| Lottie | موشن گرافیک exportشده | workflow طراح/توسعه | JSON همیشه سبک نیست؛ renderer و asset تست شوند |
| Video | روایت/تصویر پیچیده | codec بهینه برای frameهای زیاد | حجم، autoplay، کنترل و زیرنویس |
| View Transition | تغییر نما در SPA/MPA | snapshot و 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 ثبت کند.
الگوهای فروشگاه و وباپ ایرانی
| Journey | Motion مفید | اشتباه رایج |
|---|---|---|
| افزودن به سبد | بازخورد فوری + 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 وصل کنید:
| فرضیه | Outcome | Guardrail |
|---|---|---|
| بازخورد سبد duplicate را کم میکند | نرخ کلیک تکراری و خطای سبد | INP، task time و failure rate |
| transition مرحله فرم context را بهتر میکند | completion و backtracking | Reduced 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 تجربه کاربری مفید است.
ماتریس تست انیمیشن وب
| محور | سناریو | شاهد |
|---|---|---|
| Input | mouse، touch، keyboard، screen reader | فیلم + نتیجه task/focus |
| Preference | no-preference و reduce؛ تغییر زنده | component test |
| Direction | RTL، LTR و متن دوجهته | screenshot/recording |
| Device | گوشی اقتصادی/میانرده، desktop و WebView | trace و dropped frames |
| Network | کند، offline، timeout و retry | state transition log |
| Lifecycle | open-close سریع، route change، unmount | بدون ghost/exception/leak |
| Content | متن بلند فارسی، zoom و font late-load | بدون clipping/CLS |
| Performance | CPU throttle، long task و theme switch | Performance trace/INP |
| Accessibility | pause/stop/hide، flash و focus order | issue + 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 کنید.
مطالب مرتبط
- راهنمای جامع طراحی تجربه کاربری
- بهینهسازی UX فروشگاه اینترنتی
- تصمیمگیری UX با داده و آزمایش
- Core Web Vitals، RUM و بهینهسازی INP
- محاسبه ROI تجربه کاربری
- طراحی فراگیر وب با WCAG ۲.۲
- ممیزی و تست دسترسپذیری وب
- سرعت سایت، UX، سئو و تبدیل






