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-labelouaria-labelledbya 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 dehreffuncionam.
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.