Micro-interaction ideas with Framer Motion
Delight users with subtle, SEO-friendly micro-interactions. Explore Framer Motion code samples for buttons, cards, CTA hovers, and form success states.

Micro-interactions make a web design feel polished and trustworthy. They guide attention, communicate state and improve click-through rates. Here are three motion recipes you can drop into any React + Framer Motion project.
1) Confident CTA hover
Section 1: CTA hover
Original from article + 2 alternatives.
Original
import { motion } from "framer-motion";
export function PrimaryButton({ children }) {
return (
<motion.button
className="px-6 py-3 rounded-full bg-sia-accent text-sia-on-accent font-semibold shadow-lg"
whileHover={{ scale: 1.02, y: -2, boxShadow: "0 12px 30px rgba(139, 92, 246, 0.35)" }}
whileTap={{ scale: 0.98, y: 0 }}
transition={{ type: "spring", stiffness: 260, damping: 20 }}
>
{children}
</motion.button>
);
}Alternative A
import { motion } from "framer-motion";
export function OutlineButton({ children }) {
return (
<motion.button
className="px-6 py-3 rounded-full border border-sia-white/70 text-sia-white font-semibold bg-white/5"
whileHover={{ y: -1, boxShadow: "0 10px 24px rgba(255,255,255,0.18)" }}
whileTap={{ scale: 0.97 }}
transition={{ duration: 0.2 }}
>
{children}
</motion.button>
);
}Alternative B
import { motion } from "framer-motion";
export function AccentButton({ children }) {
return (
<motion.button
className="px-6 py-3 rounded-full border border-sia-accent/60 bg-sia-accent/15 text-sia-white font-semibold"
whileHover={{ scale: 1.03, rotate: -0.4 }}
whileTap={{ scale: 0.96, rotate: 0 }}
transition={{ type: "spring", stiffness: 320, damping: 22 }}
>
{children}
</motion.button>
);
}Add a clear label (e.g. "Book a design call") and you have an accessible, conversion-minded CTA.
2) Card lift on scroll and hover
Section 2: Card lift
Original from article + 2 alternatives.
Original
const cardVariants = {
initial: { opacity: 0, y: 24 },
inView: { opacity: 1, y: 0, transition: { duration: 0.35, ease: "easeOut" } },
hover: { y: -6, boxShadow: "0 12px 30px rgba(0,0,0,0.12)" },
};Alternative A
const cardVariants = {
initial: { opacity: 0, y: 20 },
inView: { opacity: 1, y: 0, transition: { duration: 0.25, ease: "easeOut" } },
hover: { y: -3, borderColor: "rgba(139,92,246,0.7)" },
};Alternative B
const cardVariants = {
initial: { opacity: 0, y: 16 },
inView: { opacity: 1, y: 0, transition: { duration: 0.3 } },
hover: { x: 4, scale: 1.01, transition: { type: "spring", stiffness: 280, damping: 20 } },
};
Use whileInView="inView" and whileHover="hover" on each card to
keep your portfolio grid lively without overwhelming the design.
3) Success microcopy after forms
Reassure users immediately after form submission with a friendly motion.
Section 3: Success microcopy
Original from article + 2 alternatives.
Original
<motion.div
initial={{ opacity: 0, y: 8 }}
animate={{ opacity: 1, y: 0 }}
className="flex items-center gap-2 text-emerald-600"
>
<span>Success</span>
<p>Your message is in! We reply within one business day.</p>
</motion.div>Alternative A
<motion.div
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.2 }}
className="rounded-sm border border-emerald-300/50 bg-emerald-400/10 px-3 py-2"
>
Thanks! We answer in under 24h.
</motion.div>Alternative B
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.15 }}
className="text-emerald-300 font-semibold"
>
Received. Next step is on the way.
</motion.div>Best practices for motion and SEO
- Keep animations under 400ms and avoid looping effects on text.
- Respect "prefers-reduced-motion" for accessibility.
- Use motion to support content hierarchy, not distract from it.
- Measure impact: track CTA clicks and dwell time after adding interactions.
Thoughtful micro-interactions make your brand feel intentional and trustworthy. Pair them with fast load times and descriptive copy, and you will earn both human attention and search visibility.
Production implementation checklist
Firstly, define a small motion system before adding one-off animations. Secondly, map each interaction to user intent: hover should signal confidence, tap should confirm action, and success states should reduce uncertainty. For example, a CTA can scale by 1.02 and lift by 2px, while a card can move by 4-6px with a soft shadow. Moreover, this keeps interaction language consistent across landing pages, services, and contact flows.
However, avoid animating layout-critical properties that trigger expensive reflows on scroll-heavy pages. Therefore, prefer transform and opacity for smooth rendering on lower-end devices. In addition, make sure every animated state has a static fallback that still communicates hierarchy. Meanwhile, validate behavior on keyboard navigation and touch screens, because hover-only logic often breaks on mobile. Overall, small and consistent interactions usually outperform dramatic effects.
- In addition, define motion tokens for duration, easing and elevation in one shared file.
- Meanwhile, test
prefers-reduced-motionso users can disable non-essential effects. - For example, keep button transitions at 160-220ms and card transitions at 220-320ms.
- On the other hand, remove decorative loops that do not support clarity or conversion.
- Finally, document each approved pattern in your design system so teams ship faster.
Quick QA before publish
Furthermore, run a short QA round before publish and after deployment. For example, check whether CTA hover still works with live styles, whether form success messages remain readable in dark and light contexts, and whether copy buttons work on both desktop and mobile. Therefore, you catch regressions early instead of fixing them after rankings and traffic are already impacted.
Overall, this quality pass takes minutes and protects both UX and SEO. Finally, compare behavior in real browsers, not only in local preview, because caching and production CSS order can reveal issues that are invisible in development.
FAQ: Framer Motion micro-interactions
Does Framer Motion hurt page speed?
Not by default. Keep effects lightweight, animate transform/opacity, and avoid heavy layout-triggering animations on large lists. In most projects, careful usage has minimal performance impact.
What animation duration is best for CTA buttons?
A practical range is 160-220ms for button hover/tap interactions. This feels responsive without becoming jumpy, and it usually fits conversion-focused interfaces well.
How do I support prefers-reduced-motion?
Use Framer Motion's reduced motion support and provide a calm fallback with little or no movement. Keep state changes readable even when animation is disabled.
Can I use whileInView and whileHover together?
Yes. A common pattern is whileInView for entrance and whileHover for interaction feedback. Just keep motion values small so stacked effects still feel controlled.
Which metrics should I track after adding micro-interactions?
Track CTA click-through rate, form completion rate, dwell time, and bounce rate on key pages. Compare before/after in the same traffic period to avoid false conclusions.
When do micro-interactions reduce conversion?
They can hurt conversion when effects are slow, distracting, or inconsistent across components. If users have to wait or re-interpret UI states, clarity drops and friction rises.
Pillar + cluster system (long-term SEO)
A single post can rank, but a cluster scales. Build one pillar page that covers web design trends broadly, then publish smaller "micro" posts that show specific techniques like motion, typography and interaction design.
- Keep the pillar updated every 6-12 months.
- Link every cluster post back to the pillar.
- Cross-link clusters where the user journey naturally continues.
Want micro-interactions that convert?
We design and build motion systems that feel premium, load fast, and respect accessibility.
Get a quote →Pillar guide
Web Design Trends 2026 →SIA DESIGN
Design and web development
The SIA DESIGN team writes practical guides on web design, development and SEO.
Learn more about the SIA DESIGN team →