On peut relier de nombreuses petites pages HTML par la navigation pour créer de l’interaction
(blog.jim-nielsen.com)- L’approche (L)ots of (L)ittle ht(M)l page(s) remplace les interactions internes à la page basées sur JavaScript par des déplacements entre plusieurs petites pages HTML
- L’interaction est construite comme une navigation entre pages HTML, améliorée dans les environnements modernes avec les transitions de vue CSS (view transitions), avec seulement un peu de JavaScript quand c’est nécessaire
- Le Menu du blog n’est pas une UI dépliée en JavaScript, mais fonctionne en suivant le lien
<a href="/menu/">vers une page dédiée au menu - La fermeture du menu est, par défaut, un lien vers
/, mais si document.referrer est présent, JavaScript exécutehistory.back()pour éviter d’empiler dans l’historique des entrées d’ouverture et de fermeture du menu - En s’appuyant sur la fonctionnalité native du navigateur, à savoir la navigation par liens, cela fonctionne aussi sur les anciens appareils, les anciens navigateurs et dans les environnements où JavaScript est désactivé, et plus la taille des pages reste réduite, plus l’interaction devient rapide et robuste
Méthode d’implémentation du menu et conséquences de conception
-
Ouvrir et fermer, tout passe par des liens
- Sur une page normale, il y a un lien vers la page du menu, et sur la page du menu, ce lien est remplacé par un « X » qui sert à fermer le menu
- L’action de fermeture est aussi, par défaut, un lien vers
/, mais sidocument.referrerest présent, JavaScript exécutehistory.back()pour éviter d’ajouter à l’historique du navigateur des entrées d’ouverture et de fermeture du menu - Une implémentation simplifiée ressemble à ceci
<!-- Normal page --> <nav> <a href="/menu/"> <svg>...</svg> </a> </nav> <!-- Menu page --> <nav> <a href="/" onclick="document.referrer ? history.back() : window.location.href = '/'; return false;"> <svg>...</svg> </a> </nav>
-
Distinguer une visite directe d’une navigation interne
document.referrerpermet de distinguer si l’on est arrivé sur la page du menu via une navigation interne au blog ou par un accès direct, comme la saisie de l’URL- En cas de navigation interne,
history.back()a un sens ; en cas d’accès direct, on redirige vers/
-
L’approche façonne le design
- La solution peut sembler simple, mais elle oblige à réfléchir ensemble à la nature de la navigation, aux interactions qui traversent plusieurs pages et à la manière de garder des pages légères
- Il faut conserver des pages de petite taille pour que l’interaction reste rapide, robuste et intuitive
- Si l’on considère le navigateur non comme un runtime qui exécute, télécharge, compile puis affiche du code arbitraire, mais comme un outil de consultation de documents, on peut créer des sites web bien plus simples que ne le suggèrent les outils
1 commentaires
Commentaires sur Lobste.rs
En général, j’aime l’approche qui consiste à toujours répondre en HTML, mais pour quelque chose comme un menu, je ne suis pas certain
J’aimerais connaître l’avis de spécialistes de l’accessibilité sur ce qui est préférable entre un élément repliable et une transition de page complète pour ouvrir un menu
Ici, la Popover API me semble être une meilleure solution. Elle permet de proposer un menu sans JavaScript, sans aller-retour complet
Pour le reste, je suis d’accord sur le fait qu’il ne faut pas avoir peur des changements de page. Aujourd’hui, même une navigation de type SPA n’est presque jamais difficile à rendre accessible sur des sites SSR ou statiques
Un changement de page réinitialise la position actuelle, mais si l’intention était d’ouvrir le menu et qu’on arrive bien sur le menu, les deux expériences sont assez proches
Cela dit, même indépendamment de l’usage d’un lecteur d’écran, ouvrir un menu en allant vers une nouvelle page paraît assez étrange
Par exemple, si l’on demande s’il vaut mieux faire deux pages HTML différentes pour l’état ouvert/fermé d’un composant, ou utiliser la balise
<details>, alors c’est évidemment la seconde optionDe même, utiliser la Popover API est tout à fait acceptable. L’idée est d’éviter d’avoir besoin de JavaScript pour les interactions dans la page, pas de s’obstiner à imposer une navigation HTML multipage
L’approche proposée charge le menu dynamiquement avec JavaScript et
onclick, ce qui introduit de la latence et ajoute un point de donnée de plus dans le parcours utilisateurÀ la place, on pourrait intégrer le menu dans chaque page et l’afficher ou le masquer avec l’élément
<details>ou le sélecteur CSS:focus-withinhttps://nlnet.nl fonctionne de cette manière
L’approche décrite ne fonctionne pas correctement en pratique. Si l’on désactive JavaScript, qu’on ouvre un billet de blog, puis qu’on ouvre et referme le menu, on est redirigé vers l’accueil (
/) au lieu de revenir au billet d’originePour mettre le bon lien sur le bouton de fermeture, il faudrait forcément rendre le menu dynamiquement côté backend pour que cette approche tienne la route
Personnellement, je préfère la Popover API quand c’est possible. Cela permet de tout rendre de manière statique, sans backend
https://blog.jim-nielsen.com/, mais avec JavaScript activé, le gestionnaireonclicksemble intercepter la navigation Comme cela envoie vers une page différente de celle indiquée dans lehref, c’est une mauvaise expérience utilisateur. Je vérifie souvent la destination en survolant les liens, donc je n’aime pas avoir l’impression d’être trompé de cette façonD’un côté, j’aime beaucoup. On peut faire énormément de choses avec seulement du HTML, de manière plus fluide et plus simple qu’avec JavaScript
D’un autre côté, cette approche semble surtout bien convenir au mobile. Sur desktop, on s’attend plutôt à ce que le menu soit toujours visible ou surgisse en panneau, pas à devoir changer de page
Alors je me demande si cela veut dire qu’il faut désormais deux versions des pages selon les navigateurs
Cela double la friction
JavaScript était presque un accident
Je trouve étrange de considérer cette approche comme plus difficile ou plus complexe que n’importe quelle solution JavaScript. C’est clairement la façon la plus simple et la plus facile de créer un site web
Je n’aime pas trop la méthode de navigation, mais j’ai aimé les effets de transition, et je ne savais pas que c’était possible
Je l’ai appliqué aussi à mon site, qui utilise un générateur statique C++ maison et une bibliothèque de templates : https://vittorioromeo.com/
Je trouve que cela convient particulièrement bien au basculeur de thème sombre/clair
Sur desktop, cliquer sur “menu” et être envoyé vers une autre page n’est pas agréable. Cela déclenche un rechargement complet de la page, ce qui est étonnamment gênant par rapport à ce qu’on attend
Personnellement, cela casse mon flux de lecture et mon fil de pensée. Quand je clique sur un lien vers un autre site, j’ai l’impression de quitter une pièce pour en rejoindre une autre, donc j’abandonne naturellement la précédente ; mais quand cela arrive avec un menu, c’est comme aller jusqu’à une porte et se retrouver dans une pièce complètement différente, ce qui est déroutant
Honnêtement, l’idée en elle-même est bonne, mais à l’usage la sensation n’est pas bonne
Et je ne vois même pas de quels effets de transition il s’agit. Dans mon environnement, quand j’appuie sur le bouton Menu, cela charge simplement la page Menu comme d’habitude
Il est possible que cela ne marche pas non plus dans d’autres navigateurs, mais j’utilise principalement Librewolf, un fork de Firefox
Dans Chromium, les effets de transition apparaissent bien
L’idée est intéressante, mais je me demande comment cela fonctionne sur desktop
Un menu en page complète me paraît un peu excessif, donc cette façon de remplacer toute la page semble moins adaptée
Il n’est pas question du preload pour réduire le délai de chargement de la page de menu
Je me demande dans quelle mesure cela fonctionnerait bien
Cela éviterait même d’avoir à revalider auprès du serveur avant l’affichage, donc la navigation semblerait très rapide
Il y a quelques années, j’ai vu un jeu en texte créé par @misty qui utilisait de simples liens comme interaction pour donner une illusion de choix
La simplicité du HTML et la force du récit m’avaient profondément marqué