
Il pulsante da far scorrere
Pulsanti, Fisica, Transizioni
NuovaGratis
L’ottimizzazione della memoria di un telefono fatta come un vecchio deframmentatore: una griglia di blocchi, uno per pezzo di file, con sistema, app, foto e documenti sparsi fra buchi vuoti e cache tratteggiata. Premuto Optimize la cache sparisce in un’onda, poi ogni blocco viene sollevato, cresce, vola in un arco al suo posto e atterra con uno schiacciamento, mentre quello che stava in mezzo vola dall’altra parte. I blocchi a posto prendono il loro colore pieno e la griglia si riempie come una barra di avanzamento, tipo dopo tipo. Un file aperto non si sposta e resta su in rosso fino a Retry; alla fine un’onda attraversa la griglia e Optimize again rimanda ogni blocco da dove era venuto.
Una cartella che funziona da sola: index.html, style.css, script.js e le librerie da CDN.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>The storage defragmenter</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/martian-mono@5.3.0/wdth.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the storage defragmenter: a phone's storage as a grid of blocks, one per file chunk, scattered with gaps and
cache. Optimize clears the cache in a wave, then every block is lifted and flown, in an arc, to its place:
system, apps, photos, documents, and the free space all in one piece at the end. The grid is drawn by script.js -->
<section class="df" aria-labelledby="df-title" data-defrag>
<div class="df__head">
<div class="df__words">
<h2 class="df__title" id="df-title"><span class="df__swap" data-title>Optimize storage</span></h2>
<p class="df__meta"><span class="df__swap" data-meta>128 GB · 115 fragments</span></p>
</div>
<p class="df__figure" aria-hidden="true">
<span class="df__pct" data-pct>0%</span>
<svg class="df__tick" viewBox="0 0 28 28" data-tick><path d="M6.5 14.8l5 5 10-11.4" pathLength="1"/></svg>
</p>
</div>
<div class="df__grid" role="progressbar" aria-labelledby="df-title" aria-valuemin="0" aria-valuemax="100"
aria-valuenow="0" aria-valuetext="Not started" data-bar>
<canvas class="df__canvas" aria-hidden="true" data-grid></canvas>
</div>
<p class="df__legend" aria-label="What is stored">
<span class="df__kind" style="--kind: var(--system)"><span>System</span> <b data-size="system">11 GB</b></span>
<span class="df__kind" style="--kind: var(--apps)"><span>Apps</span> <b data-size="apps">23 GB</b></span>
<span class="df__kind" style="--kind: var(--photos)"><span>Photos</span> <b data-size="photos">35 GB</b></span>
<span class="df__kind" style="--kind: var(--docs)"><span>Files</span> <b data-size="docs">15 GB</b></span>
<span class="df__kind df__kind--cache" style="--kind: var(--cache-ink)"><span>Cache</span> <b data-size="cache">2.4 GB</b></span>
</p>
<div class="df__foot">
<span class="df__status"><span class="df__swap" data-status>Last optimized 3 months ago</span></span>
<button class="pill" type="button" data-btn data-autoclic>
<span class="pill__fill" aria-hidden="true"></span>
<span class="pill__label" data-label>Optimize</span>
</button>
</div>
<p class="sr" role="status" aria-live="polite" data-live></p>
</section>
</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.
53 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 deframmentatore della memoria» da Animorio e adattala al mio sitoI blocchi di ogni tipo (quanti, lo dice MIX) e i posti vuoti si mescolano con un generatore pseudocasuale col seme (il moltiplicativo di Park e Miller), quindi il disordine è sempre lo stesso e il giro dell’anteprima si ripete identico. Due passate scambiano qualche blocco isolato con il vicino uguale: il disordine vero di un disco ha piccoli gruppi, non è rumore puro. Ogni blocco ricorda il suo posto di partenza, dove torna con Optimize again.
Come un deframmentatore vero, il lavoro si calcola prima su una copia della griglia: prima si cancella la cache, poi per ogni posto, in ordine, si guarda quale tipo ci deve stare (sistema, app, foto, documenti); se c’è già il blocco giusto si tiene, se no si prende il più vicino dopo quel posto e il blocco che stava in mezzo va dove era lui. Ogni operazione ha un peso (un volo 1, una cancellazione 0,16, un blocco già a posto 0,12) e quindi il suo istante nel lavoro, da 0 a 1.
Durante il lavoro un orologio avanza nel ticker di GSAP (il passo è al massimo 1/30 di secondo) e fa partire ogni operazione quando passa il suo istante: la percentuale è l’orologio stesso. La pausa ferma l’orologio e lascia finire i voli in aria; il file aperto è la prima operazione di volo dopo FAIL, che ferma l’orologio finché Retry non la fa partire.
Un blocco vola lungo la retta fra i due posti più una spinta di lato, sin(πt) per un’altezza che cresce con la distanza, e i due blocchi di uno scambio piegano da parti opposte, così si incrociano senza coprirsi. In cima all’arco il blocco è più grande di LIFT e ha un’ombra che si allarga; atterrando si schiaccia in larghezza e in altezza con un elastic.out e torna con un assestamento. Le posizioni stanno in celle e non in pixel, quindi se la finestra cambia misura a metà volo il disegno si rifà e niente salta.
Tutto è un canvas più grande della griglia di dodici pixel per lato, perché un blocco in aria non sia mai tagliato: prima i posti a filo, poi i blocchi a terra, poi quelli in aria dal più basso al più alto, poi la cornice. Il pallore di un blocco fuori posto è la sua trasparenza, la cache è tratteggiata con un clip. Quando niente si muove e il lavoro è fermo il ciclo esce dal ticker e non ridisegna niente.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
GRID | script.js | [24, 10] | Colonne e righe della griglia di blocchi. |
MIX | script.js | { system: 18, apps: 38, photos: 62, docs: 30, cache: 28 } | Quanti blocchi di ogni tipo; il resto della griglia è spazio libero (almeno un quinto resta libero). |
CACHE_GB | script.js | 2.4 | Quanto pesa la cache che viene cancellata. |
SECONDS | script.js | 7 | Quanti secondi dura un’ottimizzazione nella demo. |
GAP | script.js | 2 | Lo spazio fra due blocchi, in pixel. |
ROUND | script.js | 0.22 | L’angolo tondo di un blocco, come parte del suo lato. |
LIFT | script.js | 0.55 | Quanto cresce un blocco in cima al suo volo. |
ARC | script.js | 0.32 | Quanto è alto l’arco di un volo, come parte della sua lunghezza. |
FLIGHT | script.js | 0.6 | Quanto dura un volo, in secondi. |
SEED | script.js | 11 | Il disordine di partenza: un altro numero, un altro disordine. |
FAIL_EVERY | script.js | 2 | Un’ottimizzazione ogni quante trova un file aperto (0 mai). |
FAIL | script.js | 0.58 | Dove si trova il file aperto, da 0 a 1. |
PREVIEW | script.js | 1.45 | Nel giro dell’anteprima: quante volte più veloce. |
LABELS | script.js | ['Optimize', 'Pause', 'Resume', 'Retry', 'Optimize again'] | Le parole della pillola, stato per stato. |
--photos | style.css | #ff7442 | Il colore dei blocchi delle foto. |
--apps | style.css | #4f56e8 | Il colore dei blocchi delle app. |
Per l’ottimizzazione o la pulizia della memoria in un’app per il telefono o il computer, per un antivirus o un pulitore, per la compattazione di un archivio o di un database in una dashboard, per ogni lavoro lungo che mette in ordine tante piccole cose.
Il pannello prende tutta la larghezza meno i margini e la griglia si rimpicciolisce con lui: ha sempre 24 colonne, con i blocchi più piccoli. I voli sono gli stessi, perché le posizioni stanno in celle; la legenda resta su cinque colonne. La pillola risponde al tocco come al mouse.
Niente vola: un blocco che cambia posto si spegne dov’era e si accende dove va, la cache si spegne invece di stringersi, la cornice salta da un posto all’altro e non c’è l’onda finale. Il colore pieno dei blocchi a posto, la percentuale e la spunta restano.
GSAP 3.15.0, Martian Mono (font variabile, asse wdth) 5.3.0.
Compressi con gzip, i tre file della demo pesano 11 KB; le librerie: GSAP 28 KB.
Provata il 19 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.