Validação de Formulários no HTML5: Atributos | Web Academy
Antes da chegada do HTML5, qualquer verificação de dados em páginas web exigia scripts pesados de JavaScript ou viagens lentas de ida e volta ao servidor para validar um simples campo obrigatório. Com a introdução do sistema nativo de Constraint Validation, o próprio navegador assume a responsabilidade de verificar os dados no momento da digitação e do envio, bloqueando dados inválidos instantaneamente com mensagens acessíveis e sem sobrecarregar a sua aplicação.
📑 Índice do Conteúdo
1. Como Funciona a Validação Nativa de Formulários
A validação client-side nativa funciona como uma catraca inteligente de transporte público: ela confere se o bilhete é compatível antes mesmo de girar a roleta. Quando o usuário clica em um botão de envio (<button type="submit">), o navegador avalia todos os controles associados ao <form>.
Se qualquer campo estiver em desacordo com as regras declaradas em seus atributos HTML:
- O evento de submissão (
submit) é automaticamente cancelado. - O primeiro campo inválido recebe o foco do teclado de forma imediata.
- Um balão explicativo (tooltip nativo) surge na tela orientando o usuário sobre o que precisa ser corrigido.
2. Catálogo de Atributos de Validação do HTML5
O HTML5 disponibiliza um conjunto de atributos declarativos que podem ser aplicados diretamente às tags <input>, <select> e <textarea>:
| Atributo | Inputs Compatíveis | Sintaxe de Exemplo | Finalidade & Comportamento |
|---|---|---|---|
required |
text, email, password, radio, checkbox, select, textarea | <input type="text" required> |
Impede que o formulário seja enviado se o campo estiver vazio ou sem opção selecionada. |
pattern |
text, search, url, tel, email, password | <input pattern="[0-9]{5}-[0-9]{3}"> |
Valida o valor contra uma Expressão Regular (Regex). Já é ancorado nativamente do início ao fim (^(regex)$). |
min / max |
number, range, date, time, datetime-local, month, week | <input type="number" min="1" max="10"> |
Define o limite numérico ou temporal mínimo e máximo aceito pelo campo. |
minlength / maxlength |
text, search, url, tel, email, password, textarea | <input minlength="8" maxlength="32"> |
Restringe a quantidade mínima e máxima de caracteres permitidos na digitação. |
step |
number, range, date, time, datetime-local | <input type="number" step="0.5"> |
Determina a granularidade ou intervalo de incremento válido (ex: decimais ou múltiplos). |
novalidate |
Elemento <form> |
<form novalidate> |
Atributo booleano que desativa a validação nativa do navegador para o formulário inteiro. |
formnovalidate |
Botões <button> ou <input type="submit"> |
<button formnovalidate>Rascunho</button> |
Permite submeter o formulário sem validação apenas ao clicar naquele botão específico. |
3. Implementação Prática: Cadastro Robusto com Validações Nativas
No exemplo abaixo, combinamos regras obrigatórias, expressões regulares brasileiras (CEP e CPF) e limites de idade, além de um botão especial para salvar rascunho sem validação:
<form action="/api/cadastro" method="POST" class="wzw-modern-form">
<!-- Campo de Nome Obrigatório com Tamanho Mínimo -->
<div class="form-group">
<label for="nome">Nome Completo *</label>
<input
type="text"
id="nome"
name="nome"
required
minlength="3"
maxlength="80"
placeholder="Ex: Ana Maria Silva"
autocomplete="name">
</div>
<!-- Campo de E-mail com Validação Sintática Nativa -->
<div class="form-group">
<label for="email">E-mail Profissional *</label>
<input
type="email"
id="email"
name="email"
required
placeholder="[email protected]"
autocomplete="email">
</div>
<!-- Campo de CPF com Regex no Atributo pattern -->
<div class="form-group">
<label for="cpf">CPF (somente números ou formatado) *</label>
<input
type="text"
id="cpf"
name="cpf"
required
pattern="\d{3}\.?\d{3}\.?\d{3}-?\d{2}"
title="Digite um CPF válido no formato 000.000.000-00 ou 11 números."
placeholder="000.000.000-00"
inputmode="numeric">
</div>
<!-- Campo de Data com Limites Históricos -->
<div class="form-group">
<label for="nascimento">Data de Nascimento *</label>
<input
type="date"
id="nascimento"
name="nascimento"
required
min="1920-01-01"
max="2008-01-01">
<small class="help-text">Idade mínima permitida: 18 anos.</small>
</div>
<!-- Ações do Formulário -->
<div class="form-actions">
<button type="submit" class="btn-primary">Finalizar Cadastro</button>
<button type="submit" name="acao" value="rascunho" formnovalidate class="btn-secondary">
Salvar Rascunho
</button>
</div>
</form>
4. Estilização Visual com Pseudo-classes CSS Modernas
O navegador informa o estado de validação de cada campo por meio de pseudo-classes CSS dinâmicas. Dominar a diferença entre :invalid e a nova especificação :user-invalid é essencial para não estressar os usuários com bordas vermelhas antes mesmo de digitarem:
/* Destaca campos obrigatórios com asterisco ou cor sutil */
input:required {
border-left: 3px solid #3b82f6;
}
/* ⚠️ ATENÇÃO: :invalid puro aplica erro imediatamente ao carregar a página */
/* Prefira a pseudo-classe moderna :user-invalid (suportada em todos os navegadores atuais) */
input:user-invalid,
select:user-invalid,
textarea:user-invalid {
border-color: #ef4444;
background-color: #fef2f2;
}
/* Quando o usuário preenche corretamente */
input:user-valid {
border-color: #10b981;
}
/* Exibe a mensagem de ajuda ou erro associada */
input:user-invalid + .error-message {
display: block;
color: #ef4444;
font-size: 0.85rem;
margin-top: 4px;
}
5. Conectando o HTML ao JavaScript: Constraint Validation API
Além do comportamento automático, o HTML5 expõe uma poderosa API no JavaScript para inspeção e controle fino das regras de negócio:
const campoCpf = document.querySelector('#cpf');
// 1. Verifica se o campo cumpre todas as regras declaradas
if (!campoCpf.checkValidity()) {
console.log('Motivo da falha:', campoCpf.validity);
}
// 2. Personaliza a mensagem de erro do navegador
campoCpf.addEventListener('input', () => {
if (campoCpf.validity.patternMismatch) {
campoCpf.setCustomValidity('Por favor, informe os 11 dígitos do seu CPF.');
} else {
// Obrigatório limpar a mensagem vazia para o campo voltar a ser válido!
campoCpf.setCustomValidity('');
}
});
// 3. Força a exibição do balão de erro nativo programaticamente
// campoCpf.reportValidity();
💡 Dica Pro: A Regra de Ouro da Segurança Web
A validação com atributos no HTML5 e JavaScript é voltada exclusivamente para a Experiência do Usuário (UX), garantindo feedback imediato e evitando envios acidentais.
Ela nunca substitui a validação no Back-End! Qualquer usuário pode desativar o JavaScript, alterar os atributos no DevTools do navegador ou disparar requisições maliciosas diretamente via cURL ou ferramentas de API. Sempre revalide e higienize todos os dados no servidor antes de gravar no banco de dados.
6. Ferramentas Relacionadas & Próximos Passos
Aprofunde seus conhecimentos práticos explorando as ferramentas gratuitas e tutoriais da nossa plataforma:
- Central do Desenvolvedor Web: Teste expressões regulares, valide códigos e gere hashes instantaneamente.
- Limpador e Formatador HTML: Mantenha a indentação e os atributos dos seus formulários 100% semânticos e organizados.
- Lição 18: Formulários HTML: Campos & Ações: Revise a anatomia de botões, métodos GET/POST e estruturas de envio.
- Lição 31: Novos Tipos de Input do HTML5: Conheça todas as variações de campos com teclados móveis dedicados.
7. Referências Técnicas & Especificações Oficiais
- WHATWG HTML Living Standard: Form Constraints & Validation API
- MDN Web Docs: Client-side Form Validation Guide
- W3C Web Accessibility Initiative (WAI): Accessible Form Notifications