Für Interaktionen lassen sich viele kleine HTML-Seiten per Navigation aneinanderreihen
(blog.jim-nielsen.com)- Der Ansatz (L)ots of (L)ittle ht(M)l page(s) ersetzt seiteninterne Interaktionen auf JavaScript-Basis durch Navigation zwischen vielen kleinen HTML-Seiten
- Interaktionen werden als Navigation zwischen HTML-Seiten aufgebaut, in modernen Umgebungen mit CSS-View-Transitions verbessert und nur bei Bedarf um etwas JavaScript ergänzt
- Das Menü des Blogs ist keine per JavaScript aufklappende UI, sondern funktioniert durch das Folgen des Links
<a href="/menu/">zu einer eigenen Menü-Seite - Auch das Schließen des Menüs ist standardmäßig ein Link zu
/, aber wenn document.referrer vorhanden ist, wird per JavaScripthistory.back()ausgeführt, damit sich im Browserverlauf keine Einträge für das Öffnen und Schließen des Menüs ansammeln - Wenn man sich auf die Standardfunktion des Browsers, also Link-Navigation, verlässt, funktioniert es auch auf älteren Geräten, in älteren Browsern und bei deaktiviertem JavaScript; je kleiner die Seiten bleiben, desto schneller und robuster werden Interaktionen
Umsetzungsweise des Menüs und die Folgen für das Design
-
Öffnen und Schließen jeweils als Link behandeln
- Auf normalen Seiten gibt es einen Link zur Menü-Seite, und auf der Menü-Seite wird dieser Link zu einem „X“, das das Menü schließt
- Auch das Schließen ist standardmäßig ein Link zu
/, aber wenndocument.referrervorhanden ist, wird per JavaScripthistory.back()ausgeführt, damit im Browserverlauf keine Einträge für das Öffnen und Schließen des Menüs hinzugefügt werden - Eine vereinfachte Implementierung sieht so aus
<!-- 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>
-
Direkten Aufruf und interne Navigation unterscheiden
- Mit
document.referrerwird unterschieden, ob die Menü-Seite über interne Navigation im Blog erreicht wurde oder durch einen direkten Aufruf wie die Eingabe der URL - Bei interner Navigation kann sinnvoll
history.back()ausgeführt werden, bei einem direkten Aufruf geht es zu/
- Mit
-
Der Ansatz prägt das Design
- Die Lösung wirkt einfach, aber man muss zugleich das Wesen von Navigation, seitenübergreifende Interaktionen und Wege zum Erhalt kleiner Seitengrößen mitdenken
- Die Seitengröße muss klein bleiben, damit Interaktionen schnell, robust und intuitiv bleiben können
- Wenn man den Browser nicht als Runtime zum Ausführen, Laden, Kompilieren und Anzeigen beliebigen Codes betrachtet, sondern als Werkzeug zum Navigieren durch Dokumente, kann man deutlich einfachere Websites bauen, als die Werkzeuge es nahelegen
1 Kommentare
Lobste.rs-Kommentare
Normalerweise mag ich den Ansatz, immer mit HTML zu antworten, aber bei Menüs bin ich mir nicht sicher.
Mich würde die Meinung von Accessibility-Expert:innen interessieren, was besser ist: umschaltbare Elemente oder ein kompletter Seitenwechsel, um ein Menü zu öffnen.
Hier wirkt die Popover API wie die bessere Lösung, weil man damit ein Menü ohne JavaScript und ohne vollständigen Roundtrip anbieten kann.
Ansonsten stimme ich größtenteils zu, dass man keine Angst vor Seitenwechseln haben muss. Sogar eine SPA-artige Navigation ist auf SSR- und statischen Sites heute fast immer nicht schwer barrierefrei umzusetzen.
Ein Seitenwechsel setzt zwar die aktuelle Position zurück, aber wenn man ohnehin ein Menü öffnen wollte und tatsächlich beim Menü landet, ist das ziemlich ähnlich.
Trotzdem fühlt es sich, auch unabhängig von Screenreadern, ziemlich seltsam an, zum Öffnen eines Menüs auf eine neue Seite zu wechseln.
Wenn man etwa fragt, ob man den aufgeklappten/zugeklappten Zustand einer Komponente als zwei verschiedene HTML-Seiten modellieren oder einfach das Tag
<details>verwenden sollte, ist natürlich Letzteres richtig.Genauso ist es völlig in Ordnung, die Popover API zu verwenden. Der Punkt ist, JavaScript für Interaktionen innerhalb einer Seite möglichst nicht zu benötigen, nicht stur auf mehrseitiger HTML-Navigation zu bestehen.
Der gezeigte Ansatz lädt das Menü dynamisch mit JavaScript und
onclick, dadurch entsteht Latenz und ein zusätzlicher Datenpunkt in der User Journey.Stattdessen könnte man das Menü auf jeder Seite einbetten und mit dem Element
<details>oder dem CSS-Selektor:focus-withinein- und ausblenden.https://nlnet.nl funktioniert so.
Der beschriebene Ansatz funktioniert in der Praxis eigentlich nicht richtig. Wenn man JavaScript deaktiviert, einen Blogpost öffnet und dann das Menü öffnet und wieder schließt, landet man nicht beim ursprünglichen Beitrag, sondern auf der Startseite (
/).Damit der Schließen-Button den korrekten Link hat, müsste das Backend das Menü dynamisch rendern; erst dann ergibt dieser Ansatz Sinn.
Ich persönlich bevorzuge, wenn möglich, die Popover API. Dann kann man alles auch ohne Backend statisch rendern.
https://blog.jim-nielsen.com/, aber mit aktiviertem JavaScript scheint deronclick-Handler die Navigation abzufangen. Es ist eine schlechte User Experience, wenn man auf eine andere Seite geschickt wird als die, die imhrefsteht. Ich prüfe oft das Ziel, indem ich über Links hovere, und so in die Irre geführt zu werden fühlt sich nicht gut an.Einerseits gefällt mir das wirklich sehr. Mit reinem HTML kann man oft viel mehr machen, und zwar flüssiger und einfacher als mit JavaScript.
Andererseits scheint dieser Ansatz vor allem auf Mobilgeräten gut zu passen. Auf Desktop-Seiten würde ich erwarten, dass ein Menü immer sichtbar ist oder herausklappt, nicht dass dafür ein Seitenwechsel nötig ist.
Dann fragt man sich, ob man jetzt zwei Versionen von Seiten je nach Browser braucht.
Das verdoppelt die Reibung.
JavaScript war eher ein Unfall.
Ich finde es seltsam, das als schwieriger oder komplizierter zu empfinden als irgendeine JavaScript-Lösung. Es ist eindeutig die schlichteste und einfachste Art, eine Website zu bauen.
Die Navigationsart gefällt mir nicht besonders, aber den Übergangseffekt mochte ich, und ich wusste nicht, dass so etwas möglich ist.
Ich habe das direkt auch auf meiner Site eingebaut, die einen selbstgeschriebenen statischen Generator in C++ und eine Template-Bibliothek nutzt: https://vittorioromeo.com/
Besonders gut passt es meiner Meinung nach zum Umschalter für Dark-/Light-Theme.
Auf dem Desktop auf „menu“ zu klicken und dann auf eine andere Seite zu wechseln fühlt sich nicht gut an. Es gibt einen vollständigen Page Reload, und das ist entgegen der Erwartung ziemlich störend.
Für mich unterbricht das den Lesefluss und den Gedankengang. Wenn ich auf einen Link zu einer anderen Website klicke, fühlt es sich an, als würde ich den Raum verlassen und den vorherigen hinter mir lassen; wenn mir das aber in einem Menü passiert, fühlt es sich an, als stünde ich vor einer Tür und wäre plötzlich in einem ganz anderen Raum gelandet.
Die Idee selbst ist ehrlich gesagt gut, aber in der tatsächlichen Nutzung fühlt sie sich nicht gut an.
Und ich weiß auch nicht, welcher Übergangseffekt gemeint ist. In meiner Umgebung lädt beim Drücken des Menu-Buttons einfach ganz normal die Menu-Seite.
Möglicherweise auch in anderen Browsern nicht, aber mein Hauptbrowser ist Librewolf, ein Firefox-Fork.
In Chromium sieht man den Übergangseffekt.
Interessante Idee, aber ich frage mich, wie das auf dem Desktop funktionieren soll.
Ein Menü als ganze Seite wirkt etwas übertrieben, deshalb erscheint mir ein Ansatz, der die ganze Seite austauscht, weniger passend.
Es wird kein preload erwähnt, um die Ladeverzögerung der Menüseite zu verringern.
Ich frage mich, wie gut das damit funktionieren würde.
Dann müsste vor dem Anzeigen nicht einmal mehr zur Validierung beim Server nachgefragt werden, was sich sehr schnell anfühlen würde.
Vor ein paar Jahren habe ich ein Textspiel von @misty gesehen, das einfache Links als Interaktion nutzte und so die Illusion von Auswahl erzeugte.
Das schlichte HTML und die starke Erzählung haben einen bleibenden Eindruck hinterlassen.