Quando penso em Semântica HTML, diretamente já penso em HTML5.
O HTML5 (lançado a partir de 2009) é uma versão do HTML ainda não concluída, mas que já pode – e deve – ser utilizada por desenvolvedores e navegadores, antes de sua finalização.
Antes do lançamento dessa versão a semântica do HTML era quase nenhuma, quase nenhuma mesmo. Não tinha como, por exemplo, o robô do Google ou um ledor identificar e entender para que servia cada área do site, apenas através do código HTML.
Já com o HTML5, foram inseridas novas TAGS, onde a semântica ficou simples.
Veja a imagem com o comparativo do HTML anterior e do atual:
Perceba que antes era tudo div, então como o navegador iria conseguir diferenciar? Pois é, não ia (nem mesmo com aquelas IDs ali).
A semântica dos novos elementos
Header
<header> é o cabeçalho do site, ou de uma área dele. Nele normalmente são inseridos elementos h1 até h6 (títulos), elementos de navegação, a logo. O elemento <header> pode ser utilizado várias vezes dentro de uma mesma página.
<header> não pode ser filho de outro <header> ou <footer> ou ainda <address>.
Main
<main> demarca onde deve estar o conteúdo principal da página. Diferentemente do <header>, só pode existir uma <main> por página. Esta tag ainda não é compatível com todos os navegadores, mas mesmo assim já deve ser utilizada. Veja mais sobre a tag main aqui.
Footer
<footer> é rodapé do site, ou de uma área dele. Normalmente nele ficam informações de autoria, contato, Copyright e outros. Podem existir vários footers na mesma página.
Nav
<nav> marca uma seção do documento que agrupa links, sejam eles externos ou internos. A <nav> pode estar no cabeçalho, no rodapé ou em outras seções do documento, se relacionando assim com a navegação primária ou global. Mas atente-se, nem todo link deve estar dentro de nav, dentro desta tag devem estar conjuntos de links.
Section
Entre todos estes elementos estruturais que estou tratando aqui, <section> é o mais genérico. Dentro dele podemos colocar <header>, <article> e <footer>. Sua principal função é dividir o conteúdo em grandes blocos, seções.
Article
Representa um artigo, um conteúdo independente e bastante relevante, que pode ser um artigo, post ou bloco de texto. Também pode ser utilizado em widgets. O conteúdo de um <article> deve poder ser distribuído de forma independente do resto do site.
Aside
<aside> define um conteúdo que faz alguma referência ao conteúdo principal que está a sua volta. Normalmente em uma barra lateral exibindo informações contextuais, assuntos relacionados, publicidade, ou navegação secundária.
Na construção de sites institucionais, por exemplo, você vai usar principalmente <header>, <main>, <nav> e <footer>.
Lembrando que todas as tags que abordei foram implementadas no HTML5.
