Verwende Buttons
(gomakethings.com)- In Web-Oberflächen ist es hinsichtlich Barrierefreiheit und Funktionalität die richtige Wahl, statt eines
einzu verwenden - Ein `` wird von Screenreadern nicht als interaktives Element erkannt und reagiert weder auf Tastaturfokus noch auf Eingaben per
EnteroderSpacebar - Selbst wenn man Attribute wie
[role="button"]oder[tabindex="0"]hinzufügt, bleiben Probleme mit der Fokusreihenfolge und der Verarbeitung von Tastaturereignissen bestehen - Um diese Probleme zu lösen, mehrere Event-Listener und Bedingungen hinzuzufügen, erzeugt unnötige Komplexität
- Ein `` bringt Barrierefreiheit, Fokus und die Verarbeitung von Tastatureingaben von Haus aus mit und ist daher die einfache und standardkonforme Lösung
Falscher Ansatz: Einen Button mit `` bauen
- Unter React- oder HTMX-Nutzern gibt es viele Fälle, in denen Interaktionen wie das Öffnen eines Modals in der Form `` umgesetzt werden
- Beispielcode:
Open Modal
- Beispielcode:
- Probleme dieses Ansatzes
- Screenreader erkennen das Element nicht als interaktives Element
- Es ist per Tastatur nicht fokussierbar
- Nur das
click-Event funktioniert; aufEnter- oderSpacebar-Eingaben reagiert es nicht
Grenzen von Versuchen, die Barrierefreiheit zu „reparieren“
- Fügt man das Attribut
[role="button"]hinzu, wird das Erkennungsproblem für Screenreader gelöst, die Probleme mit Fokussierbarkeit und Tastatureingaben bleiben jedoch bestehen - Mit
[tabindex="0"]kann man das Element fokussierbar machen, doch es besteht das Risiko einer fehlerhaften Fokusreihenfolge oder unerwarteter Sprünge - Um Tastatureingaben zu verarbeiten, muss man ein
keydown-Event global aufdocumentregistrieren und beiEnteroder der Taste' '(Leertaste) das fokussierte Element finden und ausführendocument.addEventListener('keydown', (event) => { if (event.key !== 'Enter' && event.key !== ' ') return; const notRealBtn = document.activeElement.closest('[onclick]'); if (!notRealBtn) return; // 실행 코드 }); - Letztlich implementiert man damit auf komplizierte Weise Funktionen neu, die ein `` standardmäßig bereits mitbringt
Welche Standardfunktionen `` mitbringt
- Das ``-Element unterstützt automatisch Folgendes
- eine implizite Rolle (
[role="button"]) - automatische Fokussierbarkeit
- im fokussierten Zustand das Auslösen eines
click-Events beiEnter- undSpacebar-Eingaben
- eine implizite Rolle (
- Dasselbe Verhalten mit einem
umzusetzen, erfordert **mehrere Attribute und Skripte**, während eindas mit nur einer Zeile löstOpen Modal
Fazit: Einfachheit ist am besten
- Ein `` ist die einfachste Methode, um Barrierefreiheitsstandards einzuhalten und zugleich die Code-Menge zu reduzieren
- Statt unnötiger Event-Verarbeitung oder zusätzlicher Attribute ist es für Wartbarkeit und Effizienz vorteilhafter, standardmäßige HTML-Elemente zu verwenden
- Mit der Botschaft „Je fauler der Entwickler, desto eher sollte er das richtige Element verwenden“ wird die Bedeutung guter Entwicklungsgewohnheiten betont: unnötige Komplexität vermeiden und die eingebauten Standardfunktionen nutzen
7 Kommentare
Ein wirklich guter Artikel. Die Kernaussage des Haupttextes lässt sich mit „Verwenden wir HTML-Tags semantisch sinnvoll.“ zusammenfassen. Wenn man mit
div-Tags (oder anderen) Klick-Events bereitstellt, hat sich das meiner Meinung nach überhaupt nicht von der Zeit unterschieden, als man Layouts mittable-Tags aufgebaut hat.Natürlich kann man es mit
aria-*-Attributen zwar eindeutiger machen, aber bevor man sich diese Mühe macht, verwendet man lieber einfach den passenden Tag lolDas weckt Erinnerungen, hahaha
background, border, outline, appearance, -webkit-appearance, cursor
Es gibt viel zu viele Standard-Stylesheets, die man überschreiben muss. seufz
Deshalb gibt es ja ein CSS-Reset.
Unsere Behörden-Websites scheinen oft `` zu verwenden...
Hacker-News-Kommentare
Einer meiner größten Kritikpunkte ist, wenn Websites Navigation mit
onclick-Handlern umsetzen Wenn man einfach ein ``-Tag verwendet, funktionieren neues Tab öffnen, Integration mit Hilfstechnologien, Rechtsklick-Menü usw. automatisch korrekt Wenn es Navigation ist, sollte man Links statt JavaScript-Suppe verwendenonClickSogar Elemente, die faktisch Links sind, wurden alle über Klick-Handler verarbeitet, was ich nicht nachvollziehen kannBei den meisten Buttons sollte man
type="button"explizit angeben Der Standardwert istsubmit, daher wird innerhalb eines Formulars automatisch abgesendet Vermutlich verwenden manche Entwickler deshalb ``, undist andersverwendet, kann man das Problem mit `type="submit"` vermeiden Einist von Anfang an leer, sodass man nur die Funktionen hinzufügt, die man braucht, und später leichter Änderungen vornehmen kann Bei `` muss man dagegen die Dokumentation lesen, um das Standardverhalten zu verstehen Letztlich ist es eine Frage von expliziter Kontrolle vs. eingebauten FunktionenIch hätte mir gewünscht, dass der Artikel stärker in die Richtung „Verwendet einfach die HTML-Elemente, die für diesen Zweck gemacht sind“ erweitert wird Viele SPA-Entwickler kennen die Semantik von HTML-Elementen nicht gut und erfinden deshalb ständig das Rad neu
Inzwischen gibt es eine Generation, die über den Bildschirm tippt oder klickt, um überhaupt herauszufinden, was anklickbar ist Vor zehn Jahren hat jemand das Ziehen von Links wichtiger gemacht als Textauswahl, und jetzt ist Textauswahl fast unmöglich Um das zu beheben, müsste man den Browser vielleicht forken
Im Standard-Stylesheet von Chrome gibt es
button {align-items: flex-start}, und ich habe deshalb lange nach einem Flexbox-Größenfehler gesucht Trotzdem versuche ich, soweit möglich die korrekten HTML-Elemente zu verwenden, auch wenn in kleinen Nebenprojekten ein `` manchmal bequemer istappearance: noneist nützlich, um Button-Styling zurückzusetzen Ich erstelle dafür eine Klasse.unbuttonify, die sich wie ein Button verhält, aber anders aussiehtMan sollte Elemente so weit wie möglich entsprechend ihrer ursprünglichen Bestimmung verwenden
Ich habe zwei Beschwerden über Buttons Die eine ist, dass man sie ohnehin neu stylen muss, die andere ist die Warnung, dass Buttons nicht verschachtelt werden dürfen Damit stößt man in der Praxis ziemlich häufig zusammen
LLMs erzeugen solche falschen Muster sehr häufig Sie ignorieren oft die Standardfunktionen des Browsers und implementieren Dinge unnötig kompliziert Ich bitte Claude oft, solchen Code zu vereinfachen Auch in TypeScript neigen sie dazu, die Fehlerbehandlung auf merkwürdige Weise zu gestalten
Ich verwende nach Möglichkeit standardmäßig Buttons Wenn sich etwas tatsächlich wie ein Link verhalten soll, verwende ich aber ein ``-Tag
Ich habe mich gefragt, warum überhaupt vorgeschlagen wird, `` zu verwenden