Menu

Botão com link em HTML: um botão que abre outra página

O jeito certo de fazer um botão que leva a outra página é um link estilizado como botão. Veja por que um botão dentro de um link e a navegação com onclick dão problema, quando um botão de formulário é a escolha certa e como estilizar e desativar botões de link.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Escreva um link normal, <a href>, e estilize com CSS para que pareça um botão. Ele leva à página como qualquer link e mantém todos os recursos de link: abrir em nova aba, copiar endereço do link e a prévia da URL ao passar o mouse.

As regras que transformam um link num botão:

  • display: inline-block deixa o padding abrir a caixa e a mantém na linha de texto.
  • text-decoration: none remove o sublinhado.
  • color e background substituem a cor azul do link.
  • :focus-visible dá a quem usa teclado um contorno de foco bem visível.

A mesma classe funciona num <button>, então o botão de envio de um formulário e um link para outra página podem ter a mesma aparência enquanto cada um faz o seu trabalho.

A pergunta é o que acontece no clique, não a aparência.

Clicar neleUseExemplos
Vai para outra URL<a href>Cadastrar, Leia mais, Ver preços, Baixar
Muda algo nesta página<button type="button">Abrir menu, Play, Adicionar ao carrinho, Mostrar senha
Envia um formulário<button type="submit">Entrar, Buscar, Salvar

Um link anunciado como "link" e um botão anunciado como "botão" dizem a quem usa leitor de tela o que vai acontecer. O comportamento no teclado também é diferente: Enter aciona os dois, mas Espaço aciona só botões (num link, Espaço rola a página). O elemento button em si está em botão HTML.

Este é o padrão que a maioria tenta primeiro:

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

O padrão HTML proíbe os dois: <a> e <button> não podem conter elementos interativos. Na prática, o teclado ganha duas paradas de Tab para um único controle, um leitor de tela pode anunciar "link, botão, Sign up", e se um clique segue o link depende do navegador. Escolha um elemento.

Por que não onclick com location.href

A outra gambiarra comum é um botão que define a URL no JavaScript. Ele parece igual a um link:

(O exemplo usa window.open porque a prévia não pode navegar para fora; o código usual é location.href = '...'.) Passe o mouse e clique com o botão direito nos dois: só o link de verdade mostra a URL e oferece "Abrir link em nova aba" e "Copiar endereço do link". O botão também não aceita Ctrl+clique nem clique do meio, o navegador não o marca como visitado e os buscadores não o seguem como link. Se o destino é uma URL, escreva <a href>.

Um botão de formulário que abre uma URL

Existe um caso em que um <button> que leva a outra página é o certo: quando ele envia dados junto. Uma caixa de busca é o exemplo clássico. O action do formulário é a URL e method="get" coloca os campos na query string:

Aperte Search: numa página real o navegador iria para https://duckduckgo.com/?q=html+button+link. A prévia mostra os dados em vez de sair. formaction envia o mesmo formulário para outra URL a partir do segundo botão.

Links não têm atributo disabled; <a disabled> não faz nada. Para desligar um botão de link, remova o href (um <a> sem href não é link e não pode ser clicado nem receber foco) e marque com aria-disabled="true" para que o estilo e os leitores de tela saibam:

Aperte Tab na prévia: o foco cai só no primeiro botão. Alguns sites mantêm o href e adicionam pointer-events: none, mas isso só bloqueia o mouse. O link continua alcançável com Tab, e Enter ainda o segue.

Botões de nova aba e de download

Todos os atributos de link continuam funcionando num link estilizado como botão:

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

Esse é mais um motivo para usar <a>: um <button> não tem download nem target. Mais sobre target em abrir link em nova aba.

Erros comuns

  • Um botão dentro de um link, ou um link dentro de um botão. HTML inválido com comportamento imprevisível.
  • <button onclick="location.href=..."> para navegação simples. Sem nova aba, sem copiar link, sem rastreamento pelos buscadores.
  • role="button" num link que navega. Diz a quem usa leitor de tela que ali existe um botão, e então a página muda. Mantenha como link.
  • Links estilizados como botão para ações como "Excluir" ou "Abrir menu" com href="#". Se nada é carregado, use um <button type="button">.
  • <a disabled>. O atributo não existe em links. Remova o href.
  • Esquecer display: inline-block, o que faz o padding vertical sobrepor as linhas de cima e de baixo.

Perguntas frequentes

Como fazer um botão com link para outra página no HTML?

Use um link e estilize como botão: <a href="/signup" class="btn">Sign up</a> com CSS para padding, fundo, border radius e text-decoration: none. Ele parece um botão e se comporta como um link, que é o que ele é.

Posso colocar um button dentro de uma tag a?

Não. O padrão HTML não permite conteúdo interativo como <button> dentro de <a>. Cada navegador lida com isso de um jeito, quem usa teclado passa por duas paradas de Tab para um único controle e os leitores de tela o anunciam de forma confusa. Use um elemento só.

O button tem atributo href?

Não. <button> não tem href. Para levar o navegador a uma URL, use <a href>, ou coloque o botão num <form> com um action (um atributo formaction no botão o substitui).

É ruim usar onclick com location.href num botão?

Funciona, mas o leitor perde tudo o que os links oferecem: clique do meio e Ctrl+clique para nova aba, Copiar endereço do link, a prévia da URL ao passar o mouse, e os buscadores não o seguem como link. Use um <a> quando o destino é uma URL.

Como desativar um link que parece um botão?

Links não têm atributo disabled. Remova o href para que ele deixe de ser link, adicione aria-disabled="true" e estilize como desativado. Coloque o href de volta quando ele tiver que funcionar de novo.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR