Skip to content
PПромтбук
RUEN
02Motion

Микроанимации интерфейса

Hover, focus, активные состояния, toast'ы, переходы — мелкая моторика интерфейса.

Спроектируй микроанимации.

Правило №1: Анимация должна сообщать, а не украшать. Если убрать её — что станет хуже понимать?

Кандидаты на анимацию

ЭлементЧто анимироватьДлительность
Кнопка hoverbg + transform: translateY(-1px)150ms
Кнопка activescale(0.98)100ms
Focus ringopacity 0 → 1200ms
Toast появлениеslide-up + fade250ms
Toast уходfade200ms
Modal openscale + fade + backdrop300ms
Modal closescale + fade200ms
Switch toggletranslate thumb + bg250ms
Tab changeunderline slide200ms
Accordion expandheight + opacity250-350ms
Tooltipfade + small slide150ms

Easing

/* Стандартные пресеты */
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);   /* "expo-out" — для появления */
--ease-in: cubic-bezier(0.7, 0, 0.84, 0);    /* для исчезновения */
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1); /* для движения */

/* Правило: enter ≠ exit */
.enter { transition: all 250ms var(--ease-out); }
.exit  { transition: all 200ms var(--ease-in); }

Выход обычно быстрее входа.

Иерархия

  • Важное (модалка, тост): 250-400ms, видно
  • Реакция (hover, focus): 100-200ms, на грани заметности
  • Состояние (loading, transition): зависит от контекста

Reduced motion

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

Уважай это — у людей с вестибулярными проблемами анимация вызывает тошноту.

Что НЕ анимировать

  • ✗ Длинные тексты (чтение прерывается)
  • ✗ Списки которые часто обновляются (мерцание)
  • ✗ Background-images (тяжело для GPU)
  • ✗ Box-shadow одновременно с transform (jank)

Performant CSS

Анимируй только transform и opacity — они идут через compositor, не вызывают layout/paint:

/* плохо — пересчёт layout */
.bad { transition: top 200ms, left 200ms; }

/* хорошо — composite-only */
.good { transition: transform 200ms; }

/* плохо — paint */
.bad { transition: background-color 200ms, box-shadow 200ms; }

/* лучше — opacity на overlay */
.good::after { transition: opacity 200ms; }

Spring vs duration

  • Duration-based (CSS): предсказуемо, easy
  • Spring-based (Framer Motion): натуральнее, особенно для drag/release

Для UI 90% случаев duration-based достаточно.

Анти-паттерны

  • Bounce на serious UI (banking, medical)
  • Анимация на каждый чих — раздражает после 10-го раза
  • 800ms transition на hover — пользователь уже ушёл
  • Анимация загрузки которая длиннее самой загрузки

Тест

  1. Покажи новому человеку
  2. Спроси что произошло
  3. Если не может объяснить за 5 сек — анимация неэффективна

Принципы

  • Меньше — больше
  • Цель: пользователь понимает что произошло
  • Не "wow" — а "ага, ясно"
К подразделу «Motion»
Похожие промты