Skip to content
animorio
IT
Back to the library

Stacking certificates

A list of awards: hovering the rows, each certificate opens from the bottom and lands on top of the previous one, slightly askew, like papers on a desk.

Hover, ImagesGSAP, CSS onlyEasyLifetime

The code

A folder that runs on its own: index.html, style.css, script.js and the libraries from a CDN.

The code for this animation is part of lifetime access.

The preview stays open: watch it, slow it down, try it on your phone.

Lifetime access

What it does

It is a sober table: project, award, who gave it. When the pointer enters a row, its certificate opens from the bottom next to the row and grows slightly; when it leaves, the certificate closes upwards. Every sheet that opens goes on top of all the others and has its own tilt: if you sweep quickly over the list the sheets stack up and for a moment there are three or four on the desk. On phones the certificate of the row crossing the middle of the screen opens.

How it works

One sheet per row

The certificate sits inside its row with position absolute, closed by clip-path: inset(100% 0 0 0). Opening means bringing the inset to zero; closing means bringing the bottom edge to 100%, so the sheet leaves on the opposite side.

The stack

A counter goes up on every opening and becomes the z-index of the sheet that opens: the last one is always on top. While the previous one closes, the new one passes in front of it.

Just askew enough

Every sheet has its own rotation (a --giro variable between -4 and 4 degrees) through the rotate property, separate from the transform GSAP uses: the animated scale does not wipe it out.

One listener

Instead of mouseenter and mouseleave on every row, one pointermove on the page finds the row under the pointer with closest: no flicker when crossing the words of the same row. Keyboard focus opens the sheet too.

Values to change

NameFileDefaultWhat it changes
DURATAscript.js0.5Seconds to open or close a sheet. Below 0.35 the stack is no longer visible.
PICCOLOscript.js0.9The scale the sheet starts from.
--giroindex.htmlfra -3.5 e 3.5 gradiThe tilt of each sheet: keep it different between neighbouring rows.
--fondo / --segnoindex.htmlcarta e coloreThe background and the colour of the border and seal of each certificate.

When to use it

For awards, clients, publications: lists where the row says the name and the image confirms it. With more than ten rows use pages or filters, or the stack gets messy.

On phones

Without hover the sheet opens for the row crossing the centre of the screen, to the right of the row. The columns become lines.

With reduced motion

The sheets appear and disappear with no animation, but they do appear: they are content.

Pitfalls

  • An element's percentage padding is computed on its container's width, not its own: inside a narrow sheet in a wide row the text ends up squashed.
  • Keep centring and tilt in CSS's translate and rotate properties: GSAP's inline transform replaces the class's transform, and a translateY(-50%) written there is not read back as a percentage.
  • A sheet closing and being reopened halfway must start from where it is: use overwrite auto and put the starting clip-path back only when the closing is finished.
  • The certificate covers the rows below: give it pointer-events none, otherwise the pointer lands on the sheet instead of the row and everything flickers.

Libraries

GSAP 3.15.0, ScrollTrigger (GSAP) 3.15.0, Mona Sans (font variabile) 5.3.0.

Weight: 12 KB of our own files.

Testing

Tested on 26 September 2026

  • Desktop: Done
  • Phone: Done
  • Reduced motion: Done
  • Safari on iPhone: Done

License

Use it in your own projects and in your clients’ projects. Do not resell it or redistribute it as is. GSAP stays under its own Standard license. Full license.

All animations