Skip to content
This page has been auto-translated and may contain errors.View in English

Sua primeira página HTML

docs.scrimba.com

Todo documento HTML compartilha o mesmo esqueleto pequeno: uma linha que declara o tipo de documento, um elemento raiz que envolve tudo, um head com informações sobre a página e um body com o conteúdo que as pessoas veem. Este capítulo desmonta esse esqueleto linha por linha e depois o salva em um arquivo que você pode abrir em um navegador.

O esqueleto do documento

Aqui está o esqueleto do qual cada página começa. Você pode copiá-lo exatamente e alterar as partes dentro do body:

html
<!DOCTYPE html>
<html lang="pt-BR">
  <head>
    <title>Minha primeira página</title>
  </head>
  <body>
    <h1>Olá</h1>
    <p>Esta é minha primeira página web.</p>
  </body>
</html>

A primeira linha, <!DOCTYPE html>, diz ao navegador que esta é uma página HTML moderna. Depois vem o elemento raiz, <html>, que envolve todo o resto da página. Dentro dele ficam duas caixas: <head> para informações nos bastidores e <body> para as palavras e imagens que um visitante vê. Seu título e parágrafo ficam no body, porque essa é a parte em exibição.

Pense em tudo isso como uma encomenda etiquetada. O doctype é o selo que diz qual sistema postal usar, <html> é a caixa, o head é a etiqueta na parte externa e o body é o que está embalado dentro.

Todo documento é construído com as mesmas quatro partes, e é útil nomear cada uma pelo seu trabalho:

html
<!DOCTYPE html>
<html lang="pt-BR">
  <head>
    <title>Minha primeira página</title>
  </head>
  <body>
    <h1>Olá</h1>
    <p>Esta é minha primeira página web.</p>
  </body>
</html>

<!DOCTYPE html> é a declaração de tipo de documento. Não é uma tag HTML, é um comutador: sua presença diz ao navegador para renderizar em modo de padrões em vez do antigo modo de compatibilidade mantido para páginas dos anos 1990. <html> é o elemento raiz, o elemento único que contém todos os outros. Seu atributo lang="pt-BR" indica o idioma da página. Então <head> contém informações sobre a página e <body> contém o conteúdo. O recuo não é obrigatório, mas aninhar o head e o body dentro de <html> e seus filhos dentro deles mantém a estrutura legível.

O esqueleto parece boilerplate, mas cada linha muda como o navegador trata o documento.

html
<!DOCTYPE html>
<html lang="pt-BR">
  <head>
    <title>Minha primeira página</title>
  </head>
  <body>
    <h1>Olá</h1>
    <p>Esta é minha primeira página web.</p>
  </body>
</html>

<!DOCTYPE html> é a declaração de tipo de documento e, apesar dos colchetes angulares, não é um elemento. É um comutador de modo. Com ele, o navegador usa modo de padrões, significando que segue a especificação atual para layout e dimensionamento de caixa. Omita-o e o navegador volta para o modo de compatibilidade, uma emulação do comportamento dos anos 1990 que erra detalhes como larguras de caixa. Existe exatamente um doctype correto para HTML hoje, e é este curto; os doctypes longos e versionados da era XHTML são obsoletos.

<html> é o elemento raiz, o nó único do qual toda a árvore do documento desce. Tudo mais é descendente dele. O atributo lang pertence aqui porque define o idioma base para todo o documento. <head> e <body> são seus únicos dois filhos permitidos, nessa ordem: metadados primeiro, conteúdo segundo. Se você omitir as tags <head> ou <body>, o analisador as insere para você (esse parsing tolerante novamente), mas escrevê-las mantém seu código-fonte e a árvore resultante em acordo, que é o que você quer quando está raciocinando sobre qualquer um deles.

JunoO esqueleto do documento Cada página começa com o mesmo esqueleto: <!DOCTYPE html>, depois <html> envolvendo um <head> e um <body>. Copie-o como está e coloque suas próprias palavras no body. Você não precisa memorizá-lo ainda; você digitará o suficiente para que ele grude sozinho.
JunoO esqueleto do documento Quatro partes, cada uma com um trabalho: o doctype ativa o modo de padrões, <html> é o raiz, <head> é informação sobre a página, <body> é o conteúdo. O atributo lang vai em <html> porque descreve o documento todo. Coloque essa forma em seus dedos e cada nova página começa da mesma maneira confiável.
JunoO esqueleto do documento O doctype é um comutador de modo, não uma tag: com ele você obtém modo de padrões, sem ele modo de compatibilidade e dimensionamento de caixa errado. <html> é a raiz com exatamente dois filhos, head depois body, e o analisador os inserirá se você esquecer. Escreva-os mesmo assim para que seu código-fonte corresponda à árvore sobre a qual você está raciocinando.

O que vai no head versus no body

As duas caixas dentro de <html> têm trabalhos diferentes. O <head> contém coisas que o navegador precisa saber mas o visitante não lê na página. O <body> contém tudo que o visitante vê.

html
<head>
  <title>Minhas notas de receita</title>
</head>
<body>
  <h1>Bolo de banana</h1>
  <p>Misture, despeje, asse por uma hora.</p>
</body>

O <title> fica no head e é o nome da página: aparece na aba do navegador, não no meio da página. O título e o parágrafo ficam no body, para que apareçam na página em si. Uma regra simples para começar: se um visitante deve ler, vai no body.

A divisão é informação sobre a página versus conteúdo da página. O <head> é para metadados: dados sobre o documento em vez do conteúdo do documento. O <body> é o conteúdo em si, a parte renderizada na janela do navegador.

html
<head>
  <title>Receita de bolo de banana</title>
</head>
<body>
  <h1>Bolo de banana</h1>
  <p>Misture, despeje, asse por uma hora.</p>
</body>

O exemplo mais claro é <title>. Ele fica no head porque não é parte do conteúdo da página, mas faz um trabalho real: ele nomeia a aba, é o rótulo salvo quando alguém marca a página como favorita e é o título que um mecanismo de busca mostra em seus resultados. Outros elementos do head seguem a mesma lógica. Eles configuram ou descrevem a página. Nada no head é desenhado na área da página, então se você se encontrar querendo colocar um título ou uma imagem no head, ele pertence ao body.

O head é onde o documento se descreve e configura; o body é o conteúdo ao qual essa descrição se aplica. Tudo no head é metadados, dados sobre o documento em vez de conteúdo mostrado na área da página.

html
<head>
  <title>Receita de bolo de banana</title>
  <meta name="description" content="Um bolo rápido: misture, despeje, asse." />
</head>
<body>
  <h1>Bolo de banana</h1>
  <p>Misture, despeje, asse por uma hora.</p>
</body>

<title> ganha seu lugar várias vezes. Ele nomeia a aba do navegador, é o texto padrão quando a página é marcada ou compartilhada e é o título clicável nos resultados de busca, o que o torna uma das strings de maior valor na página. Um elemento <meta name="description"> fornece a linha de resumo que um mecanismo de busca pode mostrar abaixo desse título; nunca é renderizado na página, que é o ponto.

O head também contém os elementos que puxam seus outros arquivos: <link rel="stylesheet"> para CSS e <script> para JavaScript, embora um script frequentemente fique no final do body para que o conteúdo seja analisado primeiro. A regra que mantém isso limpo: o head é analisado antes do body, então qualquer coisa que a página precise configurada antes de seu conteúdo ser lido (sua codificação, sua folha de estilos, seu título) pertence lá e tudo que uma pessoa realmente lê pertence ao body.

JunoO que vai no head versus no body Head é nos bastidores, body é em exibição. O <title> fica no head e nomeia a aba do navegador; seus títulos e parágrafos ficam no body onde as pessoas os leem. Se um visitante deve vê-lo, vai no body. Essa uma pergunta resolve quase tudo.
JunoO que vai no head versus no body O head é metadados, informação sobre a página; o body é o conteúdo da página. <title> é o nome da aba, o rótulo dos favoritos e o título de busca ao mesmo tempo, é por isso que ganha um espaço no head. Nada no head é desenhado na página, então um título ou imagem que você pretendia mostrar pertence ao body.
JunoO que vai no head versus no body Head descreve e configura o documento, body é o conteúdo ao qual essa configuração se aplica, e o head é analisado primeiro. <title> e <meta name="description"> são strings de alto valor que um mecanismo de busca lê, nunca desenhadas na página. Qualquer coisa que a página precise configurar antes de seu conteúdo, sua codificação e folha de estilos, vai no head; tudo que uma pessoa lê vai no body.

Charset e viewport

Duas linhas a mais vão no head de praticamente toda página. Você pode copiá-las como está:

html
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Minha primeira página</title>
</head>

A primeira linha diz ao navegador como ler seu texto para que letras acentuadas, aspas curvas e emoji saiam corretos em vez de se tornarem símbolos estranhos. A segunda linha diz ao navegador para encaixar a página na largura da tela, o que a torna legível em um telefone em vez de uma versão minúscula ampliada da página de desktop. Você não precisa entender cada palavra ainda. Coloque ambas perto do topo do head e suas páginas se comportarão bem.

Dois elementos <meta> pertencem ao head de praticamente toda página. Um elemento <meta> é um elemento void que carrega uma única informação de metadados em seus atributos.

html
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Minha primeira página</title>
</head>

O primeiro define a codificação de caracteres: o esquema que o navegador usa para transformar os bytes armazenados de volta em letras. UTF-8 é a codificação que cobre cada caractere que você provavelmente usará, do inglês ao emoji, e é o padrão moderno. Coloque esta linha primeiro no head.

O segundo é a tag viewport e controla como a página mapeia para uma tela móvel. width=device-width diz ao navegador para tratar a largura da página como a largura real do dispositivo e initial-scale=1.0 define o zoom inicial para 100%. Sem isso, telefones assumem que a página foi projetada para desktop e encolhem tudo para caber, então seu texto chega ilegível. Essas duas linhas são praticamente inegociáveis, é por isso que os modelos iniciais as incluem por padrão.

Dois elementos <meta> são efetivamente obrigatórios e as razões vêm de como o navegador processa o arquivo.

html
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Minha primeira página</title>
</head>

<meta charset> declara a codificação de caracteres, o mapeamento que o navegador usa para converter os bytes brutos do arquivo de volta em caracteres (as letras, pontuação e símbolos que você digitou). Isso deve ser a primeira coisa no head e, idealmente, dentro dos primeiros 1024 bytes do documento, por causa de um problema de sequência: o analisador deve decodificar os bytes em texto antes de poder ler qualquer um deles, incluindo a própria declaração de charset. Os navegadores resolvem o paradoxo começando com uma decodificação provisória, depois reanalisando se o charset declarado diferir. Coloque a declaração primeiro e não há nada para reanalisar. Use UTF-8; ele codifica todo o Unicode e é o padrão assumido da web moderna.

O atributo lang de volta em <html> também é uma preocupação de análise, embora semântica. Ele nomeia o idioma natural do documento para software que não pode deduzi-lo: um leitor de tela (software que lê a página em voz alta para pessoas que não conseguem vê-la) usa lang para escolher as regras de pronúncia e voz corretas e as ferramentas de tradução o usam para saber o idioma de origem. Um lang ausente ou errado dá aos usuários cegos uma página lida no sotaque errado ou pior, foneticamente sem sentido.

<meta name="viewport"> aborda um padrão de renderização móvel. Os primeiros smartphones, para lidar com páginas apenas para desktop, renderizavam em uma tela virtual em torno de 980 pixels de largura e depois a reduziam para caber na tela. width=device-width substitui isso, mapeando a largura do layout da página para a própria largura do dispositivo para que seu CSS responsivo tenha o tamanho de tela real com o qual trabalhar; initial-scale=1.0 define o zoom inicial para 1:1. Omita esta tag e um layout responsivo ainda computa contra a suposição de 980 pixels, então seu design móvel cuidadosamente construído renderiza na largura do desktop e é encolhido, anulando todo o exercício. A tag em si não faz nenhum estilo; ela fornece ao seu CSS as dimensões corretas para fazer estilo.

JunoCharset e viewport Duas linhas vão perto do topo do head em quase toda página: uma para que seu texto seja lido corretamente, acentos e emoji inclusos, e uma para que a página se encaixe em uma tela de telefone em vez de encolher. Copie ambas e não se preocupe demais com as palavras ainda. Elas silenciosamente resolvem problemas que você gastaria uma tarde caçando.
JunoCharset e viewport<meta charset="UTF-8"> define como bytes se tornam letras, então coloque-o primeiro no head; UTF-8 cobre tudo do inglês simples ao emoji. A tag viewport com width=device-width impede que telefones encolham uma página de tamanho desktop para nada. Pule a linha viewport e seu layout móvel chega minúsculo, que é o bug clássico "por que meu site se parece quebrado no meu telefone".
JunoCharset e viewportcharset vem primeiro porque o analisador deve decodificar bytes em texto antes de poder ler a declaração em si; coloque-o no topo e não há nada para reanalisar. lang em <html> é o que um leitor de tela usa para escolher pronúncia, então um valor errado lê a página no sotaque errado. Deixe de fora a tag viewport e seu CSS responsivo computa contra uma tela de 980px, então o design móvel que você construiu renderiza na largura do desktop e é encolhido.

Salvando e abrindo um arquivo .html

Uma página HTML é um arquivo de texto simples, então você pode fazer uma em qualquer editor de texto. A única coisa que importa é o nome: salve-o terminando em .html.

html
<!DOCTYPE html>
<html lang="pt-BR">
  <head>
    <meta charset="UTF-8" />
    <title>Minha primeira página</title>
  </head>
  <body>
    <h1>Olá</h1>
    <p>Esta é minha primeira página web.</p>
  </body>
</html>

Salve como index.html. Depois encontre o arquivo no seu computador e clique duas vezes nele: ele abre no seu navegador e mostra seu título e parágrafo. Não há servidor para iniciar e nada para instalar. A terminação .html é o sinal que diz ao seu computador para abri-lo como uma página web em vez de como um muro de código. Mude uma palavra, salve e atualize a aba do navegador para ver a atualização.

Um documento HTML é um arquivo de texto simples. Escreva-o em qualquer editor e salve-o com uma extensão .html. A extensão de arquivo, a parte do nome após o ponto, é o que diz ao sistema operacional e ao navegador para tratar o arquivo como HTML.

html
<!DOCTYPE html>
<html lang="pt-BR">
  <head>
    <meta charset="UTF-8" />
    <title>Minha primeira página</title>
  </head>
  <body>
    <h1>Olá</h1>
    <p>Esta é minha primeira página web.</p>
  </body>
</html>

Salve como index.html. O nome index é uma convenção que vale a pena adotar cedo: um servidor web servindo uma pasta procura index.html por padrão, então ele se torna a página inicial de qualquer site que você construir depois. Para vê-lo agora, clique duas vezes no arquivo ou arraste-o para uma janela do navegador. A barra de endereços mostrará algo como file:///Users/voce/index.html, o file:// dizendo que o navegador está lendo direto do disco em vez de pela rede. A edição é um loop: altere o arquivo, salve, atualize a aba.

Um documento HTML é texto simples e o navegador precisa apenas do arquivo em si para renderizá-lo. Salve-o com uma extensão .html para que o sistema operacional o associe ao navegador e o navegador o sirva como HTML em vez de como texto para exibir literalmente.

html
<!DOCTYPE html>
<html lang="pt-BR">
  <head>
    <meta charset="UTF-8" />
    <title>Minha primeira página</title>
  </head>
  <body>
    <h1>Olá</h1>
    <p>Esta é minha primeira página web.</p>
  </body>
</html>

Abrir um arquivo local usa o protocolo file://: o endereço se torna algo como file:///Users/voce/index.html e o navegador lê direto do disco. Isso é perfeito para uma única página, mas tem um limite. Sob file://, o navegador aplica uma política de mesma origem rigorosa (a regra de segurança que limita o que uma página pode carregar de outros locais) e trata cada arquivo local como uma origem separada, então coisas como solicitações fetch para carregar dados e importações de módulos ES são bloqueadas. Recursos que dependem de serem servidos por http:// não funcionarão a partir de um arquivo clicado duas vezes.

A correção, quando você chegar a esse ponto, é um servidor de desenvolvimento local: um pequeno programa que serve sua pasta por http://localhost para que o navegador a trate como um site real. Extensões de editor e comandos de uma linha fazem isso para você. Para uma página primeira simples, porém, file:// é exatamente correto: sem servidor, sem etapa de construção, sem dependências. Salve o arquivo, clique duas vezes e o navegador o renderiza. O nome index.html vale a pena manter, já que um servidor servindo um diretório retorna index.html por padrão, tornando-o o ponto de entrada quando você se mover para http://.

JunoSalvando e abrindo um arquivo .html Uma página web é um arquivo de texto cujo nome termina em .html. Salve o seu como index.html, clique duas vezes nele e o navegador o abre imediatamente, sem nenhuma configuração. Para ver uma alteração, salve o arquivo e atualize a aba. Esse loop salve-e-atualize é todo o ritmo de construir uma página.
JunoSalvando e abrindo um arquivo .html Salve o arquivo com uma extensão .html e o navegador sabe para renderizá-lo como uma página; clique duas vezes ou arraste-o para dentro e a barra de endereços mostra file://, significando que está lendo do disco. Nomeie-o index.html porque servidores o tratam como a página inicial padrão depois. Então é um loop: edite, salve, atualize.
JunoSalvando e abrindo um arquivo .html Clicar duas vezes abre o arquivo por file://, o que é bom para uma página mas impõe uma política de mesma origem rigorosa, então fetch e importações de módulos ES são bloqueados. Quando você bater nessa parede, execute um servidor dev local para que a página carregue por http://localhost e se comporte como um site real. Mantenha o nome index.html porque esse é o padrão que um servidor retorna para uma pasta.