
Le colonne di colore
Hover, SVG
NuovaGratis
Le ore di luce di un anno in un anello di 365 righe sottili, una al giorno, lunghe quanto il giorno: una lancetta vermiglia legge il giorno sotto il puntatore, il numero al centro conta sulla stessa molla e l'anno si inchiostra fino a lei; cambiando città ogni giorno scatta alla sua misura nuova, in un'onda che parte dalla lancetta. Stile minimal.
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>A year of daylight</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>
<!-- a year of daylight drawn as a ring: one hairline a day, as long as the hours of light of that day. A vermilion
hand reads the day under the pointer, the big number counts on a spring, the year is inked up to the hand, and
choosing another city every day springs to its new length in a wave that runs round from the hand -->
<main class="stage" data-stage>
<header class="top">
<span class="top__name">Almanac</span>
<span class="top__note">Hours of daylight, day by day</span>
</header>
<div class="dial" role="slider" tabindex="0" aria-label="Day of the year" aria-valuemin="1" aria-valuemax="365" data-dial>
<svg class="dial__svg" viewBox="-500 -500 1000 1000" aria-hidden="true">
<path class="guide guide--base" data-guide="0"></path>
<path class="guide guide--half" data-guide="12"></path>
<path class="guide guide--full" data-guide="24"></path>
<path class="guide guide--months" data-month-ticks></path>
<path class="days days--future" data-future></path>
<path class="days days--past" data-past></path>
<path class="hand" data-hand></path>
</svg>
<span class="scale scale--half" aria-hidden="true">12 h</span>
<span class="scale scale--full" aria-hidden="true">24 h</span>
<div class="months" aria-hidden="true" data-months></div>
<div class="read" aria-hidden="true">
<span class="read__date" data-date>June 21</span>
<span class="read__value" data-value>
<span class="read__num" data-hours>15</span><span class="read__unit">h</span>
<span class="read__num" data-minutes>12</span><span class="read__unit">m</span>
</span>
</div>
</div>
<nav class="cities" aria-label="City" data-cities>
<span class="cities__mark" aria-hidden="true" data-mark></span>
<button type="button" class="city" data-city="oslo" data-autoclic>Oslo</button>
<button type="button" class="city" data-city="rome" data-autoclic>Rome</button>
<button type="button" class="city" data-city="quito" data-autoclic>Quito</button>
<button type="button" class="city" data-city="ushuaia" data-autoclic>Ushuaia</button>
</nav>
<p class="hint">Move around the year</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.
32 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 «L'anno di luce» da Animorio e adattala al mio sitoNiente tabelle scritte a mano: per ogni giorno la declinazione del sole viene dalla serie di Spencer, poi l'angolo orario in cui il bordo del sole tocca l'orizzonte, cos ω = (sin(−0,833°) − sin φ sin δ) / (cos φ cos δ), con φ la latitudine della città. Le ore di luce sono 2ω/15. I −0,833 gradi tengono conto del raggio del sole e dell'aria che piega la luce; oltre il circolo polare il coseno esce da −1…1 e il giorno vale 0 o 24 ore.
L'SVG ha un viewBox di 1000 con il centro nel mezzo: ogni giorno è un segmento che parte dal cerchio interno (raggio 200) ed è lungo le sue ore per 10,5 unità, così le 24 ore arrivano al cerchio esterno. I giorni non chiudono l'anello: in cima resta una fessura di 10 gradi per la scala. Tutti i giorni passati stanno in un solo path nero e quelli da venire in un path chiaro, riscritti a ogni fotogramma; vector-effect: non-scaling-stroke tiene le righe a un pixel a ogni misura.
Ogni giorno ha la sua lunghezza e la sua velocità, integrate a mano sul ticker di GSAP (DAY_SPRING, col passo limitato a 1/30 di secondo). Cambiando città la lunghezza nuova non arriva subito: ogni giorno la riceve dopo SPREAD secondi per la sua distanza dalla lancetta, divisa per mezzo anno, così l'onda parte dalla lancetta e il lato opposto dell'anno cambia per ultimo. I giorni vicini alla lancetta hanno anche una seconda molla, la sporgenza, che cresce con la velocità della lancetta (LEAN).
Dal puntatore si prende l'angolo intorno al centro con atan2 e lo si trasforma nel giorno, fessura compresa; la lancetta ci va su HAND_SPRING per la strada più corta, senza mai fare il giro lungo passando da capodanno. Il numero non ha una molla sua: legge, fra i due giorni su cui sta la lancetta, la lunghezza di quel momento, quindi conta mentre lei corre e scavalca un filo quando la riga sotto di lei scatta. Larghezza e peso di Archivo seguono la velocità con cui cambia (WIDTH, WEIGHT).
Una timeline GSAP disegna i cerchi (archi riscritti a ogni fotogramma), poi porta la lancetta per un anno e mezzo, fino al 21 giugno: un giorno nasce quando la lancetta lo passa e i mesi compaiono con un piccolo rimbalzo. Le città sono pulsanti con aria-pressed e data-autoclic; il trattino vermiglio scivola con elastic.out e si accuccia mentre corre. Il mouse guida la lancetta sull'anello e un poco intorno, il dito mentre lo trascina; l'anello è un role=slider con le frecce. Dopo 2,4 secondi senza nessuno la lancetta cammina da sola.
| Nome | File | Di partenza | Cosa cambia |
|---|---|---|---|
SPREAD | script.js | 0.8 | Quanti secondi impiega il cambio di città a fare il giro dell'anno partendo dalla lancetta. |
DAY_SPRING | script.js | [230, 17] | La molla di ogni giorno quando cambia lunghezza: quanto è rigida e quanto è frenata (meno freno, più rimbalza). |
HAND_SPRING | script.js | [160, 17] | La molla della lancetta: quanto è rigida e quanto è frenata. |
LEAN | script.js | 16 | Quanto si sporgono i giorni vicini alla lancetta mentre corre (l'anello è largo 1000). |
WIDTH | script.js | [100, 66] | La larghezza del numero fermo e mentre conta veloce (da 62 a 125). |
WEIGHT | script.js | [580, 230] | Il peso del numero fermo e mentre conta veloce (da 100 a 900). |
START | script.js | 'rome' | La città con cui si apre la pagina: oslo, rome, quito o ushuaia. |
WANDER | script.js | true | La lancetta cammina da sola intorno all'anno quando nessuno punta. |
Per un dato che cambia nell'arco dell'anno e si legge giorno per giorno: la luce per un hotel o una casa vacanza (quante ore di sole ci sono a marzo), le presenze di un museo o di un ristorante, i ritmi di una coltivazione, la stagione di un festival. Funziona con un valore al giorno e poche serie da confrontare; per una serie sola senza stagioni basta un grafico a linea.
Le stesse animazioni a misure adattate: l'anello è largo quanto lo schermo meno i nomi dei mesi, con una riga ogni due giorni perché restino distinte, e il numero scala con l'anello. La lancetta segue il dito mentre lo trascina sull'anello (lì la pagina non scorre) e si posa quando si alza; le città sono pulsanti grandi abbastanza da toccare.
Niente molle, niente onda e niente lancetta che cammina da sola: la lancetta va subito sul giorno, il numero cambia senza contare e, cambiando città, l'anello si scambia con una breve dissolvenza. All'apertura tutto compare in dissolvenza già al suo posto, sul 21 giugno.
GSAP 3.15.0, Archivo (font variabile) 5.3.0.
Compressi con gzip, i tre file della demo pesano 10,0 KB; le librerie: GSAP 28 KB.
Provata il 14 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.