How-to

CSS animation to Figma Motion: move real timing into your design file

Move a CSS animation to Figma Motion with real timing, easing and keyframes. Capture it with Capture Motion instead of rebuilding it by eye.

· 6 min read

A CSS animation is a precise description of motion. Most designers never get to use it that way. They get a screen recording or a link, and they rebuild the movement by eye.

This guide covers CSS animation to Figma Motion: why by-eye rebuilds drift, what a CSS animation really contains, how to convert it by hand, and how to bring in the real timing with Capture Motion instead.

Why designers re-animate CSS by eye

The animation already exists in code. The design file is where decisions get made, so the motion has to live there too. But the CSS sits in a repo or a live site, and Figma cannot read it.

So the usual path is to watch the animation, guess the numbers, and build something that looks close. It is quick to start and slow to finish.

The trouble is drift. A design file that approximates the motion gives developers a target that is slightly wrong. Developers then match the target, or ignore it and ship the original.

The fix is to start from the real numbers. The rest of this guide shows two ways to get them.

What a CSS animation actually contains

Before you move one into Figma, it helps to know the parts. Every CSS animation or transition is built from the same handful of pieces.

A Figma Motion timeline holds the same kind of data: layer properties, keyframes, durations and easing. That shared shape is what makes the conversion possible.

For a closer look at the curves, see our guide to CSS easing functions.

CSS animation to Figma Motion: the manual route

You can do this without any tool. It takes patience, and it works best for one small animation.

1. Read the CSS in DevTools

Open Chrome DevTools and inspect the animated element. In the Styles panel, look for transition and animation declarations. Then find the matching @keyframes rule further down the stylesheet.

Write down every animated property, the duration, the delay, the easing and the trigger. Check parent and child elements too, since motion is often split across several of them.

Here is a typical rule. The values are an example, not taken from a real site.

.card {
  animation: card-in 520ms cubic-bezier(.22, 1, .36, 1) 80ms both;
}

@keyframes card-in {
  from {
    opacity: 0;
    transform: translateY(24px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

From this you can read two tracks, opacity and translateY, a 520 ms duration, an 80 ms delay and one custom easing curve.

2. Convert the easing

CSS describes easing as a cubic-bezier() with four numbers, or as a keyword like ease-in-out. In Figma Motion you set easing on each keyframe or track.

Use the closest match the timeline offers. If your version lets you enter or edit a curve, enter the same four numbers. Check what your version supports, since the interface is still developing.

Keep one rule: the same curve on every track that moves together, so the parts still feel like one motion.

3. Rebuild the keyframes

Create the layer in Figma, add the animation to the timeline, and set each keyframe by hand. Match the start value, the end value, the duration and the delay for every track.

Watch for two common slips. CSS delays are in milliseconds or seconds, so check the unit. And both or forwards fill modes decide what the element looks like before and after the run.

Then play it next to the live page and compare. This works, and for a single fade it is fine. For a card with six tracks and a stagger, it is slow, and it leaves room for small mistakes.

The Capture Motion route

Capture Motion is a Chrome extension plus a Figma plugin. Instead of reading the CSS and rebuilding it, you record the animation as it plays and carry it across.

That matters for CSS because the stylesheet is only part of the story. What ran in the browser is the truth, and the capture shows every track with its true timing, easing and keyframes.

  1. Open the page in Chrome and find the animation you want to move.
  2. Open the extension. Click the Capture Motion extension icon in the toolbar.
  3. Click "Pick element on page". Then click the element you want to capture. If several children animate together, pick the container.
  4. Trigger the animation. It records while the animation plays, whether that is a hover, a click, a scroll or a page load.
  5. Review the tracks. Every track is listed with its true timing, easing and keyframes. A live preview lets you replay it. This step needs no account.
  6. Copy the capture as JSON for Figma. Sign in with a free account (Google or email) to copy or download.
  7. Paste it into the plugin. Open the Capture Motion plugin in Figma and paste. It turns the capture into a Figma Motion timeline with every keyframe editable.

The same capture can go other places too. You can copy it as an LLM prompt for ChatGPT or Claude, as HTML and CSS you can open as a working page, or as a React component. One capture serves design and code.

If you want a deeper walk through the Figma side, read how to import a website animation into Figma.

What to check after import

A capture gets you most of the way. A short review catches what is left.

When the manual route is still the right call

A capture is not always the answer. The manual route wins in a few cases.

For everything with several tracks, a stagger, or a trigger you cannot easily reproduce, recording the real thing saves time and removes the guesswork.

Where to go next

If you do not have an animation to capture yet, browse the gallery. It has ready made components you can send to Figma and edit on the timeline.

If you are also building the animation in code, see CSS keyframes to Framer Motion for the same idea on the React side.

Questions

Can I convert a CSS animation to Figma Motion?

Yes. You can rebuild it by hand from the CSS, or you can capture it with the Capture Motion extension and open it with the Capture Motion plugin, which builds a Figma Motion timeline with every keyframe editable.

Does Capture Motion read my CSS file?

No. It records the animation while it plays on the page, so you get the timing, easing and keyframes that actually ran in the browser, not only what the stylesheet says.

Which animation triggers can I capture?

The extension records while the animation plays, whether it runs on hover, click, scroll or page load. You pick the element, trigger the animation, and every track appears with its true timing.

Do I need an account?

Capturing and previewing need no account. A free account, with Google or email, is needed to copy or download a capture. Logged in users get free daily credits.