Menu

Tag nav no HTML: barra de navegação, menus e breadcrumbs

O elemento <nav> marca um bloco de links de navegação principais. Veja como montar uma barra de navegação com <nav> e uma lista, como marcar a página atual, como nomear vários navs numa página e como fazer um botão de menu para celular.

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

Uma barra de navegação com nav

Envolva o seu menu em <nav> e coloque os links numa lista. O flexbox transforma a lista numa barra horizontal:

list-style: none e padding: 0 removem os marcadores e o recuo. display: block em cada link faz o padding ocupar espaço de verdade na barra, então a caixa inteira com padding é o alvo do clique. Apague a linha display: flex e o mesmo menu vira uma lista vertical, que é a cara de um menu de barra lateral.

O <nav> em si não tem aparência nenhuma. O trabalho dele é o significado: os leitores de tela o expõem como um landmark de navegação, então o usuário pode pular para o menu, ou passar por ele, com uma tecla.

Marque a página atual

Adicione aria-current="page" ao link da página que está sendo exibida. Ele diz aos leitores de tela "você está aqui" e dá ao CSS um gancho para destacar o link:

Mova aria-current="page" para outro link e o destaque o acompanha. Estilizar o atributo em vez de uma classe .active mantém a aparência e a acessibilidade em sincronia: você não tem uma sem a outra.

Vários navs numa página: rótulos e breadcrumbs

Uma página pode ter um menu principal, breadcrumbs e um sumário, cada um no seu próprio <nav>. Dê a cada um um aria-label, para que o leitor de tela anuncie "navegação Breadcrumb" em vez de três entradas "navegação" idênticas:

Breadcrumbs usam uma lista ordenada <ol> porque a ordem importa. As barras vêm do ::before do CSS, então os leitores de tela não leem "barra" entre cada item. O último item é a página atual e não é um link.

Um sumário

Uma lista de links para seções da mesma página também é navegação. Links #id pulam para o elemento com esse id; teste na prévia:

Aqui o rótulo vem de um título visível com aria-labelledby, o que é melhor que aria-label quando o título já está na tela.

Um botão de menu para celular

Em telas estreitas, os menus normalmente ficam escondidos atrás de um botão. Use um <button> de verdade com aria-expanded e mantenha os links dentro do <nav>:

aria-expanded diz ao leitor de tela se o menu está aberto, e o atributo hidden tira a lista da tela e da árvore de acessibilidade enquanto ela está fechada. Em telas largas, você mostraria a lista com uma media query e esconderia o botão.

Erros comuns

  • Envolver todo grupo de links em <nav>. Use para o menu principal, breadcrumbs, paginação e sumários. Links dentro do texto não são blocos de navegação.
  • Um botão de menu feito com <div>. Não recebe foco nem pode ser acionado pelo teclado. Use <button>.
  • Vários navs sem rótulos. Adicione aria-label ou aria-labelledby a cada um para que possam ser diferenciados.
  • Só colorir o link atual. Adicione aria-current="page"; a cor sozinha não é anunciada e pode não ser visível para todos.
  • Links com href="#" em produção. Servem numa demonstração, mas os itens de um menu real precisam de URLs reais para funcionar quando abertos numa nova aba. A página de link HTML explica como os valores de href funcionam.

Perguntas frequentes

O que é a tag nav no HTML?

<nav> é um elemento semântico que envolve um bloco de links de navegação principais, como o menu do site, um sumário ou breadcrumbs. Os leitores de tela o listam como um landmark de navegação para que o usuário pule direto até ele.

Os links dentro do nav devem ficar numa lista?

É o padrão comum, e é um bom padrão: uma <ul> de itens <li> permite que os leitores de tela anunciem quantos links o menu tem. Links soltos direto dentro de <nav> também são válidos, por exemplo para dois ou três links em linha.

Todo grupo de links precisa de um elemento nav?

Não. Use <nav> só para blocos de navegação principais. Alguns links num parágrafo ou uma lista curta de links legais no rodapé não precisam dele, e landmarks de navegação demais tornam cada um mais difícil de achar.

Como fazer uma barra de navegação horizontal?

Coloque os links numa <ul> dentro de <nav> e dê à lista display: flex; list-style: none; padding: 0; e um gap. O flexbox coloca os itens em linha.

Como mostrar a página atual numa navbar?

Adicione aria-current="page" ao link da página em que o usuário está e estilize com o seletor [aria-current="page"]. Os leitores de tela também passam a anunciá-lo como a página atual.

Uma página pode ter mais de um nav?

Sim, por exemplo um menu principal, uma trilha de breadcrumbs e um sumário. Dê a cada um um aria-label diferente, como "Main" ou "Breadcrumb", para que quem usa leitor de tela consiga diferenciá-los.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR