
Il logo sotto la palla da demolizione
Intro, Fisica, SVG, Testo
NuovaGratis
L’entrata di un logo in un cielo al tramonto: arriva da lontano uno stormo di rondini che vortica in onde, poi gli uccellini si posano uno dopo l’altro sui punti delle lettere finché il logo è fatto di uccelli; le lettere si riempiono dal basso e tre ritardatarie si appollaiano in cima e cantano. Nel Playground ci metti il tuo nome o carichi il tuo logo.
Una cartella che funziona da sola: index.html, style.css, script.js e le librerie da CDN. Nelle schede React e Vue la stessa demo è già un componente, che spegne le sue animazioni quando esce dalla pagina.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>The flock-of-birds logo</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/outfit@5.3.0/index.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="scena">
<!-- the soft clouds, drawn on a canvas behind everything -->
<canvas class="nuvole" data-clouds aria-hidden="true"></canvas>
<!-- the logo: the script writes it here; it fills up from the bottom through a mask -->
<svg class="palco" data-stage role="img" aria-label="Wrenly" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="fill-edge" gradientUnits="userSpaceOnUse" x1="0" x2="0" y1="0" y2="1" data-fill-edge>
<stop offset="0" stop-color="#000" />
<stop offset="1" stop-color="#fff" />
</linearGradient>
<mask id="fill" maskUnits="userSpaceOnUse" data-fill-mask>
<rect fill="url(#fill-edge)" data-fill-rect />
</mask>
</defs>
<g data-world>
<g data-logo mask="url(#fill)"></g>
</g>
</svg>
<!-- the flock: hundreds of small birds, drawn on a canvas -->
<canvas class="stormo" data-flock aria-hidden="true"></canvas>
<!-- the latecomers, the notes and the feathers, over everything -->
<svg class="palco palco--sopra" data-front aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
<defs>
<!-- the belly stays inside the body (in each bird's own coordinates) -->
<clipPath id="bird-body-clip">
<path d="M-20 -30C-18 -44 -4 -50 12 -48C26 -46 32 -34 30 -22C28 -10 16 -4 2 -4C-12 -4 -22 -16 -20 -30Z" />
</clipPath>
<!-- a swallow, drawn facing right; the point between its feet is 0 0. The script clones it for every
latecomer and turns each piece on its own joint -->
<g id="bird-model" data-bird-model>
<g data-b-place>
<g data-b-flip>
<!-- the legs, under the body; they tuck in when it flies -->
<g data-b-legs>
<path class="zampa" d="M-1 -7L-3 0M9 -7L9 0" />
<path class="zampa zampa--dita" d="M-8 0L1 0M4 0L13 0" />
</g>
<g data-b-trunk>
<!-- the far wing, darker, only seen when the wings go up -->
<g data-b-wing-far>
<path class="uccello-lontano" d="M9 -43C-3 -45 -17 -37 -33 -19C-19 -21 -5 -23 5 -27C13 -30 15 -39 9 -43Z" />
</g>
<!-- the forked tail -->
<g data-b-tail>
<path class="uccello-ala" d="M-14 -24C-26 -20 -40 -8 -56 6C-45 1 -38 -1 -31 -4C-37 4 -42 13 -47 24C-34 11 -22 0 -9 -11Z" />
<path class="uccello-piuma" d="M-20 -17L-44 2M-18 -12L-38 14" />
</g>
<!-- the body: blue back, cream belly, a shine on the back -->
<path class="uccello" d="M-20 -30C-18 -44 -4 -50 12 -48C26 -46 32 -34 30 -22C28 -10 16 -4 2 -4C-12 -4 -22 -16 -20 -30Z" />
<g clip-path="url(#bird-body-clip)">
<path class="uccello-pancia" d="M-26 -10C-8 -18 12 -26 36 -34L36 0L-26 0Z" />
<path class="uccello-macchia" d="M4 -16C7 -18 10 -17 10 -15C9 -13 6 -13 4 -16ZM14 -20C16 -21 18 -20 18 -19C17 -17 15 -17 14 -20ZM-4 -11C-2 -12 0 -12 0 -10C-1 -9 -3 -9 -4 -11Z" />
<path class="uccello-lucido" d="M-14 -36C-8 -43 2 -46 10 -45" />
</g>
<!-- the head turns on the neck: throat, forehead, beak in two halves, eye with iris, shine and lid -->
<g data-b-head>
<circle class="uccello" cx="20" cy="-50" r="15" />
<path class="uccello-gola" d="M21 -42C27 -45 33 -45 34 -40C32 -34 24 -33 17 -37Z" />
<path class="uccello-gola" d="M30 -59C34 -59 36 -55 34.5 -51.5C31.5 -52.5 29 -55.5 30 -59Z" />
<path class="uccello-lucido" d="M10 -59C13 -62 17 -64 21 -64" />
<g data-b-beak-low>
<path class="becco becco--sotto" d="M33 -47.6L44.5 -47.6L33.5 -43.4Z" />
</g>
<g data-b-beak-up>
<path class="becco" d="M33 -54L47 -48.6L33 -47.4Z" />
</g>
<ellipse class="guancia" cx="17" cy="-44" rx="4.6" ry="2.6" data-b-blush />
<circle class="occhio" cx="25" cy="-53" r="5.6" />
<g data-b-pupil>
<circle class="iride" cx="26.4" cy="-53" r="3.8" />
<circle class="pupilla" cx="26.9" cy="-53" r="2.1" />
<circle class="riflesso" cx="25.3" cy="-54.8" r="1.2" />
</g>
<circle class="palpebra" cx="25" cy="-53" r="6.4" data-b-lid />
</g>
<!-- the near wing, folded along the body; it turns on the shoulder to fly -->
<g data-b-wing>
<path class="uccello-ala" d="M5 -41C-7 -43 -21 -35 -37 -17C-23 -19 -9 -21 1 -25C9 -28 11 -37 5 -41Z" />
<path class="uccello-piuma" d="M-6 -33L-24 -22M-2 -28L-18 -21M-12 -27L-28 -19" />
</g>
</g>
</g>
</g>
</g>
</defs>
<g data-heroes></g>
<g data-fx></g>
</svg>
<p class="nota">Click or tap to see it again</p>
</main>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.15.0/dist/gsap.min.js"></script>
<script src="script.js"></script>
</body>
</html>Cambia valori, colori e testi con le manopole e guarda l’animazione rispondere dal vivo. Oppure scrivi tu nel codice. Poi scarica la cartella con le tue modifiche.
27 valori da cambiare
Col connettore di Animorio, Claude Code la prende da qui con tutta la sua guida e la adatta al tuo progetto. Incolla questa richiesta:
Prendi «Il logo disegnato dallo stormo» da Animorio e adattala al mio sitoIl cielo è una sfumatura CSS sul palco; sopra ci sono una canvas per le nuvole, l’SVG del logo, una canvas per lo stormo e un secondo SVG per le ritardatarie, le note e le piume. Le nuvole si disegnano una volta sola, sfumate con il trucco dell’ombra (la forma sta fuori dalla canvas e se ne vede solo l’ombra sfocata, che funziona anche dove ctx.filter manca): prima il bordo chiaro di sotto, poi il corpo in ombra un po’ più in alto. A ogni fotogramma si spostano con l’orologio della pagina.
Le lettere si misurano su una canvas nello stesso carattere (measureText, actualBoundingBoxAscent) e si disegnano su un’altra canvas grande come il palco; getImageData dice quali pixel sono pieni. Dall’area piena e dal numero massimo di uccelli viene la distanza fra due posti, poi una griglia a nido d’ape con un po’ di disordine dà un posto a ogni rondine. La stessa lettura trova il punto più alto di ogni colonna: le ritardatarie si posano dove la cima è piatta per la larghezza delle loro zampe.
Ogni uccello ha una posizione che è una funzione del tempo: il centro dello stormo arriva lungo una curva e si ingrandisce, ogni rondine gira su un anello inclinato (più veloce al centro, così lo stormo si deforma), l’anello si allarga e si stringe e un’onda lo attraversa. La direzione del volo è la differenza fra la posizione di adesso e quella di un attimo dopo. Niente simulazione: la scena si può mandare avanti e indietro come una timeline.
Ogni posa (ali su, a metà, giù, aperte, mezze chiuse, chiuse) si disegna una volta su una piccola canvas, alla risoluzione dello schermo. A ogni fotogramma ogni uccello è un solo drawImage con setTransform (posizione, verso, inclinazione e grandezza in una matrice): così centinaia di rondini restano a 60 fotogrammi al secondo. Il numero dipende dall’area dello schermo; per l’atterraggio una curva di Bézier parte con la velocità che l’uccello aveva nello stormo e finisce sul suo punto.
Il logo SVG ha una maschera con una sfumatura verticale, nero sopra e bianco sotto, che sale con la timeline. Lo stesso numero, la linea del riempimento, decide la trasparenza degli uccelli posati: sotto la linea spariscono, sopra restano, e nella fascia sfumata si incrociano con il colore della lettera. All’uscita la linea scende e gli uccelli tornano visibili dall’alto, appena prima di ripartire.
La rondine è disegnata una volta nella pagina, a pezzi e col contorno, e lo script la clona per ognuna. Ogni pezzo ruota sulla sua articolazione calcolata con getBBox (la spalla, il collo, la cerniera del becco, l’attaccatura della coda); posizione, inclinazione e verso vanno in un oggetto scritto come attributo transform, e i voli seguono curve di Bézier. Se IMAGE ha un indirizzo, il logo diventa quell’immagine e gli uccelli prendono la forma dei suoi pixel pieni; un’immagine di un altro sito che non si può leggere diventa un rettangolo di uccelli.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
NAME | script.js | 'Wrenly' | Il logo scritto: gli uccelli si posano sui punti delle sue lettere. |
IMAGE | script.js | '' | Il logo come immagine: l’indirizzo di un file, oppure caricalo dal tuo computer. Se c’è, prende il posto della parola e gli uccelli prendono la forma dei suoi pixel pieni. |
BIRDS | script.js | 420 | Quanti uccelli nello stormo, al massimo: su uno schermo piccolo sono di meno, e mai più di quanti il logo ne può tenere. |
SWIRL | script.js | 1 | Quanto vortica lo stormo: 0 vola dritto ondeggiando, 2 è un turbine veloce. |
PERCHED | script.js | 3 | Quante rondini ritardatarie restano appollaiate in cima al logo (da 0 a 6). |
SPEED | script.js | 1 | La velocità di tutta l’animazione: 2 è il doppio, 0.5 la metà. |
REST | script.js | 5 | Quanti secondi il logo resta intero con le rondini sopra prima che lo stormo se lo porti via. |
LOOP | script.js | true | Se lo stormo porta via il logo e ricomincia. Con false il logo resta e le rondini continuano a sbattere le palpebre e a guardarsi intorno. |
Per l’apertura di un sito o di un video che parla di natura, viaggi, primavera, musica o di un nome che vola; per l’anteprima di un logo a un cliente, una pagina di benvenuto, un post per i social. Funziona con un marchio scritto e con un’immagine.
La stessa animazione, con le misure adattate: il logo prende più larghezza, gli uccelli sono più piccoli e di meno (il numero dipende dall’area dello schermo), così restano fluidi. Un tocco la fa ripartire.
Niente vola: le lettere fatte di uccelli compaiono in dissolvenza, poi si dissolvono nelle lettere piene, poi compaiono le rondini appollaiate; le nuvole stanno ferme. Se ricomincia, anche l’uscita è una dissolvenza.
GSAP 3.15.0, Outfit (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 17 KB; le librerie: GSAP 28 KB.
Provata il 10 ottobre 2026
Puoi usarla nei tuoi progetti e in quelli dei tuoi clienti. Non puoi rivenderla né ridistribuirla così com’è. GSAP resta sotto la sua licenza Standard. Licenza completa.
Con l’email e la password del tuo account.
oppure con l’email
Hai fatto l’accesso come .
Con l’account scarichi lo zip di ogni animazione e di ogni pacchetto, gratis.