
Il pulsante che copia
Pulsanti, Testo, SVG, Fisica
NuovaGratis
Un calendario per le date di un soggiorno nello stile minimal: scelto l’arrivo, una linea sottile vermiglia parte dal giorno e segue il puntatore come un elastico, si piega quando corre e si tende contro una notte già presa; scelta la partenza si fissa e vibra come una corda pizzicata, le notti in mezzo si scuriscono una dopo l’altra e a sinistra il numero delle notti si allarga con il soggiorno.
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 elastic calendar</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fontsource-variable/archivo@5.3.0/wdth.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="stage">
<!-- the picker: a month to choose the dates of a stay. Once the arrival is chosen a thin elastic line leaves its
day and follows the pointer between the days; choosing the departure pins it down and it settles like a plucked
string, the nights in between darken one after the other and the big number stretches with the stay -->
<div class="cal" data-picker data-autoclic>
<section class="cal__stay" aria-label="Your stay">
<p class="cal__label">Your stay</p>
<div class="cal__count" aria-hidden="true">
<span class="cal__num" data-num><span class="cal__digits" data-digits>0</span></span>
<span class="cal__unit" data-unit>nights</span>
</div>
<dl class="cal__dates">
<div class="cal__date">
<dt>Arrive</dt>
<dd data-from>Add date</dd>
</div>
<div class="cal__date">
<dt>Leave</dt>
<dd data-to>Add date</dd>
</div>
</dl>
<button class="cal__clear" type="button" data-clear disabled><span>Clear dates</span></button>
</section>
<section class="cal__month" aria-label="Choose your dates">
<div class="cal__head">
<button class="cal__nav" type="button" aria-label="Previous month" data-prev><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M14.5 6 8.5 12l6 6"/></svg></button>
<h2 class="cal__title" aria-live="polite"><span data-title></span></h2>
<button class="cal__nav" type="button" aria-label="Next month" data-next><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9.5 6l6 6-6 6"/></svg></button>
</div>
<div class="cal__week" aria-hidden="true" data-week></div>
<div class="cal__field" data-field>
<svg class="cal__line" aria-hidden="true" data-svg>
<circle class="cal__pin" r="19" data-pin="a"/>
<circle class="cal__pin" r="19" data-pin="b"/>
<path class="cal__band" d="" data-band/>
</svg>
<div class="cal__grid" data-grid></div>
</div>
</section>
<p class="sr" role="status" aria-live="polite" data-said></p>
</div>
</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.
28 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 calendario con l’elastico» da Animorio e adattala al mio sitoLo script disegna sei settimane di celle, così tutti i mesi sono alti uguali, e mette ogni data su una griglia continua: x in giorni da sinistra, y in settimane dall’alto. Anche le date fuori dal mese hanno il loro posto (sopra o sotto), quindi un soggiorno che comincia nel mese prima entra dal bordo. Le notti prenotate (circa una su nove) vengono da un numero ricavato dalla data, quindi sono sempre le stesse.
La linea ha due capi, ognuno su una molla verso il suo bersaglio: l’arrivo, e il puntatore attirato verso il centro del giorno sotto di lui (FOLLOW, MAGNET) o la partenza. La curva è la somma di due modi di vibrare, mezza onda e onda intera di traverso alla linea: li spinge l’accelerazione dei due capi (LAG), così la linea resta indietro nel mezzo quando corre, e la partenza le dà un colpo (PLUCK, RING). Quattro piccoli passi per fotogramma, col passo limitato a 1/30 di secondo, in un solo requestAnimationFrame che si ferma quando niente si muove.
La linea è un path SVG di 29 punti riscritto a ogni fotogramma, da bordo ad anello e non da centro a centro; più è lunga più è sottile, perché è tirata. I numeri dei giorni stanno sopra, su un pezzetto di fondo bianco: la linea sparisce dietro ogni cifra e si legge come una fila di tratti fra un giorno e l’altro.
Ogni anello è un cerchio con stroke-dasharray: GSAP lo disegna in 0,45 secondi partendo dall’angolo da cui arriva la linea. Ogni giorno ha una variabile --k da 0 a 1 che mescola il grigio e il nero (color-mix) e porta il peso da 380 a 680 e la larghezza da 96 a 104: scelta la partenza GSAP la porta a 1 una notte dopo l’altra (DARKEN), con un colpetto in giù di un pixel e un ritorno elastico.
Il numero delle notti è in Archivo, che ha l’asse della larghezza da 62 a 125. A ogni fotogramma lo script conta le notti dalla posizione del capo libero (una settimana in giù vale sette notti), anche a metà strada, e le trasforma in larghezza (STRETCH): il numero si allarga e si stringe con la linea, trema con la sua vibrazione e prende peso quando la partenza è scelta.
Un solo giorno della griglia prende il tasto Tab: le frecce si muovono fra i giorni, Home e End vanno all’inizio e alla fine della settimana, Pagina su e Pagina giù cambiano mese, Invio sceglie. Con la tastiera la linea segue il focus, col mouse il puntatore; col dito premere un giorno ci tende la linea subito, e alzandolo la si fissa.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
WEEK_START | script.js | 1 | Il primo giorno della settimana: 1 il lunedì, 0 la domenica. |
MAX_NIGHTS | script.js | 14 | Il soggiorno più lungo, in notti: oltre, la linea si tende e non va avanti. |
FOLLOW | script.js | 3.6 | Quanto in fretta il capo libero della linea segue il puntatore, in hertz. |
MAGNET | script.js | 0.42 | Quanto il capo libero è attirato al centro del giorno sotto il puntatore (da 0 a 1). |
LAG | script.js | 1.5 | Quanto si piega la linea quando il puntatore corre (0 = resta dritta). |
PLUCK | script.js | 11 | Quanto vibra la linea quando la partenza la fissa, in pixel. |
RING | script.js | 5.2 | La frequenza della vibrazione, in hertz: più alta, una corda più tesa. |
DARKEN | script.js | [0.34, 0.05] | Le notti che si scuriscono: i secondi di ognuna, e il tempo fra una notte e la successiva. |
STRETCH | script.js | [66, 124] | La larghezza del numero delle notti, da una notte a un soggiorno lungo (fra 62 e 125). |
SLIDE | script.js | 0.55 | I secondi di un cambio di mese. |
Per la pagina delle prenotazioni di un albergo, di una casa vacanze, di un B&B o di un noleggio: ovunque si scelgano un arrivo e una partenza e contino le notti. Le notti prenotate vanno prese dal tuo sistema al posto di quelle inventate.
Sotto i 720 pixel il soggiorno va sopra, col numero accanto alle date, e le celle si stringono per stare nella larghezza dello schermo. Il dito non ha il puntatore: premere un giorno ci tende la linea subito, con la stessa molla e la stessa piega, e alzandolo la si fissa con la stessa vibrazione.
Niente molle, niente vibrazioni e niente onde: la linea va subito dritta da un anello all’altro, gli anelli e le notti compaiono in dissolvenza, il numero prende subito la sua larghezza, i mesi cambiano con una dissolvenza e all’apertura il soggiorno è già al suo posto.
GSAP 3.15.0, Archivo (font variabile, assi wght e wdth) 5.3.0.
Compressi con gzip, i tre file della demo pesano 13 KB; le librerie: GSAP 28 KB.
Provata il 16 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.