- Anchor Links sind im Grunde nur eine Struktur aus Button-Klick → Scrollen zur Überschrift, aber bei der tatsächlichen Implementierung treten Probleme auf
- Überschriften im unteren Seitenbereich scrollen nicht exakt an den oberen Rand des Viewports, was die UX verschlechtert
- Um das zu lösen, werden verschiedene Ansätze ausprobiert und schrittweise zu immer ausgefeilteren und komplexeren Verfahren weiterentwickelt
Einfache Lösung: Padding hinzufügen
- Zusätzlicher Abstand sorgt dafür, dass Überschriften im unteren Bereich beim Scrollen erreicht werden können
- Durch Berechnung eines Delta-Werts und anschließendes Hinzufügen von Padding lässt sich das Problem beheben
- Das Design-Team könnte jedoch unnötigen Leerraum ablehnen
Praktische Lösung: Trigger-Linie verschieben
- Die Trigger-Linie wird weiter nach unten im Viewport verschoben, damit auch untere Überschriften sie erreichen
- Das Problem dabei: Die Überschrift landet ganz unten im Viewport, wodurch die Lesbarkeit leidet
Verbesserungsansatz: Virtuellen Trigger-Punkt erzeugen
- Die tatsächliche Position der Überschrift bleibt unverändert, nur die Auslöseposition wird auf eine nach oben verschobene virtuelle Position gelegt
- Dadurch entsteht Flexibilität, weil sich für jede Überschrift unterschiedliche Anpassungen anwenden lassen
- Bei der ersten Überschrift entsteht jedoch ein neues Problem, weil sie zu weit nach oben verschoben wird → individuelle Anpassung erforderlich
Besserer Ansatz: Proportionales Verschieben der Trigger-Position
- Nicht alle Trigger werden gleich stark verschoben: Die erste Überschrift bleibt unverändert, die letzte wird maximal verschoben
- Dazwischenliegende Überschriften werden je nach Position proportional verschoben
- Damit werden die Bedingungen Reihenfolge der Überschriften beibehalten und Erreichbarkeit per Scrollen garantiert erfüllt
- Diese Methode ist einfach und praktisch und funktioniert in den meisten Fällen angemessen
Fortgeschrittener Ansatz: Optimierung mit benutzerdefinierter Mapping-Funktion
- Da die Trigger-Position willkürlich auf 25 % gesetzt wurde, kann die virtuelle Position zu stark von der ursprünglichen Position abweichen
- Um das zu lösen, wird ein Optimierungsansatz mit MSE (Mean Squared Error) eingeführt
Aufbau der Verlustfunktion
- Anchor Penalty: Wie stark die virtuelle Überschriftenposition von der ursprünglichen Position abweicht
- Section Penalty: Wie stark sich die Distanz zwischen Abschnitten (die Scroll-Länge) verändert
- Durch Gewichtung dieser beiden Werte wird die optimale Trigger-Position bestimmt
Randbedingungen
- Innerhalb des Seitenbereichs bleiben
- Die erste Überschrift wird nicht nach oben verschoben
- Die Reihenfolge der Überschriften bleibt erhalten
Erkenntnis: Grenzen des einfachen proportionalen Verschiebens
- Auf sehr langen Seiten (z. B. die gesamte Bibel) entsteht eine Ineffizienz, weil kleine Verschiebungen über die gesamte Länge kumuliert angewendet werden müssen
- Je länger die Seite ist, desto größer kann der Fehler werden und sich negativ auf die UX auswirken
Endgültige Lösung: Variable Mapping-Funktion auf Basis von Smoothstep
- Die Position jeder Überschrift wird auf einen Wert zwischen 0 und 1 normiert, auf dessen Basis der Anpassungsfaktor berechnet wird
- Mit der Smoothstep-Funktion (
S(x) = 3x² - 2x³) wird ein sanfter Übergang umgesetzt
- Durch Festlegen der Startposition
a beginnt die Verschiebung erst ab einem bestimmten Punkt und steigt danach sanft an
- Beispiel: Bei
a = 0.4 werden die oberen 40 % der Überschriften nicht verschoben, die unteren 60 % schrittweise angepasst
- Das Ergebnis: Überschriften im oberen Bereich behalten ihre ursprüngliche Position, Überschriften im unteren Bereich erhalten die maximale Anpassung → natürlichere UX
Validierung und Abschluss
- Die endgültige Implementierung ist eine Lösung, die gestalterische Präzision und praktische Nutzbarkeit ausbalanciert
- Natürlich kann das Feedback von Designer:innen auch lauten: „...Hauptsache, es funktioniert einfach.“
- Aber zumindest bleibt dieser Blogbeitrag als Dokument außergewöhnlich sorgfältiger Ingenieursarbeit für immer in Erinnerung
1 Kommentare
Hacker-News-Kommentare
Als Backend-Entwickler bin ich manchmal überrascht, wie komplex Frontend-Arbeit sein kann
Frage nach dem UX-Zweck der Anzeige des „aktiven Anchors“ in der Seitennavigation
Die wichtigste UX-Funktion von Anchor-Links ist, dass man sie anderen schicken und als Lesezeichen speichern können sollte
#anchor-name-URL verwendetIch habe darauf geklickt, weil mich Anchors/permanente Links in Jira nerven, aber das hier ist ähnlich und doch anders
Es wäre ideal, unter dem Inhalt der Hauptseite Padding hinzuzufügen
In modernen Browsern kann man mit Textfragmenten bestimmte Teile einer Seite hervorheben
Es ist auch möglich, mehrere „aktive“ Zustände zuzulassen
Es macht Spaß, die anderen Kommentare zu lesen
In Firefox Desktop hebt die „schöne Lösung“ den „mittleren Abschnitt“ hervor
Der Artikel ist sauber, und das Blog-Design ist noch interessanter