The canvas is frozen. A GIF isn't.
Figma's canvas shows stills. Smart Animate can fake a transition, but it lives behind a prototype's Play button in another window, and it only holds together while the trigger wiring does. Meanwhile the review happens on the canvas, where your loading state is a circle that never turns.
An animated GIF sidesteps the whole apparatus. Figma treats it as an image, and image fills with animation in them play directly on the canvas: no presentation mode, no setup on the viewer's end. Someone panning across the file sees the spinner turning at full speed next to your redlines. That's the entire trick, and it costs one dragged file.
The source is a short video: a screen capture of the real interaction, or a clip rendered out of After Effects or Principle. Capture it first (the screen capture guide covers grabbing UI cleanly), then convert the clip to a GIF and place it.
Where the animation plays, and where it won't
Worth being precise here, because the failure modes surprise people:
- Canvas: animated GIFs loop live, unless you zoom way out, at which point Figma pauses GIF rendering to save memory and resumes when you zoom back in.
- Present mode: the loop keeps playing, so it carries into a clickable prototype with no extra wiring.
- Fill or placed image: both animate. Drop the file on a frame and it becomes the fill of a new rectangle; pasting into an existing shape's fill works the same.
- Dev Mode and exports: one static frame. A PNG export or a handoff view flattens the GIF, by design. The motion is for review, not for the shipped asset.
One quirk to file away: each placed GIF loops on its own timer, so duplicate loaders drift out of sync across a page. Harmless, occasionally maddening. Keep one instance per artboard if it bothers you.
Clip to canvas in five minutes
Say the component spec needs the button's loading-and-success animation living next to its redlines. The path:
- Capture generously. Record the interaction with a beat of stillness before and after, so the trim has clean frames to land on.
- Convert on your machine. Drop the clip into the tool. Processing is local, which means the unreleased screen in your capture stays between you and your GPU.
- Lock a ratio and crop. 1:1 fits a button or icon spec, 9:16 a full mobile flow. A locked crop lands in your frame at proportions you chose, not whatever the recording happened to be.
- Trim for the seam. Cut so the first and last frames sit on the same resting state. The playhead steps frame by frame, so you can put the loop point exactly on the moment of stillness and the repeat becomes invisible.
- Spend frames and colors deliberately. UI motion holds up at 10 to 15 fps, and flat interface color rarely needs more than 128 palette entries. The output estimate tells you what each choice costs before you export.
- Place it. Drag the GIF onto the frame. It lands as a fill, starts looping, and your component spec now demonstrates its own timing.
GIFs are the heaviest thing in your file. Budget accordingly.
Everything you place gets stored in the document, and a GIF outweighs the PNGs and vectors around it by an order of magnitude. A dozen careless loaders will make the editor sticky for whoever's on the oldest laptop. Keeping them light is the same set of moves every time:
- Crop, then scale. A button animation doesn't owe the artboard around it anything. Tight crop first, downscale second, so no bytes go to dead pixels.
- Halve the frame rate. The difference between 30 and 12 fps is invisible in a loading spinner and enormous in the file.
- Thin the palette. Flat UI takes a 64-color cut gracefully; reach higher only for gradients or photography in frame. The small-file walkthrough runs the full sequence.
- Check the estimate. A loader can land under a few hundred KB, and the projected size updates as you tune, so you know before placing it.
Portfolio hero frame? Flip the trade: keep the frame rate up, keep the full palette, and let the readout tell you what the polish weighs.
FigJam boards, prototypes, and the handoff conversation
The same file keeps working past the mockup:
- FigJam: a loop dropped on a board plays during the crit, right next to the sticky notes. In a live session, motion that's already moving beats a link nobody opens.
- Prototypes: since GIFs animate in Present mode, a real recorded micro-interaction can ride inside a click-through, standing in for motion Figma's transitions can't reproduce.
- Handoff: a loop parked beside the redlines shows an engineer the intended easing and timing instead of two endpoint stills, which settles the comment thread before it starts.
And since the conversion never touched a server, NDA'd flows and internal tooling stay internal, from capture to canvas. The Notion guide applies the same thinking to docs, if the demo needs to live in the wiki too.