History API – Scroll-Wiederherstellung

Paul Lewis

Die History API zur Verwaltung Ihrer URLs zu verwenden, ist eine tolle Sache und eine wichtige Funktion guter Web-Apps. Einer der Nachteile besteht jedoch darin, dass die Scrollpositionen gespeichert und dann, was noch wichtiger ist, wiederhergestellt werden, wenn Sie den Verlauf durchgehen. Das führt oft zu unschönen Sprüngen, da sich die Scrollposition automatisch ändert. Das ist vor allem dann der Fall, wenn Ihre App Übergänge ausführt oder den Inhalt der Seite in irgendeiner Weise ändert. Letztendlich führt dies zu einer schlechten Nutzererfahrung.

Und das Schlimmste daran ist, dass Sie nicht viel dagegen tun können: Chrome löst das popState-Ereignis vor dem scroll-Ereignis aus. Das bedeutet, dass Sie die aktuelle Scrollposition in popState lesen und dann im scroll-Ereignishandler mit window.scrollTo rückgängig machen können. Ewww, aber zumindest funktioniert es. In Firefox wird das Ereignis scroll jedoch vor popState ausgelöst. Sie haben also keine Ahnung, wie der alte Scrollwert lautet, um ihn wiederherzustellen. Pfui!

Es gibt jedoch eine mögliche Lösung: history.scrollRestoration. Es werden zwei Stringwerte verwendet: auto, bei dem alles unverändert bleibt (Standardwert), und manual, was bedeutet, dass Sie als Entwickler für alle Scrolländerungen verantwortlich sind, die erforderlich sein können, wenn ein Nutzer den Verlauf der App durchläuft. Wenn Sie möchten, können Sie die Scrollposition im Blick behalten, während Sie mit history.pushState() Verlaufseinträge aufrufen.

Die Funktion ist neu und experimentell (aber absolut genial). Prüfe daher, ob sie verfügbar ist, bevor du sie verwendest:

if ('scrollRestoration' in history) {
    // Back off, browser, I got this...
    history.scrollRestoration = 'manual';
}

history.scrollRestoration ist ab Chrome 46 verfügbar. Die Spezifikation finden Sie hier.

Vergiss nicht, uns Feedback zu geben und anderen Anbietern mitzuteilen, dass du möchtest, dass sie scrollRestoration auch unterstützen.