Menu

Przycisk jako link w HTML: jak zrobić przycisk otwierający stronę

Właściwy sposób na przycisk prowadzący do innej strony to link wystylizowany jak przycisk. Zobacz, dlaczego przycisk w linku i nawigacja przez onclick się psują, kiedy lepszy jest przycisk formularza i jak stylizować oraz wyłączać linki-przyciski.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Jak zrobić przycisk, który prowadzi do strony

Napisz zwykły link, <a href>, i wystylizuj go w CSS tak, żeby wyglądał jak przycisk. Przenosi na stronę jak każdy link i zachowuje wszystkie funkcje linku: otwieranie w nowej karcie, kopiowanie adresu i podgląd adresu po najechaniu.

Reguły, które zmieniają link w przycisk:

  • display: inline-block pozwala, by padding rozpychał pudełko, i zostawia je w linii tekstu.
  • text-decoration: none usuwa podkreślenie.
  • color i background zastępują niebieski kolor linku.
  • :focus-visible daje użytkownikom klawiatury wyraźną ramkę fokusu.

Ta sama klasa działa na <button>, więc przycisk wysyłający formularz i link do innej strony mogą wyglądać identycznie, a każdy robi swoje.

Liczy się to, co dzieje się po kliknięciu, a nie wygląd.

KliknięcieUżyjPrzykłady
Przenosi pod inny adres URL<a href>Zarejestruj się, Czytaj dalej, Zobacz cennik, Pobierz
Zmienia coś na tej stronie<button type="button">Otwórz menu, Odtwórz, Dodaj do koszyka, Pokaż hasło
Wysyła formularz<button type="submit">Zaloguj się, Szukaj, Zapisz

Link ogłaszany jako "link" i przycisk ogłaszany jako "przycisk" mówią użytkownikom czytników ekranu, co się stanie. Różni je też obsługa klawiatury: Enter aktywuje oba, ale Spacja tylko przyciski (na linku Spacja przewija stronę). Sam element przycisku opisuje strona przycisk HTML.

Dlaczego nie umieszczać przycisku w linku

Ten wzorzec większość osób próbuje jako pierwszy:

<!-- 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>

Standard HTML zabrania obu: <a> i <button> nie mogą zawierać elementów interaktywnych. W praktyce klawiatura dostaje dwa przystanki Tab dla jednej kontrolki, czytnik ekranu może ogłosić "link, przycisk, Sign up", a to, czy kliknięcie otworzy link, zależy od przeglądarki. Wybierz jeden element.

Dlaczego nie onclick z location.href

Drugie popularne obejście to przycisk, który ustawia adres w JavaScripcie. Wygląda tak samo jak link:

(Przykład używa window.open, bo podgląd nie może opuścić strony; zwykle pisze się location.href = '...'.) Najedź na oba i kliknij je prawym przyciskiem: tylko prawdziwy link pokazuje swój adres i oferuje "Otwórz link w nowej karcie" oraz "Kopiuj adres linku". Przycisk nie obsługuje też Ctrl+klik ani kliknięcia środkowym przyciskiem, przeglądarka nie oznacza go jako odwiedzonego, a wyszukiwarki nie traktują go jak linku. Jeśli celem jest adres URL, napisz <a href>.

Przycisk formularza, który otwiera adres URL

Jest jeden przypadek, w którym <button> prowadzący do innej strony jest właściwy: gdy wysyła przy tym dane. Klasyczny przykład to pole wyszukiwania. action formularza to adres URL, a method="get" umieszcza pola w query stringu:

Naciśnij Search: na prawdziwej stronie przeglądarka przeszłaby pod https://duckduckgo.com/?q=html+button+link. Podgląd zamiast tego pokazuje dane. formaction wysyła ten sam formularz pod inny adres z drugiego przycisku.

Wyłączone linki-przyciski

Linki nie mają atrybutu disabled; <a disabled> nic nie robi. Aby wyłączyć link-przycisk, usuń jego href (<a> bez href nie jest linkiem i nie da się go kliknąć ani ustawić na nim fokusu), i oznacz go przez aria-disabled="true", żeby wiedziały o tym i style, i czytniki ekranu:

Naciśnij Tab w podglądzie: fokus trafia tylko na pierwszy przycisk. Niektóre strony zostawiają href i dodają zamiast tego pointer-events: none, ale to blokuje tylko mysz. Link nadal jest osiągalny klawiszem Tab, a Enter nadal go otwiera.

Przyciski nowej karty i pobierania

Każdy atrybut linku działa dalej na linku wystylizowanym jak przycisk:

<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>

To kolejny powód, by używać <a>: <button> nie ma download ani target. Więcej o target przeczytasz na stronie otwieranie linku w nowej karcie.

Częste błędy

  • Przycisk w linku albo link w przycisku. Niepoprawny HTML o nieprzewidywalnym działaniu.
  • <button onclick="location.href=..."> do zwykłej nawigacji. Brak nowej karty, kopiowania linku i indeksowania.
  • role="button" na linku, który przenosi na inną stronę. Mówi użytkownikom czytników ekranu, że to przycisk, a potem zmienia się strona. Niech zostanie linkiem.
  • Linki wystylizowane jak przyciski do akcji takich jak "Usuń" czy "Otwórz menu" z href="#". Jeśli nic się nie wczytuje, użyj <button type="button">.
  • <a disabled>. Linki nie mają tego atrybutu. Usuń href.
  • Brak display: inline-block, przez co pionowy padding nachodzi na linie powyżej i poniżej.

Najczęściej zadawane pytania

Jak zrobić w HTML przycisk, który prowadzi do innej strony?

Użyj linku i wystylizuj go jak przycisk: <a href="/signup" class="btn">Sign up</a> z CSS ustawiającym padding, tło, zaokrąglenie i text-decoration: none. Wygląda jak przycisk i działa jak link, bo nim jest.

Czy mogę umieścić przycisk w znaczniku a?

Nie. Standard HTML nie pozwala na treść interaktywną, taką jak <button>, wewnątrz <a>. Przeglądarki obsługują to różnie, użytkownicy klawiatury trafiają na dwa przystanki Tab dla jednej kontrolki, a czytniki ekranu ogłaszają ją myląco. Użyj jednego elementu.

Czy przycisk ma atrybut href?

Nie. <button> nie ma href. Aby przenieść przeglądarkę pod adres URL, użyj <a href> albo umieść przycisk w <form> z action (atrybut formaction na przycisku go nadpisuje).

Czy używanie onclick z location.href na przycisku to zły pomysł?

Działa, ale czytelnik traci wszystko, co dają linki: kliknięcie środkowym przyciskiem i Ctrl+klik dla nowej karty, kopiowanie adresu linku, podgląd adresu po najechaniu, a wyszukiwarki nie traktują go jak linku. Gdy celem jest adres URL, użyj <a>.

Jak wyłączyć link, który wygląda jak przycisk?

Linki nie mają atrybutu disabled. Usuń href, żeby przestał być linkiem, dodaj aria-disabled="true" i nadaj mu styl wyłączonego. Przywróć href, gdy ma znowu działać.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ