⚡ Curso de HTML • Web-ZoneWare

Validação de Formulários no HTML5: Atributos | Web Academy

Lição 33 de 50

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.

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:

HTML5 62 linhas
<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>
🧪 Quer testar a validação nativa e regex agora?
⚡ Abrir no Playground IDE →

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:

CSS3 26 linhas
/* 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:

JavaScript 19 linhas
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:

7. Referências Técnicas & Especificações Oficiais


Rolar para cima