Projeto acadêmico de um site institucional sobre reciclagem desenvolvido com foco em acessibilidade digital e WCAG 2.1.
O objetivo é demonstrar que acessibilidade pode ser incorporada desde a estrutura HTML, passando por CSS e JavaScript, até os testes manuais com teclado e tecnologias assistivas.
O Recicla Mais apresenta informações educativas sobre reciclagem de forma simples, responsiva e acessível.
O projeto contempla:
- estrutura HTML semântica;
- navegação por teclado;
- suporte a leitores de tela;
- foco visível;
- skip link;
- formulário acessível;
- mensagens de erro associadas aos campos;
- componentes interativos com estados acessíveis;
- responsividade;
- suporte a
prefers-reduced-motion; - contraste adequado entre texto e fundo;
- documentação de acessibilidade;
- fluxo de desenvolvimento baseado em GitFlow.
- HTML5
- CSS3
- JavaScript ES6+
- Git
- GitHub
- GitFlow
- NVDA para testes manuais
- Lighthouse para auditoria
O projeto não utiliza frameworks, permitindo demonstrar diretamente os recursos nativos da Web.
recicla-mais/
├── index.html
├── css/
│ ├── variables.css
│ ├── global.css
│ ├── components.css
│ └── responsive.css
├── js/
│ ├── navigation.js
│ ├── materials.js
│ ├── form.js
│ └── main.js
├── docs/
│ └── acessibilidade.html
└── README.md
navigation.js
- abertura e fechamento do menu mobile;
- atualização de
aria-expanded; - suporte à tecla
Escape; - fechamento após seleção de um link.
materials.js
- filtros dos materiais;
- atualização de
aria-pressed;
form.js
- validação dos campos;
aria-invalid;- mensagens de erro;
- foco no primeiro campo inválido;
- mensagem de sucesso acessível.
main.js
- inicialização geral do projeto.
A página utiliza elementos HTML de acordo com sua finalidade:
<header>
<nav>
<main>
<section>
<article>
<footer>Os títulos seguem uma hierarquia lógica:
h1
├── h2
│ ├── h3
│ └── h3
└── h2
├── h3
└── h3
As combinações de cores foram escolhidas para fornecer contraste adequado entre texto e fundo.
O contraste deve ser validado novamente com uma ferramenta automatizada ou de análise de contraste durante a entrega.
Estados importantes não dependem exclusivamente de cores. O filtro utiliza texto, borda, estado visual e o atributo:
aria-pressed="true"Elementos puramente decorativos utilizam:
aria-hidden="true"Quando imagens informativas forem adicionadas ao projeto, devem receber alt descritivo.
Todos os controles principais são elementos nativos:
<a>
<button>
<input>
<textarea>
<summary>Isso permite utilizar o teclado sem depender de eventos de mouse.
| Tecla | Função |
|---|---|
| Tab | Avança o foco |
| Shift + Tab | Retorna o foco |
| Enter | Ativa links e controles |
| Espaço | Ativa botões |
| Esc | Fecha o menu mobile |
O primeiro elemento da página é:
<a class="skip-link" href="#conteudo">
Pular para o conteúdo principal
</a>Isso permite que usuários de teclado e leitores de tela pulem diretamente para o conteúdo.
O projeto possui uma regra global:
:focus-visible {
outline: 3px solid #e0a900;
outline-offset: 3px;
}O projeto foi estruturado para uso com tecnologias assistivas.
Foram considerados:
- NVDA;
- navegação por landmarks;
- leitura de títulos;
- identificação de links;
- identificação de botões;
- formulários com labels;
- mensagens dinâmicas.
ARIA é utilizada apenas quando adiciona informação necessária ao componente.
Exemplos:
aria-label="Navegação principal"
aria-expanded="false"
aria-controls="menu-principal"
aria-pressed="true"
aria-live="polite"
aria-invalid="true"
aria-describedby="name-help name-error"O HTML semântico continua sendo a primeira escolha.
Todos os campos possuem label associado:
<label for="email">E-mail</label>
<input id="email" name="email" type="email">Os erros são relacionados ao campo através de:
aria-describedby="email-help email-error"Quando existe erro:
aria-invalid="true"Após uma tentativa de envio inválida, o foco é direcionado ao primeiro campo com erro.
A mensagem final utiliza:
aria-live="polite"para permitir que a tecnologia assistiva anuncie a alteração.
O filtro de materiais possui botões com estado acessível:
<button aria-pressed="true">Quando o filtro é alterado, uma região de anúncio informa o resultado:
<p id="filter-status" aria-live="polite"></p>Dessa forma, o usuário não precisa depender apenas da alteração visual da lista.
O projeto utiliza CSS responsivo com abordagem mobile-first.
Breakpoints principais:
520px
760px
900px
O layout adapta:
- navegação;
- cards;
- formulário;
- grids;
- botões;
- rodapé;
- espaçamentos.
Também existe suporte à preferência do usuário por redução de movimento:
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
}O desenvolvimento deve utilizar a seguinte estrutura:
main
│
└── develop
├── feature/header-navigation
├── feature/home
├── feature/materials
├── feature/accessibility
├── feature/contact-form
└── feature/responsive-layout
Contém versões estáveis do projeto.
Integra as funcionalidades que serão posteriormente preparadas para uma versão estável.
Utilizadas para desenvolver funcionalidades isoladas.
Criar a branch de desenvolvimento:
git checkout develop
git pull origin develop
git checkout -b feature/accessibilityImplementar as alterações:
git add .
git commit -m "feat: implement keyboard accessibility"Enviar para o GitHub:
git push -u origin feature/accessibilityDepois disso, abrir um Pull Request:
feature/accessibility
↓
develop
Quando uma versão estiver pronta:
develop
↓
release/1.0.0
↓
main
Após a publicação:
main
↓
tag v1.0.0
Foi adotado o padrão de Conventional Commits.
Exemplos:
feat: add recycling materials section
feat: implement accessible navigation
fix: correct form validation message
style: improve responsive layout
docs: add accessibility documentation
refactor: separate material filtering logic
test: validate keyboard navigation
Tipos utilizados:
feat- nova funcionalidadefix- correçãostyle- alterações visuaisdocs- documentaçãorefactor- refatoraçãotest- testes
- É possível chegar a todos os links usando Tab?
- É possível retornar usando Shift + Tab?
- O foco permanece sempre visível?
- Os botões funcionam com Enter/Espaço?
- O menu mobile funciona sem mouse?
- A tecla Esc fecha o menu?
- O usuário consegue pular para o conteúdo?
- Não existe armadilha de foco?
- O idioma
pt-BRé identificado? - O título da página é anunciado corretamente?
- Os landmarks são identificáveis?
- A hierarquia de títulos faz sentido?
- Os links possuem nomes compreensíveis?
- Os botões possuem nomes compreensíveis?
- Os campos possuem labels?
- Os erros são anunciados?
- As alterações do filtro são comunicadas?
- Contraste validado?
- Conteúdo não depende apenas de cor?
- Foco visível?
- Layout funciona em telas pequenas?
- Conteúdo continua utilizável com zoom?
- Texto permanece legível?
- Lighthouse
- NVDA
- Navegação somente com teclado
Não é necessário instalar dependências.
Basta abrir:
index.html
Para uma experiência mais próxima de um ambiente de desenvolvimento, pode ser utilizado o Live Server do VS Code.
O projeto considera principalmente:
| Critério | Aplicação |
|---|---|
| 1.1.1 Conteúdo não textual | tratamento de elementos decorativos e textos alternativos |
| 1.3.1 Informações e relações | HTML semântico e hierarquia |
| 1.3.2 Sequência significativa | ordem lógica do DOM |
| 1.4.3 Contraste | cores de texto e fundo |
| 1.4.10 Reflow | layout responsivo |
| 1.4.11 Contraste não textual | bordas e controles |
| 2.1.1 Teclado | interação sem mouse |
| 2.1.2 Sem bloqueio de teclado | ausência de armadilhas de foco |
| 2.4.1 Ignorar blocos | skip link |
| 2.4.3 Ordem do foco | ordem lógica no DOM |
| 2.4.7 Foco visível | :focus-visible |
| 2.4.11 Foco não obscurecido | cuidado com cabeçalho fixo |
| 3.1.1 Idioma da página | lang="pt-BR" |
| 3.3.1 Identificação de erros | mensagens nos campos |
| 3.3.2 Rótulos ou instruções | labels e textos de ajuda |
| 4.1.2 Nome, função e valor | controles nativos e ARIA |
O Recicla Mais demonstra uma abordagem de desenvolvimento que considera acessibilidade como parte da implementação e não apenas como uma etapa visual.
A combinação de HTML semântico, CSS responsivo, JavaScript progressivo, navegação por teclado, foco visível, mensagens acessíveis e testes com tecnologias assistivas permite construir uma experiência mais inclusiva.