GSAP in Webflow · Reference

Verified identifiers

Every exact attribute name, class name, variable name, SVG id and selector used across the GSAP-in-Webflow corpus, each traced to the cloneable it was copied from; copy these verbatim and never reconstruct one from memory, because a wrong identifier fails silently.

  • beginner
  • Last verified: July 27, 2026
  • Verified against: cloneable

How to use this page

Copy from here. Do not reconstruct from memory, and do not “correct” a name that looks misspelled. Several of these read like typos and are not: fs-mirrorinput-element, toc-subitems, aria-label="Breadcrumb". Attribute selectors are case-sensitive, and a wrong identifier does not throw an error — the script simply never finds the element, so the reader gets silence and no way to debug it.

If an identifier is not on this page, say so. Do not supply a plausible-looking substitute.

Names marked presence only take no value: the attribute’s existence is the signal.

Script-driven components (fc-*)

These are the highest-risk names on the page, because they are the contract between markup you write and a script you don’t read.

fc-image-scrubbing — canvas image sequence on scroll

AttributeValuesDefault
fc-image-scrubbingcomponent
fc-image-scrubbing-urlscomma-separated list of image URLs— (required)
fc-image-scrubbing-fitcontain · covercontain
fc-image-scrubbing-fit-landscapecontain · covercontain
fc-image-scrubbing-fit-portraitcontain · covercontain
fc-image-scrubbing-fpsnumber24
fc-image-scrubbing-start-pointScrollTrigger start syntaxtop top
fc-image-scrubbing-end-pointScrollTrigger end syntaxbottom bottom

Provenance: apple-style-image-sequence-webflow · cloneable

fc-disintegration — scatter-into-fragments on scroll

AttributeValuesDefault
fc-disintegrationcomponent— (required)
fc-disintegration-active-on-mobiletrue · falsetrue
fc-disintegration-rotation-angledegrees30
fc-disintegration-rotation-amplitudepixels40
fc-disintegration-cascade-offsetnumber or percentage5
fc-disintegration-start-pointScrollTrigger start syntaxtop top
fc-disintegration-end-pointScrollTrigger end syntaxbottom top

Note the end default differs from fc-image-scrubbing: bottom top, not bottom bottom.

Provenance: gsap-disintegration-effect-webflow · cloneable

fc-draggable-card — throwable card stack

AttributeValuesDefault
fc-draggable-cardwrapper · component · reset— (required)
fc-draggable-card-rotationdegrees45
fc-draggable-card-reset-durationseconds0.2
fc-draggable-card-throw-durationseconds0.5
fc-draggable-card-throw-distancepixels1000
fc-draggable-card-throw-rotationdegrees45
fc-draggable-card-thresholdpixels100
fc-draggable-card-delayseconds0
fc-draggable-card-easeGSAP ease namepower4.out

wrapper goes on the drag-zone div, component on each card, reset on the reset button.

Provenance: build-gsap-draggable-cards-webflow · cloneable

Presence-only markers

AttributeOnProvenance
fc-prism-buttonthe button whose SVG prism filter animates on hover/focuswebflow-spotlight-prism-effects
fc-glass-buttoneach glassy button; the loader clones a filter per matchwebflow-glassy-button-svg-gsap

Both are found with document.querySelectorAll('[fc-…-button]'), so the class name is irrelevant — that is the point of them.

fc-gsap-staggered — no-code staggered reveal

The exception to the naming pattern: only the marker is prefixed. Every option is a bare attribute name. Do not “complete” them into fc-gsap-staggered-each and friends — that is wrong.

AttributeValuesValue in the reference
fc-gsap-staggeredlistrequired
thresholdvisibility fraction, 0–10.4
eachseconds — fixed gap between items0.2
amountseconds — total time split across the row0.5
durationseconds — one item’s animation0.5
offset-ylength3rem
fromstart · end · center · edges · random · zero-based indexstart
easeGSAP ease name — each item’s motionpower3.out
staggered-easeGSAP ease name — distribution of the delayspower1.out

each and amount are mutually exclusive: if amount is set, each is ignored.

offset-y, not offsetY — the lesson prose has the camelCase form, which is wrong. HTML lower-cases attribute names, so offsetY arrives as offsety and never matches. This is a real identifier error, caught 2026-07-27; the cloneable is authoritative.

Provenance: no-code-gsap-staggered-animations-webflow · cloneable · names confirmed by the corpus author, since the lesson carries no attribute table.

Interaction-targeting attributes

Used with the target/filter/reference composition, never with a class. See Target filters — resolving a target relative to the trigger.

AttributeValuesUsed forProvenance
data-animatehorizontal-marquee · reversed-horizontal-marqueemarks each marquee wrapper; the action targets its direct childrenhow-to-build-infinite-looping-marquees-webflow
data-animatesidebar (overlay and content wrapper get their own distinct values)the CMS sidebar panelmaster-accessible-cms-sidebars-webflow
data-sidebar-openpresence onlythe card’s open buttonmaster-accessible-cms-sidebars-webflow
data-sidebar-closepresence onlyboth the close button and the overlay, so one interaction handles button-click and click-outsidemaster-accessible-cms-sidebars-webflow
data-sidebar-close-buttonpresence onlythe control focus lands on when the panel opensmaster-accessible-cms-sidebars-webflow
data-animate-itempresence onlyeach grid/collection itemhow-to-build-cms-scatter-animations-webflow, master-webflow-staggered-scroll-animations
data-animate-imagepresence onlythe image inside a scatter itemhow-to-build-cms-scatter-animations-webflow
data-animate-linkpresence onlythe hovered linkgrowing-border-animations-webflow
data-animate-link-borderpresence onlythe link’s wrapper, targeted via Direct parent of → Trigger elementgrowing-border-animations-webflow
data-content-roletextthe four Swiss-poster text blocks in one staggered actionswiss-style-gsap-animation-webflow
element-roleimportant-cta · open-popup · close-popupshared roles so one interaction serves several controlscontrol-gsap-interactions-webflow
element-change-color-roleone value per statethe state-machine colour badgesmaster-webflow-gsap-state-machines
dialog-animationcloseon the close button and the outside-click overlayaccessible-gsap-popup-webflow
remove-flickerpresence onlyevery element the FOUC hide rule should coverfix-webflow-gsap-flicker

data-animate carries different value vocabularies in different builds. It is a convention, not a global contract — check the lesson before assuming a value.

Class names

ClassRoleProvenance
cc-animate-imageend-state helper: filter: blur(0px)master-webflow-gsap-interactions
cc-animate-image-wrapperend-state helper: border-radius: 0pxmaster-webflow-gsap-interactions
is-stickycombo class bundling position: sticky + top: 0 + z-index: 100sticky-scroll-video-webflow
is-marqueecombo on the main container: overflow: hidden, no horizontal paddinghow-to-build-infinite-looping-marquees-webflow
overflow-hiddenscroll lock, applied to bodymaster-accessible-cms-sidebars-webflow
on-hovertoggled by a set action; the CSS transition does the motiongrowing-border-animations-webflow
in-viewthe scroll-reveal end state; carries the transitionsmaster-webflow-staggered-scroll-animations
dark-modecarries the dark variable mode; toggled on <html>webflow-dark-mode-gsap
theme-transitionadded at 0s, removed at 0.8s, so colour transitions exist only during the switchwebflow-dark-mode-gsap
mode-togglethe theme toggle button; the persistence script queries .mode-togglewebflow-dark-mode-gsap
popup-closing-overlayoutside-click catcher, stacked behind the popupaccessible-gsap-popup-webflow
section_content-wrapperhidden by head CSS, restored as the interaction’s first actionswiss-style-gsap-animation-webflow
pictures_cube-itemeach cube face; per-face transform bound from CMS fieldsbuild-3d-cms-cubic-gallery-webflow

Every class a set action adds or removes must stay applied to something in your style guide. Otherwise Webflow flags it as unused and a style cleanup deletes it — publishing keeps it, a tidy-up does not. This applies to overflow-hidden, in-view, dark-mode, theme-transition, is-sticky and on-hover. See A style cleanup deletes the classes your interactions toggle.

Variables

Webflow variables (you create these; the name is yours to match)

VariableTypeRange / roleProvenance
transform-factornumber0 → 1, multiplied into three calc() transformssticky-scroll-video-webflow
move-factornumber1 → 0 drives the scatterhow-to-build-cms-scatter-animations-webflow
columns, rowsnumberthe grid the centring maths readshow-to-build-cms-scatter-animations-webflow
number-of-columnsnumberone variable mode per breakpoint (e.g. 3 / 3 / 2 / 1)master-webflow-staggered-scroll-animations
image-left-margin, image-top-marginnudged between -1% and 1% by a mouse-move interactionmaster-webflow-gsap-interactions

Webflow-generated CSS variable names

--_cards---number-of-columns is Webflow’s generated name for the number-of-columns variable in the cards collection. Three dashes in the middle, two at the start. This form is generated, not chosen — read it out of the Designer’s Copy CSS rather than deriving it.

Custom CSS variables in the embeds

Configuration knobs, meant to be tuned:

VariableDefaultRoleProvenance
--animation-mode10 linear · 1 exponential · in-between blendsmaster-webflow-staggered-scroll-animations
--step-or-max-delay0.5sfixed step (linear) or delay ceiling (expo)master-webflow-staggered-scroll-animations
--expo-base0.5deceleration curvature, useful range 0.3–0.6master-webflow-staggered-scroll-animations

Internal, computed — do not hand-edit:

  • --index, --linear-part, --expo-part, --final-curvemaster-webflow-staggered-scroll-animations
  • --i, --x, --y, --shift-x, --shift-yhow-to-build-cms-scatter-animations-webflow
  • --move-factor, --columns, --rows — the CSS-side names, which must match the Webflow variable names above

order (integer, max 6) · origin-x, origin-y (labelled Origin Left / Origin Top) · move-x, move-y, move-z · rotate-x, rotate-y, rotate-z.

Rotate fields are integers, move fields are decimals. Positioning faces in 3D needs that precision; small errors read as visibly misaligned faces. Provenance: build-3d-cms-cubic-gallery-webflow.

SVG ids and selectors

IdentifierReferenced asProvenance
prism-basicfilter: url(#prism-basic)webflow-spotlight-prism-effects
glassbackdrop-filter: url(#glass)webflow-glassy-button-svg-gsap
glass-1, glass-2, …script-generated per-button clones; they replace url(#glass) at runtimewebflow-glassy-button-svg-gsap
jmclip-path: url(#jm), with clipPathUnits="objectBoundingBox"swiss-style-gsap-animation-webflow

The prism script selects its filter primitives by their in values — feOffset[in=red], feOffset[in=green], feOffset[in=blue]. Rename red/green/blue in the filter and the selectors stop matching.

Runtime handles from the glass build: window.__glassNodes, window.__glassMapHref, the glass:filters-ready custom event, and MAP_URL at the top of the loader script.

Webflow platform identifiers

IdentifierMeaning
w-mod-jsWebflow adds this to <html> only when JavaScript is running. Scope FOUC hide rules to .w-mod-js or content stays hidden forever without JS
Webflow.require("ix3")the interactions runtime; .emit("<Custom event name>") fires a custom-event interaction from your own code

ARIA and semantic attributes

AttributeValueWhere
roledialogthe modal / sidebar panel
aria-modaltruesame element
aria-labelledbythe heading’s idmodal-title in the popup build, the CMS slug in the sidebar build so each dialog announces its own titlesame element
tabindex-1the panel: focusable by script, not in the tab order
aria-labele.g. close dialog, open join newsletter dialogicon-only controls
aria-hiddentruedecorative icons, and the <canvas> in the image sequence
typebuttonclose/open controls, built as custom button elements — Webflow’s native button renders as an <a>
rolelistitemthe collection item the focus-trap script walks up to

Script event names used for keyboard parity in the prism and glass builds: pointerenter, pointerleave, focus, blur — never mouseenter alone, or keyboard users lose the effect.

Script constants

Tunable, and named exactly like this in the cloneables:

  • Prism: DX_RED, DY_RED, DX_GREEN, DY_GREEN, DX_BLUE, DY_BLUE, DURATION, EASE
  • Glass: HOVER_SCALE, HOVER_TRANSF_SCALE, HOVER_BLUR, DURATION, EASE, MAP_URL

Why this page exists — the documented failure

Every identifier above was copied from a cloneable, because reconstructing them from video transcripts provably produces wrong names. The Academy code-gap pass (D44) caught nine of them across the wider corpus. Only one falls inside this KB’s scope, but the failure modes generalise, and they are what to guard against:

Failure modeWrongRight
Homophone heard by ASRfc-fluid-gradient-gooeyfc-fluid-gradient-gui
Whole prefix inventedFC-drop-*fc-dropdown-*
Prefix casingFC-ripples*, FC-marquee-*fc-ripples*, fc-marquee-*
Compound word splitfs-mirror-input-elementfs-mirrorinput-element
Suffix droppedvar(--glow)var(--glow-color)
ARIA value casingaria-label="breadcrumb"aria-label="Breadcrumb"
Hyphen insertedclass toc-sub-itemsclass toc-subitems
Units misreadpixel tuning rangesfractions — primitiveUnits="objectBoundingBox"
camelCase in an HTML attributeoffsetYoffset-y — the parser lower-cases it to offsety
Prefix pattern over-appliedfc-gsap-staggered-eacheach — only the marker is prefixed

Rows one to seven come from Academy lessons outside this KB’s GSAP scope and are listed as evidence of the failure class. The last three are in scope. Row eight: webflow-glassy-button-svg-gsap, where primitiveUnits="objectBoundingBox" makes every value a fraction of the button’s own box — which is why stdDeviation: 0.02 and scale: 0.8 are correct and the plausible “1–5” and “20+” ranges were wrong. Rows nine and ten: no-code-gsap-staggered-animations-webflow, both found on 2026-07-27 — the first is an error in the lesson prose, the second is an error this KB nearly made, by reasoning from the naming convention every other component follows. The convention is real; this component just doesn’t follow it.

Not one of these throws an error. Every one produces an element that is never found, a variable that resolves to nothing, or a filter tuned by three orders of magnitude — and a reader with no way to tell why.

Sources