- Un lien d’ancrage se résume en apparence à une structure simple, clic sur un bouton → défilement vers un titre, mais sa mise en œuvre réelle pose des problèmes
- Les titres situés en bas ne défilent pas exactement jusqu’en haut du viewport, ce qui dégrade l’UX
- Pour résoudre cela, différentes approches ont été tentées, évoluant progressivement vers des méthodes toujours plus précises et complexes
Solution simple : ajouter du padding
- Une méthode consiste à ajouter de l’espace pour que les titres du bas puissent être atteints par le défilement
- En calculant un delta puis en ajoutant du padding, le problème peut être résolu
- Mais l’équipe design peut ne pas apprécier cet espace inutile
Solution pratique : déplacer la ligne de déclenchement
- On déplace la ligne de déclenchement vers le bas du viewport afin que les titres du bas puissent l’atteindre
- Le problème est que le titre se retrouve tout en bas du viewport, ce qui réduit la lisibilité
Amélioration : créer un point de déclenchement virtuel
- On laisse la position réelle du titre inchangée, et l’on crée à la place une position virtuelle déplacée vers le haut où se produit le déclenchement
- Cela offre la souplesse d’appliquer un ajustement différent à chaque titre
- Mais le premier titre est déplacé trop haut, ce qui crée un nouveau problème → un réglage individuel est nécessaire
Meilleure méthode : déplacement proportionnel de la position de déclenchement
- Au lieu de déplacer tous les déclencheurs de la même manière, le premier titre reste en place et le dernier bénéficie du déplacement maximal
- Les titres intermédiaires sont déplacés proportionnellement selon leur position
- Cette méthode respecte les conditions de préservation de l’ordre des titres et de garantie d’accessibilité par défilement
- Elle est simple et pratique, et fonctionne correctement dans la plupart des cas
Approche avancée : optimisation avec une fonction de mapping personnalisée
- Comme la position de déclenchement avait été placée arbitrairement à 25 %, la position virtuelle pouvait trop s’éloigner de la position d’origine
- Pour résoudre cela, une approche d’optimisation utilisant la MSE (Mean Squared Error) a été introduite
Composition de la fonction de perte
- Anchor Penalty : mesure à quel point la position virtuelle du titre s’écarte de sa position d’origine
- Section Penalty : mesure l’ampleur du changement de distance entre les sections (longueur de défilement)
- En ajustant les poids de ces deux valeurs, on obtient une position de déclenchement optimale
Contraintes
- Rester à l’intérieur des limites de la page
- Le premier titre ne doit pas être déplacé vers le haut
- Préserver l’ordre des titres
Insight : les limites du simple déplacement proportionnel
- Sur des pages très longues (par ex. l’intégralité de la Bible), une inefficacité apparaît : il faut cumuler de petits déplacements sur l’ensemble de la page
- Plus la page est longue, plus l’erreur augmente, avec un impact potentiel négatif sur l’UX
Solution finale : une fonction de mapping variable basée sur smoothstep
- La position de chaque titre est normalisée en une valeur entre 0 et 1, à partir de laquelle on calcule un taux d’ajustement
- La fonction smoothstep (
S(x) = 3x² - 2x³) est utilisée pour obtenir une transition fluide
- On définit une position de départ
a pour l’ajustement : jusqu’à ce point, aucun déplacement n’est appliqué, puis la progression augmente en douceur
- Exemple : si
a = 0.4, les 40 % supérieurs des titres ne sont pas déplacés, tandis que les 60 % inférieurs sont ajustés progressivement
- Au final, les titres du haut conservent leur position d’origine, les titres du bas reçoivent l’ajustement maximal → une UX naturelle
Vérification et conclusion
- L’implémentation finale constitue une solution équilibrant finesse de conception et pragmatisme
- Bien sûr, le retour d’un designer peut se résumer à : « ...du moment que ça marche bien »
- Mais au moins, cet article de blog restera comme la trace d’une ingénierie minutieuse dont on se souviendra longtemps
1 commentaires
Avis Hacker News
En tant que développeur back-end, je suis parfois surpris par la complexité quand je vois du travail front-end
Question sur l’objectif UX de l’indication de l’« ancre active » dans la navigation latérale
La fonction UX la plus importante des liens d’ancrage est de pouvoir être envoyés à d’autres personnes et enregistrés en favoris
Agacé par les ancres/liens permanents de Jira, j’ai cliqué dessus, mais le fonctionnement est similaire tout en étant différent
L’idéal serait d’ajouter du padding sous le contenu principal de la page
Dans les navigateurs modernes, on peut utiliser des fragments de texte pour mettre en évidence une partie précise d’une page
Il est aussi possible d’autoriser plusieurs états « actifs »
C’est amusant de lire les autres commentaires
Sur Firefox desktop, la « belle solution » met en évidence les « sections du milieu »
L’article est propre, et le design du blog est encore plus intéressant