Menu

HTML Button als Link: Button, der eine Seite öffnet

Der richtige Weg zu einem Button, der auf eine andere Seite führt, ist ein Link, der wie ein Button gestylt ist. Hier siehst du, warum ein Button in einem Link und Navigation per onclick Probleme machen, wann ein Formular-Button die richtige Wahl ist und wie du Link-Buttons stylst und deaktivierst.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

So baust du einen Button, der auf eine Seite verlinkt

Schreib einen normalen Link, <a href>, und style ihn mit CSS so, dass er wie ein Button aussieht. Er führt zur Seite wie jeder Link und behält alle Link-Funktionen: in neuem Tab öffnen, Link-Adresse kopieren und die URL-Vorschau beim Überfahren.

Die Regeln, die aus einem Link einen Button machen:

  • display: inline-block lässt den Innenabstand den Kasten aufweiten und hält ihn in der Textzeile.
  • text-decoration: none entfernt die Unterstreichung.
  • color und background ersetzen die blaue Linkfarbe.
  • :focus-visible gibt Tastaturnutzern einen deutlichen Fokusrahmen.

Dieselbe Klasse funktioniert an einem <button>, sodass der Absende-Button eines Formulars und ein Link auf eine andere Seite identisch aussehen können, während jeder seine eigene Aufgabe erledigt.

Die Frage ist, was beim Klick passiert, nicht wie es aussieht.

Ein Klick daraufNimmBeispiele
Führt zu einer anderen URL<a href>Registrieren, Mehr lesen, Preise ansehen, Herunterladen
Ändert etwas auf dieser Seite<button type="button">Menü öffnen, Abspielen, In den Warenkorb, Passwort anzeigen
Sendet ein Formular ab<button type="submit">Anmelden, Suchen, Speichern

Ein Link, der als „Link“ angesagt wird, und ein Button, der als „Button“ angesagt wird, sagen Screenreader-Nutzern, was passieren wird. Auch ihr Tastaturverhalten unterscheidet sich: Enter löst beide aus, die Leertaste aber nur Buttons (bei einem Link scrollt die Leertaste die Seite). Das button-Element selbst erklärt die Seite zum HTML Button.

Das ist das Muster, das die meisten zuerst ausprobieren:

<!-- Invalid: interactive content inside <a> -->
<a href="/signup"><button>Sign up</button></a>

<!-- Invalid the other way round, too -->
<button><a href="/signup">Sign up</a></button>

Der HTML-Standard verbietet beides: <a> und <button> dürfen keine interaktiven Elemente enthalten. In der Praxis bekommt die Tastatur zwei Tab-Stopps für ein Bedienelement, ein Screenreader sagt vielleicht „Link, Button, Sign up“ an, und ob ein Klick dem Link folgt, hängt vom Browser ab. Entscheide dich für ein Element.

Warum kein onclick mit location.href

Der andere häufige Umweg ist ein Button, der die URL per JavaScript setzt. Er sieht genauso aus wie ein Link:

(Das Beispiel nimmt window.open, weil die Vorschau nicht wegnavigieren darf; der übliche Code ist location.href = '...'.) Fahr mit der Maus über beide und klick sie mit rechts an: Nur der echte Link zeigt seine URL und bietet „Link in neuem Tab öffnen“ und „Link-Adresse kopieren“ an. Der Button bekommt außerdem weder Strg+Klick noch Mittelklick, der Browser markiert ihn nicht als besucht, und Suchmaschinen folgen ihm nicht wie einem Link. Wenn das Ziel eine URL ist, schreib <a href>.

Ein Formular-Button, der eine URL öffnet

Es gibt einen Fall, in dem ein <button>, der auf eine andere Seite führt, richtig ist: wenn er Daten mitschickt. Ein Suchfeld ist das klassische Beispiel. Das action des Formulars ist die URL, und method="get" hängt die Felder an den Query-String:

Drück auf Search: Auf einer echten Seite würde der Browser zu https://duckduckgo.com/?q=html+button+link gehen. Die Vorschau zeigt stattdessen die Daten an, statt die Seite zu verlassen. formaction schickt dasselbe Formular über den zweiten Button an eine andere URL.

Links haben kein disabled-Attribut; <a disabled> bewirkt nichts. Um einen Link-Button abzuschalten, entferne sein href (ein <a> ohne href ist kein Link und kann weder angeklickt noch fokussiert werden) und kennzeichne ihn mit aria-disabled="true", damit der Style und Screenreader es beide wissen:

Drück in der Vorschau Tab: Der Fokus landet nur auf dem ersten Button. Manche Websites behalten das href und setzen stattdessen pointer-events: none, aber das blockiert nur die Maus. Der Link bleibt mit Tab erreichbar, und Enter folgt ihm trotzdem.

Buttons für neuen Tab und Download

Jedes Link-Attribut funktioniert weiter an einem Link, der als Button gestylt ist:

<a class="btn" href="/files/guide.pdf" download>Download the guide</a>
<a class="btn" href="https://github.com/" target="_blank" rel="noopener">GitHub</a>

Noch ein Grund für <a>: Ein <button> hat weder download noch target. Mehr zu target unter Link in neuem Tab öffnen.

Häufige Fehler

  • Ein Button in einem Link oder ein Link in einem Button. Ungültiges HTML mit unvorhersehbarem Verhalten.
  • <button onclick="location.href=..."> für reine Navigation. Kein neuer Tab, kein Link kopieren, kein Crawling.
  • role="button" an einem Link, der navigiert. Er sagt Screenreader-Nutzern, dass dort ein Button ist, und dann wechselt die Seite. Lass ihn einen Link bleiben.
  • Als Buttons gestylte Links für Aktionen wie „Löschen“ oder „Menü öffnen“ mit href="#". Wenn nichts geladen wird, nimm einen <button type="button">.
  • <a disabled>. Das Attribut gibt es an Links nicht. Entferne das href.
  • display: inline-block vergessen, sodass der vertikale Innenabstand die Zeilen darüber und darunter überlappt.

Häufig gestellte Fragen

Wie mache ich in HTML einen Button, der auf eine andere Seite verlinkt?

Nimm einen Link und style ihn wie einen Button: <a href="/signup" class="btn">Sign up</a> mit CSS für Innenabstand, Hintergrund, abgerundete Ecken und text-decoration: none. Er sieht aus wie ein Button und verhält sich wie ein Link, und genau das ist er auch.

Darf ich einen Button in ein a-Tag setzen?

Nein. Der HTML-Standard erlaubt keinen interaktiven Inhalt wie <button> in <a>. Browser gehen unterschiedlich damit um, Tastaturnutzer bekommen zwei Tab-Stopps für ein Bedienelement, und Screenreader sagen es verwirrend an. Nimm ein einziges Element.

Hat ein button ein href-Attribut?

Nein. <button> hat kein href. Um den Browser zu einer URL zu schicken, nimm <a href> oder setz den Button in ein <form> mit einem action (ein formaction-Attribut am Button überschreibt es).

Ist onclick mit location.href an einem Button schlecht?

Es funktioniert, aber der Leser verliert alles, was Links ihm bieten: Mittelklick und Strg+Klick für einen neuen Tab, Link-Adresse kopieren, die URL-Vorschau beim Überfahren, und Suchmaschinen folgen ihm nicht wie einem Link. Nimm ein <a>, wenn das Ziel eine URL ist.

Wie deaktiviere ich einen Link, der wie ein Button aussieht?

Links haben kein disabled-Attribut. Entferne das href, damit er kein Link mehr ist, füg aria-disabled="true" hinzu und style ihn als deaktiviert. Setz das href wieder ein, wenn er wieder funktionieren soll.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S