Buttons vs. Links: Semantics and Usability
Was ein Element ist, bestimmt, wie es verwendet werden kann. Semantik drückt aus, was ein Element ist, und daher auch, wie es verwendet werden kann. Und die Semantik eines Links ist nicht dieselbe wie die eines Buttons. Sie sind beide interaktive Elemente – aber das war es auch schon.
Buttons
Buttons lösen programmierbare Aktionen aus. Programmierbare Aktionen benötigen JavaScript. Ausnahmen bestätigen die Regel: ein Submit-Button in einem Formular schickt ein Formular ab – ganz ohne JavaScript.
Ein HTML <button>-Element hat implizit die Rolle »Button«. Semantik und Verhalten sind eingebaut. Alle Browser haben Keyboard-Support für Buttons. Das bedeutet:
- ein Button ist standardmäßig fokussierbar, wenn der User mit einem Keyboard durch die Seite tabbt
- es ist nicht nötig, das
tabindex="0"-Attribut zum Button hinzuzufügen - ein Button ist keyboard-operable, d.h., er kann mit der Leertaste und der Entertaste aktiviert werden
Wenn er nicht innerhalb eines Formulars ist, wird er ohne JavaScript nichts machen. Er hat kein vorgegebenes Verhalten. Dieses muss mit JavaScript hinzugefügt werden.
Links
Links bringen uns an andere Orte. Technisch gesehen können Links aber noch viel mehr:
- ein Dokument downloaden (mit dem
download-Attribut) - ein E-Mail mit dem Standard-E-Mail-Programm verschicken
- eine Telefonnummer wählen
Das alles wird durch das href-Attribut möglich gemacht. Wenn ein <a>-Element ein href-Attribut enthält, dann repräsentiert es einen Hyperlink, der durch seinen Inhalt gekennzeichnet wird. Ohne href-Attribut hat ein Link keine implizite Link-Rolle und wird daher auch keiner ARIA-Rolle zugewiesen und nicht im AccTree angezeigt. Heißt weiter, ein Anchor-Element ohne href-Attribut ist kein Link. Es ist in den meisten Browsern auch nicht fokussierbar und wird aus der Tabbing-Order der Seite herausgenommen.
Ein Link ist von sich aus:
- fokussierbar, es ist nicht nötig, das
tabindex="0"-Attribut zum Button hinzuzufügen - keyboard-operable, d.h., er kann (nur) mit der Enter-Taste bedient werden
- Links brauchen kein JavaScript, um zu tun, was sie tun
Links als disabled kennzeichnen
Links können, im Gegensatz zu Buttons, nicht mit dem disabled-Attribut deaktiviert werden. Wenn ein Link-Element kein href-Attribut hat, wird es ja nicht mehr als solches von einem Screenreader erkannt, daher muss die semantische Information über das ARIA-Attribut role="link" hergestellt werden. Mit aria-disabled="true" kann der Link für Screenreader als disabled gekennzeichnet werden.
Links in Buttons umwandeln
Nur in begründeten Ausnahmefällen (progressive enhancement) machen!
<a href="#" role="button" class="btn">Chirp chirp</a> Chirp chirp Siehe dazu auch den Artikel von Adrian Roselli (unten verlinkt): wie ein Button Events abfeuert (bei Space und Enter-Taste nämlich anders)
Nicht alle AT bekommen ihre accessibility information über den accessibility tree!!! Z.B. bei Forced Colors Mode in Windows
Buttons vs. Links Übersicht
| default behaviour | implicit semantics | activated via | Can be disabled? | |
<button> | none unless it submits a form | button | Space, Enter/Return | disabled attribute |
<a href=""> | takes the user somewhere | link | Enter/Return only | No (but can work around it using ARIA) |
Links
- Das Link-Element - HTML Living Standard
- Adrian Roselli Brief Note on Buttons, Enter, and Space