Acessibilidade Web

Aprenda a criar sites que possam ser utilizados por diferentes pessoas, incluindo usuários que utilizam teclado, leitores de tela, ampliação de tela e outras tecnologias assistivas.


🔎 Ctrl + K

Introdução

A acessibilidade web é um conjunto de práticas, técnicas e princípios utilizados para tornar sites, sistemas e aplicações acessíveis ao maior número possível de pessoas. Quando desenvolvemos uma página web, não devemos pensar apenas em quem utiliza mouse, enxerga perfeitamente, escuta todos os conteúdos e consegue utilizar a interface da maneira tradicional. Existem usuários que navegam utilizando somente o teclado, pessoas que utilizam leitores de tela, pessoas com baixa visão, dificuldades motoras, dificuldades cognitivas, daltonismo e diferentes tipos de necessidades.

Definição

Acessibilidade Web é a prática de desenvolver páginas, sistemas e conteúdos digitais que possam ser utilizados por pessoas com diferentes capacidades e necessidades, inclusive por usuários que utilizam tecnologias assistivas.

Em outras palavras

Um site acessível não significa criar um site diferente. Significa criar um site corretamente para que diferentes pessoas consigam perceber, compreender, navegar e interagir com seu conteúdo.

1. O que é Acessibilidade Web?

Definição

Acessibilidade Web é a utilização de técnicas de desenvolvimento que permitem que pessoas com diferentes necessidades consigam utilizar uma página ou aplicação.

A acessibilidade não está relacionada somente às pessoas com deficiência.

Uma interface acessível também pode beneficiar pessoas idosas, pessoas com dificuldades temporárias, pessoas utilizando dispositivos móveis, usuários em ambientes com muito ruído e pessoas que possuem alguma limitação momentânea.

Exemplo

Imagine uma pessoa que quebrou o braço e não consegue utilizar o mouse adequadamente.

Se o site puder ser completamente utilizado pelo teclado, essa pessoa continuará conseguindo navegar.

Acessibilidade não é apenas visual

Um erro comum é pensar que acessibilidade significa apenas aumentar o tamanho da fonte ou melhorar as cores.

A acessibilidade envolve diferentes aspectos:

2. Por que a acessibilidade é importante?

A internet faz parte da educação, comunicação, trabalho, comércio, serviços públicos e entretenimento.

Portanto, impedir ou dificultar o acesso de uma pessoa significa criar uma barreira digital.

Exemplo

Imagine uma página de uma escola contendo apenas imagens com informações importantes.

Uma pessoa que utiliza leitor de tela poderá não conseguir compreender o conteúdo dessas imagens se elas não tiverem uma alternativa textual adequada.

Objetivo da acessibilidade

O objetivo é reduzir barreiras para que diferentes pessoas possam:

3. HTML semântico e acessibilidade

Definição

HTML semântico é a utilização de elementos HTML de acordo com o significado e a função que eles representam.

O HTML não serve apenas para colocar elementos visualmente na tela. Ele também fornece informações estruturais para navegadores e tecnologias assistivas.

Exemplo semântico

<header>
    Cabeçalho
</header>

<nav>
    Menu de navegação
</nav>

<main>
    Conteúdo principal
</main>

<section>
    Seção do conteúdo
</section>

<footer>
    Rodapé
</footer>

Comparação

Podemos criar praticamente qualquer layout utilizando elementos genéricos como <div>. Porém, isso pode dificultar a compreensão estrutural da página.

<div>
    <div>
        Menu
    </div>

    <div>
        Conteúdo
    </div>
</div>

Uma estrutura semântica fornece informações mais claras sobre a finalidade de cada região.

Dica

Antes de pensar no CSS, pense na estrutura HTML. Primeiro organize semanticamente o conteúdo e depois utilize CSS para definir a aparência.

4. O atributo alt nas imagens

Definição

O atributo alt fornece uma alternativa textual para uma imagem.

Ele é especialmente importante para usuários que não conseguem visualizar a imagem e utilizam tecnologias assistivas.

Sintaxe

<img src="foto.jpg" alt="Descrição da imagem">

Exemplo correto

<img src="computador.jpg" alt="Notebook sobre uma mesa utilizado para programação">

Exemplo incorreto

<img src="computador.jpg" alt="imagem">

A palavra "imagem" não ajuda o usuário a entender o que está representado.

Pense assim

Se você precisasse explicar a imagem para uma pessoa que não consegue enxergá-la, o que diria?

Essa explicação pode ajudar a construir um bom texto alternativo.

Imagem decorativa

Algumas imagens existem apenas para decoração e não acrescentam informação ao conteúdo.

<img src="linha-decorativa.png" alt="">
Atenção

Não é recomendado simplesmente repetir o texto que já está próximo da imagem no atributo alt.

5. Links acessíveis

Definição

Um link deve informar ao usuário qual ação ou destino será acessado.

Evite links pouco informativos

<a href="curso.html">
    Clique aqui
</a>

"Clique aqui" não explica para onde o link leva.

Melhor alternativa

<a href="curso.html">
    Acessar o curso de Desenvolvimento Web
</a>
Dica

O texto do link deve fazer sentido mesmo quando analisado fora do contexto da frase.

Abrir em nova aba

<a href="https://exemplo.com" target="_blank" rel="noopener noreferrer">
    Acessar site externo
</a>

Quando um link abre uma nova aba ou janela, é importante deixar essa mudança de contexto clara para o usuário.

6. Títulos e hierarquia de conteúdo

Os títulos HTML ajudam a organizar o conteúdo.

<h1>Acessibilidade Web</h1>

<h2>HTML acessível</h2>

<h3>Imagens</h3>

<h3>Links</h3>

<h2>CSS acessível</h2>
Atenção

Não utilize títulos apenas porque deseja deixar determinado texto maior ou menor.

O título representa uma estrutura de conteúdo. O tamanho visual deve ser controlado pelo CSS.

Exemplo incorreto

<h1>Texto pequeno</h1>

<h4>Texto importante</h4>

Exemplo correto

<h2>Formulários</h2>

<h3>Campo de nome</h3>

<h3>Campo de e-mail</h3>

7. Listas HTML

Listas devem ser utilizadas quando o conteúdo representa realmente uma lista.

Lista não ordenada

<ul>

    <li>HTML</li>
    <li>CSS</li>
    <li>JavaScript</li>

</ul>

Lista ordenada

<ol>

    <li>Criar o HTML</li>
    <li>Criar o CSS</li>
    <li>Adicionar JavaScript</li>

</ol>

O uso correto das listas fornece uma estrutura que pode ser interpretada pelas tecnologias assistivas.

8. Formulários acessíveis

Definição

Formulários acessíveis são formulários em que cada campo possui identificação clara, instruções adequadas, mensagens de erro compreensíveis e pode ser utilizado por diferentes formas de interação.

label

O elemento label identifica o campo ao qual está associado.

<label for="nome">
    Nome completo
</label>

<input type="text" id="nome" name="nome">

Associação entre label e input

O valor do for deve corresponder ao id do campo.

<label for="email">
    E-mail
</label>

<input type="email" id="email">
Por que isso é importante?

Ao utilizar corretamente o label, o usuário consegue compreender qual informação deve ser inserida naquele campo.

Placeholder não substitui label

<input type="text" placeholder="Digite seu nome">

O placeholder pode servir como exemplo ou orientação, mas não deve ser utilizado como substituto do label.

Exemplo recomendado

<label for="nome">
    Nome completo
</label>

<input type="text" id="nome" placeholder="Ex.: Marcelo da Silva">

9. Utilize tipos corretos de input

HTML possui diferentes tipos de campos. Utilize o tipo adequado para cada informação.

<input type="text">

<input type="email">

<input type="tel">

<input type="number">

<input type="date">

<input type="password">
Por que isso ajuda?

O tipo correto fornece informações adicionais ao navegador e pode melhorar a experiência de entrada de dados, principalmente em dispositivos móveis.

10. Botões acessíveis

Para ações da interface, utilize o elemento <button>.

Exemplo correto

<button type="button">
    Salvar
</button>

Comparação

Muitos desenvolvedores utilizam uma <div> com JavaScript para criar um botão.

<div onclick="salvar()">
    Salvar
</div>

Embora seja possível programar esse comportamento, o elemento não foi criado originalmente para representar uma ação de botão.

Prefira:

<button onclick="salvar()">
    Salvar
</button>
Dica

Quando existe um elemento HTML específico para determinada função, prefira utilizá-lo.

11. Navegação pelo teclado

Definição

A navegação por teclado permite utilizar uma interface sem depender do mouse.

Alguns comandos comuns:

Teste prático

Pegue seu site e tente utilizá-lo sem tocar no mouse.

Pressione somente a tecla TAB e observe se consegue chegar a todos os elementos interativos.

Atenção

Se você não consegue chegar a determinado botão, menu ou campo utilizando teclado, existe uma possível barreira de acessibilidade.

12. Indicador de foco

Definição

O foco indica visualmente qual elemento da página está atualmente selecionado durante a navegação pelo teclado.

CSS para foco

button:focus {
    outline: 3px solid #007acc;
}

Exemplo mais completo

a:focus,
button:focus,
input:focus,
select:focus,
textarea:focus {
    outline: 3px solid #007acc;
    outline-offset: 3px;
}
Atenção

Evite remover o indicador de foco sem fornecer outra forma clara de identificar o elemento selecionado.

/* Evite */

*:focus {
    outline: none;
}

13. ARIA

Definição

ARIA significa Accessible Rich Internet Applications. É um conjunto de atributos que pode fornecer informações adicionais sobre elementos e comportamentos de interfaces para tecnologias assistivas.

Alguns atributos ARIA muito conhecidos são:

aria-label

<button aria-label="Fechar menu">
    ✕
</button>

O texto visual do botão é apenas um símbolo. O atributo fornece uma descrição textual.

aria-expanded

<button aria-expanded="false" aria-controls="menu">
    Menu
</button>

<nav id="menu">
    ...
</nav>

Esse atributo pode informar o estado de um componente expansível.

Atenção

ARIA não deve ser utilizada para substituir HTML semântico quando existe um elemento HTML adequado.

14. aria-hidden

O atributo aria-hidden="true" pode indicar que determinado conteúdo deve ser ignorado por tecnologias assistivas.

Exemplo

<span aria-hidden="true">
    ★
</span>

Isso pode ser útil para elementos puramente decorativos quando a informação já está disponível de outra maneira.

Atenção

Não esconda com ARIA um conteúdo que seja necessário para compreender ou utilizar a página.

15. Contraste de cores

Definição

Contraste é a diferença visual entre elementos, principalmente entre texto e fundo.

Um texto com pouco contraste pode ser difícil de ler, principalmente para pessoas com baixa visão ou determinadas dificuldades de percepção visual.

Exemplo ruim

color: #cccccc;
background: #ffffff;

Exemplo melhor

color: #18212b;
background: #ffffff;
Dica

Não escolha cores apenas porque são bonitas. Verifique também se o texto pode ser facilmente percebido.

16. Não utilize somente cores para transmitir informação

Uma informação importante não deve depender exclusivamente da cor.

Exemplo problemático

Campo vermelho = erro
Campo verde = correto

Uma pessoa que possui dificuldade para diferenciar determinadas cores pode não compreender essa informação.

Melhor solução

❌ E-mail inválido.

Campo:
[________________]

Mensagem:
Digite um endereço de e-mail válido.
Regra importante

Combine cor com texto, ícone, padrão ou outra forma de identificação.

17. Tipografia acessível

A escolha da fonte e a organização do texto influenciam diretamente a leitura.

CSS

body {
    font-size: 16px;
    line-height: 1.6;
}

p {
    max-width: 70ch;
}
Dica

Uma boa hierarquia visual ajuda o usuário a localizar rapidamente a informação que procura.

18. Responsividade e acessibilidade

Um site responsivo adapta sua interface para diferentes tamanhos de tela.

@media (max-width: 768px) {

    .menu {
        display: block;
    }

    .conteudo {
        width: 100%;
    }

}

A responsividade contribui para acessibilidade porque permite que usuários utilizem diferentes dispositivos e configurações de tela.

19. Texto alternativo para conteúdos visuais

Imagens, gráficos e outros conteúdos visuais que possuem informação relevante precisam possuir uma maneira alternativa de transmitir essa informação.

Imagem informativa

<img src="grafico-vendas.png" alt="Gráfico mostrando crescimento das vendas entre janeiro e junho">

Imagem decorativa

<img src="decoracao.png" alt="">

20. Áudio e vídeo acessíveis

Conteúdos multimídia também precisam considerar pessoas que não conseguem ouvir ou visualizar determinadas informações.

Legendas

Vídeos podem utilizar legendas para apresentar informações faladas.

Exemplo

<video controls>

    <source src="aula.mp4" type="video/mp4">

    <track
        kind="subtitles"
        src="legendas.vtt"
        srclang="pt-BR"
        label="Português"
    >

</video>
Dica

Sempre pense em como o conteúdo será compreendido por uma pessoa que não consegue ouvir o áudio.

21. Tabelas acessíveis

Tabelas devem ser utilizadas para dados organizados em linhas e colunas.

<table>

    <caption>
        Notas dos alunos
    </caption>

    <thead>

        <tr>

            <th>
                Aluno
            </th>

            <th>
                Nota
            </th>

        </tr>

    </thead>

    <tbody>

        <tr>

            <td>
                João
            </td>

            <td>
                9,0
            </td>

        </tr>

    </tbody>

</table>
Elementos importantes

caption identifica o assunto da tabela.

th representa cabeçalhos.

td representa células de dados.

22. Regiões importantes da página

Elementos semânticos como header, nav, main, aside e footer ajudam a organizar a página.

<header>
    Cabeçalho
</header>

<nav>
    Navegação
</nav>

<main>

    <section>
        Conteúdo
    </section>

</main>

<aside>
    Conteúdo complementar
</aside>

<footer>
    Rodapé
</footer>

23. Link para pular diretamente ao conteúdo

Definição

Um "skip link" permite que o usuário pule elementos repetitivos, como menus, e vá diretamente para o conteúdo principal.

HTML

<a href="#conteudo">
    Pular para o conteúdo
</a>

<main id="conteudo">

    Conteúdo principal

</main>

Esse recurso é especialmente útil para pessoas que navegam utilizando teclado ou leitores de tela.

24. Defina o idioma da página

O atributo lang informa o idioma principal do documento.

<html lang="pt-BR">
Por que isso é importante?

Tecnologias assistivas podem utilizar essa informação para interpretar corretamente a pronúncia e outras características linguísticas do conteúdo.

25. Mudança de idioma dentro da página

Se uma parte do conteúdo estiver em outro idioma, também podemos informar isso.

<p>

    O termo
    <span lang="en">
        Machine Learning
    </span>
    significa aprendizado de máquina.

</p>

26. Uso correto do placeholder

O placeholder apresenta uma sugestão dentro do campo.

<label for="telefone">
    Telefone
</label>

<input type="tel" id="telefone" placeholder="(00) 00000-0000">
Não confunda

Placeholder é uma orientação complementar. Label identifica o campo.

27. Mensagens de erro acessíveis

Mensagens de erro precisam explicar claramente o problema e, quando possível, como corrigi-lo.

Mensagem ruim

Erro!

Mensagem melhor

O campo E-mail é obrigatório.
Digite um endereço de e-mail válido.

aria-describedby

<label for="email">
    E-mail
</label>

<input type="email" id="email" aria-describedby="erro-email">

<p id="erro-email">
    Digite um e-mail válido.
</p>

28. Campos obrigatórios

O atributo required indica que o preenchimento do campo é obrigatório.

<label for="nome">
    Nome
</label>

<input type="text" id="nome" required>

Também podemos comunicar essa informação ao usuário de maneira textual.

<label for="email">
    E-mail (obrigatório)
</label>

<input type="email" id="email" required>

29. Organizando grupos de campos

O elemento fieldset pode ser utilizado para agrupar campos relacionados.

<fieldset>

    <legend>
        Dados pessoais
    </legend>

    <label for="nome">
        Nome
    </label>

    <input type="text" id="nome">

    <label for="email">
        E-mail
    </label>

    <input type="email" id="email">

</fieldset>
Definição

legend fornece o título ou descrição do grupo de campos.

30. Checkbox acessível

<input type="checkbox" id="termos">

<label for="termos">
    Aceito os termos de uso
</label>

O label permite identificar claramente a finalidade da caixa de seleção.

31. Radio buttons acessíveis

<fieldset>

    <legend>
        Forma de pagamento
    </legend>

    <input type="radio" id="pix" name="pagamento" value="pix">

    <label for="pix">
        Pix
    </label>

    <input type="radio" id="cartao" name="pagamento" value="cartao">

    <label for="cartao">
        Cartão
    </label>

</fieldset>

32. Menus acessíveis

Um menu deve permitir que o usuário encontre e acesse suas opções utilizando diferentes formas de navegação.

<nav aria-label="Menu principal">

    <ul>

        <li>
            <a href="index.html">
                Início
            </a>
        </li>

        <li>
            <a href="cursos.html">
                Cursos
            </a>
        </li>

        <li>
            <a href="contato.html">
                Contato
            </a>
        </li>

    </ul>

</nav>

33. Identificando a página atual

O atributo aria-current pode indicar qual item representa o estado atual.

<nav>

    <a href="index.html" aria-current="page">
        Início
    </a>

    <a href="cursos.html">
        Cursos
    </a>

</nav>

34. Conteúdo visualmente oculto

Em determinadas situações, podemos precisar de um texto que seja importante para tecnologias assistivas, mas que não precise aparecer visualmente.

Isso deve ser feito com técnicas específicas de CSS, e não simplesmente utilizando display: none.

Atenção

display: none remove o elemento da renderização e normalmente também da árvore de acessibilidade.

35. display: none e acessibilidade

.menu {
    display: none;
}

Quando um conteúdo não deve estar disponível para o usuário naquele estado da interface, isso pode ser correto.

Porém, não utilize essa propriedade sem compreender as consequências para tecnologias assistivas.

36. JavaScript também precisa ser acessível

Uma interface pode possuir HTML correto e CSS adequado, mas ainda apresentar problemas quando utilizamos JavaScript para criar componentes interativos.

Exemplo

document
    .querySelector("#menu")
    .addEventListener("click", abrirMenu);

O problema aparece quando o componente só funciona utilizando mouse e não responde ao teclado.

Dica

Sempre teste componentes interativos com teclado.

37. Modais e diálogos

Modais precisam informar ao usuário que uma nova área de interação foi aberta.

<dialog id="modal">

    <h2>
        Confirmação
    </h2>

    <p>
        Deseja continuar?
    </p>

    <button>
        Sim
    </button>

    <button>
        Cancelar
    </button>

</dialog>

Também é importante pensar no foco, fechamento, teclado e retorno do foco para o elemento que abriu o diálogo.

38. Comparação: placeholder × label

Recurso Função
label Identifica o campo.
placeholder Apresenta uma sugestão ou exemplo.

39. HTML semântico × ARIA

HTML ARIA
Fornece estrutura e significado. Fornece informações adicionais.
Deve ser a primeira escolha. Deve ser utilizada quando necessário.
Exemplos: button, nav, main. Exemplos: aria-label, aria-expanded.
Regra prática

Primeiro procure uma solução semântica utilizando HTML. Depois utilize ARIA quando realmente precisar complementar a informação.

40. Acessibilidade utilizando CSS

O CSS também possui grande influência na acessibilidade.

Alguns pontos importantes:

Exemplo de foco

button:focus-visible {
    outline: 3px solid #007acc;
    outline-offset: 4px;
}

O pseudo-seletor :focus-visible pode ser utilizado para apresentar um indicador de foco de forma apropriada em situações de navegação.

41. Movimento e animações

Animações podem melhorar a experiência visual, mas algumas pessoas podem preferir reduzir movimentos.

@media (prefers-reduced-motion: reduce) {

    * {
        animation-duration: 0.01ms;
        animation-iteration-count: 1;
        transition-duration: 0.01ms;
        scroll-behavior: auto;
    }

}
Explicação

A mídia prefers-reduced-motion permite detectar uma preferência do sistema do usuário relacionada à redução de movimento.

42. Permita ampliação do conteúdo

Usuários podem aumentar o conteúdo utilizando recursos do navegador ou do sistema operacional.

Atenção

Evite desenvolver páginas que dependam de um tamanho fixo de tela ou impeçam desnecessariamente a ampliação do conteúdo.

43. Ordem de navegação

A ordem visual e a ordem de navegação devem fazer sentido.

O HTML deve ser organizado de maneira lógica para que a navegação pelo teclado acompanhe o fluxo do conteúdo.

tabindex

<button tabindex="0">
    Botão
</button>
Cuidado com tabindex

Evite criar ordens artificiais de tabulação utilizando valores positivos como tabindex="10".

44. Comparação: botão × link

Elemento Utilização
<a> Navegar para outro endereço ou local.
<button> Executar uma ação.

Link

<a href="contato.html">
    Contato
</a>

Botão

<button type="button">
    Abrir menu
</button>

45. Como testar a acessibilidade do seu site

Não basta escrever código acessível. É importante testar a interface.

Teste 1 — Somente teclado

  1. Desconecte ou não utilize o mouse.
  2. Pressione TAB.
  3. Observe o indicador de foco.
  4. Acesse todos os links.
  5. Acesse todos os botões.
  6. Preencha os formulários.

Teste 2 — Imagens

Verifique se imagens importantes possuem alternativas textuais adequadas.

Teste 3 — Estrutura

Verifique se a página possui títulos, seções, navegação e conteúdo organizados semanticamente.

Teste 4 — Contraste

Verifique se textos e elementos importantes possuem contraste suficiente.

Teste 5 — Zoom

Amplie a página e verifique se o conteúdo continua compreensível e utilizável.

46. Checklist de acessibilidade

47. Exemplo de página acessível

<!DOCTYPE html>

<html lang="pt-BR">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>
        Curso de Desenvolvimento Web
    </title>

</head>

<body>

    <a href="#conteudo">
        Pular para o conteúdo
    </a>

    <header>

        <h1>
            Curso de Desenvolvimento Web
        </h1>

    </header>

    <nav aria-label="Menu principal">

        <a href="index.html">
            Início
        </a>

        <a href="curso.html">
            Curso
        </a>

        <a href="contato.html">
            Contato
        </a>

    </nav>

    <main id="conteudo">

        <section>

            <h2>
                Acessibilidade Web
            </h2>

            <p>
                Aprenda a desenvolver sites acessíveis.
            </p>

            <img src="computador.jpg" alt="Pessoa utilizando um computador para programar">

        </section>

        <section>

            <h2>
                Inscrição
            </h2>

            <form>

                <label for="nome">
                    Nome
                </label>

                <input type="text" id="nome" required>

                <label for="email">
                    E-mail
                </label>

                <input type="email" id="email" required>

                <button type="submit">
                    Enviar inscrição
                </button>

            </form>

        </section>

    </main>

    <footer>

        <p>
            © 2026 Curso de Desenvolvimento Web
        </p>

    </footer>

</body>

</html>
O que esse exemplo demonstra?
  • Documento com idioma definido.
  • Estrutura semântica.
  • Link para pular ao conteúdo.
  • Navegação identificada.
  • Títulos organizados.
  • Imagem com texto alternativo.
  • Formulários com labels.
  • Campos obrigatórios.
  • Botão semântico.

48. Resumo da aula

Acessibilidade Web não é um único atributo ou uma única técnica.

Ela é resultado de várias decisões tomadas durante o desenvolvimento.

Conceito principal

Acessibilidade significa criar uma experiência digital que não dependa de uma única forma de perceber ou interagir com o conteúdo.

49. Atividade prática

Agora você irá analisar uma página web e identificar possíveis problemas de acessibilidade.

Etapa 1

Escolha uma página de um projeto que você já desenvolveu.

Etapa 2

Utilize somente o teclado para navegar.

Etapa 3

Verifique:

Etapa 4

Corrija os problemas encontrados.

Etapa 5

Apresente quais alterações foram realizadas e explique por que cada alteração melhora a acessibilidade.

Desafio

Tente transformar uma página criada anteriormente por você em uma página mais acessível sem alterar sua identidade visual.