Como fazer um cabeçalho no HTML
Envolva o topo da sua página (logo, nome do site, menu principal) num elemento <header>. É uma caixa block sem aparência padrão, então algumas linhas de CSS a transformam numa barra:
margin-inline-end: auto no logo empurra o menu e o botão para a outra ponta da barra. Remova o elemento <style> e você ainda tem um cabeçalho: é a tag que o torna um, não o fundo escuro.
header vs head vs h1
Três nomes parecidos que fazem trabalhos diferentes:
| Elemento | Onde | Visível | Quantos |
|---|---|---|---|
<head> | Direto dentro de <html>, antes de <body> | Não: guarda <title>, <meta>, <link> | Exatamente um |
<header> | Dentro de <body> | Sim: conteúdo introdutório de uma página ou seção | Quantos quiser |
<h1> a <h6> | Em qualquer lugar de <body> | Sim: um título | Quantos quiser |
O <head> abaixo define o título da página que o navegador mostra na aba. Tudo o que você vê na prévia vem de <body>:
Um header muitas vezes contém um título, mas não é obrigatório, e um título não precisa de um header em volta.
Headers dentro de artigos
<header> introduz o article ou section mais próximo, não só a página. Uma lista de posts de blog em que cada post tem o seu próprio header é válida e comum:
Para os leitores de tela, só o header do nível da página (um que não está dentro de article, aside, main, nav ou section) vira o landmark banner. Os headers dos artigos são grupos comuns, então você não acaba com vários banners.
Cabeçalho fixo
position: sticky mantém o header no topo enquanto o conteúdo embaixo dele rola. Role dentro da caixa abaixo:
Três detalhes fazem funcionar: top: 0 (sticky não faz nada sem um deslocamento), uma cor de fundo (senão as linhas aparecem através dele) e z-index para que o conteúdo posicionado não seja pintado por cima dele. Numa página real, a caixa que rola é a própria página, então o header fica direto no <body>.
Um header com position: fixed também fica parado, mas sai do fluxo da página, então o conteúdo desliza por baixo dele e precisa de padding no topo. O sticky mantém o seu espaço no layout.
O que pode ir num header
Um header pode conter quase qualquer conteúdo: títulos, uma imagem de logo, um <nav>, um formulário de busca, um botão. Ele não pode conter outro <header> nem um <footer>, e não pode ficar dentro de um <footer>, de um <address> ou de outro <header>.
<header>
<a href="/"><img src="logo.svg" alt="Acme home"></a>
<nav aria-label="Main">...</nav>
<form role="search">...</form>
</header>
Quando o logo é um link para a página inicial, o seu texto alt deve dizer para onde o link vai ("Acme home"), porque é isso que o leitor de tela anuncia.
Erros comuns
- Confundir
<header>com<head>. Metadados vão no<head>; conteúdo visível nunca vai. - Usar
<header>em todo título. Um título sozinho não precisa de um header em volta. Use<header>quando há um grupo de conteúdo introdutório. - Um cabeçalho fixo sem fundo. O texto da página aparece rolando através dele. Defina um
background. - Sticky que não fica preso. Um ancestral com
overflow: hiddenouoverflow: autovira a caixa de rolagem do sticky, então o header fica preso dentro dessa caixa (ou não fica preso). Verifique os ancestrais. - Colocar o menu do site numa
<div>dentro do header. Use<nav>para que quem usa leitor de tela possa pular até ele.
Perguntas frequentes
O que é a tag header no HTML?
<header> é um elemento semântico para conteúdo introdutório: o logo e o menu do site no topo da página, ou o título e a autoria no topo de um artigo. É uma caixa block normal, sem estilo padrão.
Qual a diferença entre head e header no HTML?
<head> é a parte invisível do documento, com o <title>, as tags <meta> e os links de folhas de estilo, e existe exatamente um. <header> é conteúdo visível dentro do <body>, e uma página pode ter vários.
Uma página pode ter mais de um elemento header?
Sim. Uma página normalmente tem um cabeçalho do site, e cada <article> ou <section> pode ter o seu próprio <header> para o título e as informações. Só um header que não está dentro de article, aside, main, nav ou section conta como o banner da página para os leitores de tela.
O nav deve ficar dentro do header?
Pode ficar, e muitas vezes fica quando o menu principal está no topo da página. Colocar <nav> fora de <header> também é válido; escolha o que combina com o seu layout.
Como fazer o header ficar no topo ao rolar a página?
Dê a ele position: sticky; top: 0; mais uma cor de fundo e um z-index, para que o conteúdo role por baixo. O sticky só funciona enquanto o pai do header for mais alto que ele, e um ancestral com overflow: hidden impede que ele fique preso à página.