The handoff between design and development is notoriously messy.
You spend hours crafting a beautiful, pixel-perfect layout. It looks stunning. But when it’s time to bring it to life in the browser, everything falls apart. The developer (which might also be you) has to rip the design apart, rename every layer, and figure out how to group elements just to make a simple timeline work.
If you’ve spent years working in older, rigid tools like Adobe XD, stepping into Figma’s Auto Layout features probably felt like a breath of fresh air because it mimics CSS Flexbox. But Auto Layout is only half the battle. If you want to build premium, Awwwards-level templates—like a modern CoWorker Office theme or a high-end agency portfolio—you need a system for motion.
In this guide, I am going to break down the ultimate Figma to GSAP workflow. I will show you exactly how to prepare your designs for web animation using GSAP, ensuring that your transition from static canvas to 60fps code is entirely frictionless.
The Perfect Marriage: Why Combine Three.js with GSAP?
To understand how this works, you need to separate the rendering from the motion.
Three.js is your renderer. It is a JavaScript library that simplifies WebGL, allowing you to draw 3D shapes, add lights, and position cameras on an HTML <canvas>.
However, Three.js does not have a built-in, timeline-based animation engine. If you want a 3D cube to spin smoothly, ease to a stop, and then reverse when a user clicks a button, writing that logic manually inside a requestAnimationFrame loop is a nightmare.
This is where GSAP (GreenSock Animation Platform) steps in.
Most beginners think GSAP only animates CSS classes (like .my-button). The secret is that GSAP can animate the numeric properties of ANY JavaScript object. Since a 3D mesh in Three.js is just a JavaScript object with numeric properties (like mesh.rotation.y = 0), GSAP can animate it perfectly. GSAP becomes the choreographer, and Three.js acts as the stage.
The "Static" Illusion: Why Good Design Breaks in Development
Figma is a static environment. GSAP (GreenSock Animation Platform) is a dynamic engine based on time and space.
When a designer hands off a file with a single, completed screen, they are only providing the “End State” of the animation. The developer is left guessing: Where did this text come from? Did it fade in? Did it slide up? Does the image mask expand?
To build a professional Figma to GSAP workflow, you must stop designing screens and start designing the DOM (Document Object Model). Every frame in Figma should be treated as an HTML <div>, and every text node as an <h1> or <p>.
When you design with the DOM in mind, writing the GSAP code becomes effortless.
Step 1: Naming Conventions (Coding in Figma)
This is the most critical step, and the one most often ignored.
GSAP targets elements using CSS selectors (e.g., gsap.to(".hero-title", { ... })). If your Figma layers are named “Group 12”, “Rectangle 4”, and “Frame 8”, you are creating a nightmare for the development phase.
The Rule: Name Layers Like CSS Classes
Before you consider a design “ready for motion,” go through your layer panel and rename your active elements using standard CSS naming conventions (like BEM – Block Element Modifier).
❌ Bad:
Heading,Subtext,Button Group✅ Good:
hero-heading,hero-subtext,hero-btn-wrapper
By doing this, when you export your assets or start building the structure in Elementor or raw HTML, your class names are already decided. Your GSAP script is practically writing itself.
Step 2: Grouping for GSAP Staggers and Timelines
GSAP is famous for its stagger property, which allows you to animate a list of items sequentially with a single line of code.
For example, animating a grid of portfolio cards:
gsap.from(".portfolio-card", {
y: 50,
opacity: 0,
stagger: 0.1,
ease: "power3.out"
});
For this to work cleanly in development, the design file must reflect this grouping.
The Wrapper Method
If you have four feature cards that need to stagger in, they must be housed inside a parent Frame in Figma named feature-wrapper, and each individual card must be an identical component named feature-card.
Do not leave elements floating loose on the canvas. If you want a headline, a paragraph, and a button to slide up together as one unit, wrap them in a Figma frame called content-block. This frame becomes your <div class="content-block">, which you can then target with a GSAP Timeline.
Step 3: Designing "States" (Figma Variants for Motion)
GSAP’s most powerful method for entrance animations is .fromTo(), where you explicitly define the starting position and the ending position of an element.
As a designer, if you only design the final layout, the motion is left to interpretation.
How to prepare your designs for web animation using GSAP: Use Figma’s Component Variants to design the “States” of your animation.
Initial State (State A): How does the element look before it enters the viewport? (e.g., Opacity 0%, moved 50px down on the Y-axis).
Final State (State B): The standard, pixel-perfect layout.
Hover/Active State (State C): What happens when the user interacts? (e.g., Image scales to 1.05x, cursor becomes magnetic).
Place these variants next to your main artboard. This creates a visual storyboard. When you start coding, you simply translate State A and State B into your GSAP variables.
Step 4: Asset Optimization (Preparing for the GPU)
Web animation lives and dies by the GPU (Graphics Processing Unit). If you force the browser to animate poorly exported assets, your 60fps dream will become a stuttering mess.
1. The SVG Rule
If it’s an icon, a logo, or a simple shape, export it as an SVG. However, if you plan to use GSAP’s MorphSVG or DrawSVG plugins, your Figma vectors must be clean.
Flatten your shapes: Do not use strokes if you are morphing; outline them.
Remove masks: Figma masks often translate to messy
<clipPath>elements in HTML, which are notoriously difficult to animate smoothly. Cut your shapes destructively in Figma before exporting.
2. The Raster Rule (WebP)
If you are designing a complex parallax section with heavy photography, export those images as WebP, not PNG. Large PNGs eat up VRAM, causing GSAP’s ScrollTrigger to lag when scrubbing.
Comparative Table: Static Design vs. Motion-Ready Design
To visualize the shift in workflow, refer to this matrix:
| Workflow Step | The “Static” Designer | The “Motion-Ready” Architect |
| Layer Naming | “Frame 142”, “Vector 2” | .hero-title, .btn-primary |
| Structure | Loose elements on a canvas | Strict Auto-Layout Wrappers |
| Deliverables | One polished screen | Component variants showing A/B states |
| Scroll Vision | “Just make it fade in” | Storyboarded ScrollTrigger sequences |
| Vector Exports | Messy masked groups | Flattened, optimized SVG paths |
The Hand-off: Communicating Easing and Timing
If you are handing your design off to a team—or just returning to your own file two weeks later—you need a “Motion Spec Sheet.”
In a blank area of your Figma canvas, create a text block that defines your global animation variables. GSAP relies heavily on “Easing” to make motion feel organic rather than robotic.
Example Motion Spec:
Global Entrance Duration:
1.2sGlobal Easing:
power4.out(Snappy start, slow finish)Stagger Delay:
0.1sScroll Scrubbing Friction:
scrub: 1
By defining these in Figma, you create a “Motion System” that is just as strict as your color palette or typography system.
FAQ: Common Design-to-Dev Hurdles
Q1: How do I prototype GSAP ScrollTrigger effects directly in Figma? A: The short answer is: you can’t, not perfectly. Figma’s native prototyping is great for click interactions, but it lacks the logic to tie animation progress to a scrollbar position. The best practice is to design the “Start” and “End” frames in Figma, and use a tool like CodePen to prototype the actual GSAP ScrollTrigger logic.
Q2: Does Figma’s Auto Layout mess up GSAP transforms? A: Auto Layout translates to CSS Flexbox or Grid. You should never animate the layout properties (width, height, margins) of an Auto Layout child, as this causes layout thrashing. Instead, use GSAP to animate the transform (x, y, scale) of the elements inside the Auto Layout wrapper.
Q3: How do I handle responsive animations across mobile and desktop? A: A complex pinning animation on Desktop often ruins the UX on a mobile phone. In Figma, design a simplified animation state for your mobile breakpoints. When coding, you will use GSAP’s ScrollTrigger.matchMedia() to tell the browser to run the complex timeline on desktop, and a simple fade-in timeline on mobile.
Conclusion & Next Steps
Mastering the Figma to GSAP workflow is the defining characteristic of a top-tier creative developer.
It stops the friction between the visual idea and the technical execution. By treating your Figma canvas as a direct blueprint for the DOM—using CSS naming conventions, grouping for staggers, and defining your states visually—you eliminate the guesswork.
You know exactly how to prepare your designs for web animation using GSAP, which means you can spend less time fighting spaghetti code and more time fine-tuning that perfect 60fps easing curve.
Ready to build? Open your current Figma project, hit Cmd + R (or Ctrl + R), and start renaming those layers like a developer.


