Skip to main content

Command Palette

Search for a command to run...

Framer Motion Tricks for Smooth Animations

Framer Motion is powerful, but restraint is what makes animations feel premium. By focusing on layout animations, easing, presence, and accessibility,

Updated
S

Detail-obsessed front-end developer focused on transforming static designs into smooth, interactive experiences. I care deeply about aesthetics, performance, and clean code.

When Animations Feel “Off”

While building my interactive portfolio, I noticed something subtle but important.
Even though the animations were technically correct, some of them didn’t feel right.

They weren’t broken.
They weren’t slow.
But they felt mechanical.

That’s when I realized something critical:

Smooth animations are not about adding motion — they’re about controlling how motion starts, flows, and ends.


The Common Mistake

Most animation issues I see come down to this:

  • Default easing everywhere

  • Same duration for all animations

  • No relationship between layout changes and motion

A typical example:

<motion.div animate={{ opacity: 1, y: 0 }} />

This works — but it doesn’t feel designed.


Trick #1: Use Layout Animations First

Instead of manually animating everything, let Framer Motion understand layout changes:

<motion.div layout>
  <Card />
</motion.div>

Why this matters:

  • Layout-based animations adapt automatically

  • No hardcoded values

  • Animations stay consistent across screen sizes

This was especially useful in my bento-grid layout, where cards rearrange dynamically.


Trick #2: Ease Matters More Than Duration

Most people tweak duration.
Professionals tweak easing.

transition={{ duration: 0.4, ease: "circOut" }}

Good easing curves:

  • "easeOut" → UI entering the screen

  • "circOut" → cards and modals

  • "anticipate" → playful micro-interactions

The right easing makes an animation feel intentional, not decorative.


Trick #3: Animate Presence, Not Just State

For conditional UI (modals, tooltips, overlays), AnimatePresence is essential:

<AnimatePresence>
  {isOpen && (
    <motion.div
      initial={{ opacity: 0, scale: 0.95 }}
      animate={{ opacity: 1, scale: 1 }}
      exit={{ opacity: 0, scale: 0.98 }}
    />
  )}
</AnimatePresence>

Benefits:

  • Clean enter/exit animations

  • No abrupt unmounting

  • Better perceived quality

This pattern is everywhere in my portfolio — from overlays to terminal panels.


Trick #4: Respect Reduced Motion

Good motion design also means knowing when not to animate.

const prefersReducedMotion =
  window.matchMedia("(prefers-reduced-motion: reduce)").matches;

Then conditionally disable motion-heavy effects.

Why this matters:

  • Accessibility

  • Performance on low-end devices

  • Professional polish


Trick #5: Animate Less Than You Think

One of the hardest lessons I learned:

If everything moves, nothing feels special.

Instead:

  • Animate entry, not idle state

  • Animate user-triggered actions, not background noise

  • Use motion to guide attention, not distract from content


Takeaway

Framer Motion is powerful, but restraint is what makes animations feel premium.
By focusing on layout animations, easing, presence, and accessibility, you can create interfaces that feel smooth, intentional, and professional.

You can see these motion patterns in action on my interactive portfolio:
https://fahim-46b.pages.dev/