Il pattern classico: IntersectionObserver + classe CSS aggiunta con JS = animazione on-scroll. Funziona, ma è verboso e aggiunge dipendenza da JavaScript per qualcosa che è puramente visivo.
Con animation-timeline: scroll() possiamo legare direttamente la progressione di un'animazione CSS alla posizione dello scroll. Niente JS, niente listener, niente performance overhead del main thread.
Caso d'uso preferito: progress bar di lettura. Prima richiedeva ~20 righe di JS. Ora: due proprietà CSS. La compatibilità è attualmente buona sui browser moderni, con fallback graceful su Safari più vecchi.