DEV Community

Cover image for Semântica no HTML por debaixo dos panos
Camilo Micheletto
Camilo Micheletto

Posted on • Edited on

Semântica no HTML por debaixo dos panos

Vocês sabem explicar o que é semântica no HTML?
Eu sinto que a minha vida inteira as pessoas resumiram a "Usar as tags de HTML de forma correta", "ajuda com acessibilidade e SEO", mas nada disso responde a pergunta completamente, responde?

 

Perguntei no Twitter como as pessoas explicariam o que é semântica e, salvo algumas pessoas que tinham uma experiência muito forte em acessibilidade, as respostas foram em sua maioria muito parecidas com o que eu ouvi por toda a minha carreira

Tweet dizendo: Entendo que HTML semântico seja usar tags que tragam em si um significado além do genérico da div, por exemplo. Pra quem? Aparentemente para robôs. Porque pra seres humanos acho pouco útil.


Semântica e significado

O que é significado pra gente? O que é significado pros robôs?

O que entendemos como significado em semântica é construído por 3 informações, que pra simplificar vou resumir em Name, Role e State.

Name

São os dados de nomenclatura do elemento - existem várias propriedades que aderem nome à elementos, como title, name, o conteúdo e as aria-properties, etc. Existe uma ordem pré-definida que calcula o nome de acordo com a prioridade delas.

Print do Accessibility Object Model de um button no Chrome, seu nome é

 

👤 Para humanos
Nome e descrição são parte do conteúdo verbalizado pelos leitores de tela. No caso do botão, diria:

"<role> Botão. <name> Cancelar pedido"

Botão escrito

🤖 Para máquinas
Sem o name, o elemento é considerado elemento não palpável (palpable content) e sua leitura pode ser ignorada.

 

Role

Descreve o comportamento esperado do elemento pro usuário, crawlers e tecnologias assistivas.
Esses elementos não dão só contexto, mas habilitam APIs que darão suporte pra todo tipo de usuário interagirem com as funcionalidades definidas de maneira equivalente.

A propriedade role="alert" não adere apenas "contexto", ela:

  • Cria uma live-region - um observer de mutações do elemento filho que emite um evento pro user-agent
  • Quando há um erro (ex: erro de formulário), a mensagem é injetada dinamicamente no elemento, emitindo um evento
  • O evento é capturado por tecnologias assistivas e anunciado ao usuário

Tudo isso sem javascript! (só a parte de injetar a mensagem dinamicamente). Essa role habilita uma API nativa que garante que o usuário tenha acesso ao erro de uma forma além da puramente visual (letrinhas vermelhas com esse símbolo ❌).

👤 Para humanos
Atribui a descrição semântica do elemento.

🤖 Para máquinas
Habilita parte da API necessária pra fornecer a experiência esperada.

 

State

Se refere à API do DOM e aos métodos, getters, setters e defaults do elemento.

O atributo disabled não muda apenas a aparência do elemento, mas altera uma série de informações no objeto do mesmo:

  • Elemento interativo se torna não navegável
  • Não clicável
  • Não emite eventos
  • Não é lido por tecnologias assistivas

E esse estado é propagado recursivamente pra todos os filhos desse elemento.

Usando um botão de exemplo - mesmo elemento, diferentes atributos, métodos e comportamentos mudando apenas o contexto:

Um botão e um botão dentro de um form. Ambos tem a mesma classe no DOM, mas estar dentro de um form faz com que esse botão seja do tipo submit e ganhe métodos de envio de conteúdo

 

Uma vez no contexto de formulário, métodos relacionados à envio de formulário e até a criação de um FormData são habilitados pela adição do type="submit"implícito.

Implementação dos métodos do button no Chrome, código retirado da engine Blink
Código extraído da engine de renderização do Chrome, a Blink (link para o código fonte).

 

👤 Para humanos
Disponibiliza o comportamento esperado pra diversos tipos de interação do usuário.

🤖 Para máquinas
Fornece diversas formas de interação pra diferentes user-agents e tecnologias assistivas.

 

E sobre SEO e conteúdo?
Semântica ajuda nisso também?

Tweet dizendo: Semântica quer dizer ajudar a máquina a interpretar o conteúdo, direcionar contexto, prioridade de informação, etc. HTML semântico seria se um robô pudesse ler sua página web sabendo onde tá o conteúdo, nesse conteúdo sobre o que está falando, o que não é importante... Etc


Semântica e conteúdo

Se a gente pensar em semântica como aderir sentido a algo, a ordem, prioridade e relação do conteúdo mudam drasticamente o significado do conteúdo.

A criação dessa hierarquia é papel de outra API - a de outlines.

Outlines criam seções de conteúdo, tal como índices de livros ou trabalhos de faculdade.

As numerações que definem a hierarquia do conteúdo dos headings (h1 a h6) funcionam de forma parecida aos numerais de índices que demonstram cabeçalhos, títulos e subtítulos.

Um sumário de um trabalho na norma ABNT com cabeçalhos, títulos e subtítulos

 

👤 Para humanos
Tamanho de fonte e hierarquia visual demonstram a ordem de leitura. Tecnologias assistivas formam índices usando a hierarquia dos headings.

🤖 Para máquinas
A hierarquia de outlines são também um mapa de hierarquia de conteúdo pra crawlers.

 

E não só headings tem esse papel, <section>, <aside>, <article> e <nav> são elementos do tipo sectioning content e criam um tipo de outline. Esses elementos podem receber <header> e <footer> cujo conteúdo vai estar associado à sua seção.

Entendem agora como isso tem super a ver com acessibilidade? Acessibilidade não é um favor, tampouco algo deslocado do HTML, CSS e JS, mas usar as APIs que essas tecnologias oferecem pra fornecer uma experiência equivalente a todos usuários.

Nas palavras da Sandyara Peres, especialista em acessibilidade, semântica é:

Semântica não é "usar as tags certas", pois tags por si só não cobrem todo tipo de componente e casos de uso que a web pode oferecer.

Semântica é uma coletânea de estados, atributos e métodos que viabilizam diversas formas de se acessar e entender conteúdo.


Pra fechar

Ninguém nunca me ensinou semântica dessa forma, sempre pareceu algo meramente moralista, como "escrever HTML certo", "usar as tags certas"

Talvez agora possamos ver como:

"Habilitar as ferramentas adequadas pra interpretação do conteúdo"

O HTML como linguagem de marcação, não deve ser interpretado como apenas um veículo pra implementação de design (CSS) e funcionalidade (JS).

Design e funcionalidade são apenas estrelas que orbitam ao redor do conteúdo. Valorizar o conteúdo é valorizar os usuários.

Top comments (2)

Collapse
 
jessilyneh profile image
Jessilyneh

como os seus artigos sao incriveis,sabe?

Collapse
 
lixeletto profile image
Camilo Micheletto

Olha, vindo de vc é um elogio muito especial, sou teu fã!!!