Gerador de Formulário CSS
Os formulários são a parte mais tocada da maioria dos sites e a menos polida de muitos. Este gerador produz o CSS de um formulário completo estilizado: uma grade responsiva, pares de rótulo + entrada, áreas de texto, seleções e estados de foco visíveis, tudo com um estilo visual consistente. Defina a cor de destaque, o raio dos cantos e o espaçamento e copie a folha de estilos. O CSS mantém a semântica nativa do formulário, então a validação, o uso do teclado e os leitores de tela funcionam.
Como usar o gerador
-
1
Defina a cor de destaque
A cor de destaque define o anel de foco e a cor da borda de cada campo.
-
2
Escolha o raio dos cantos
O raio se aplica a entradas, áreas de texto e seleções para que todas tenham o mesmo formato.
-
3
Ajuste o espaçamento
O espaçamento controla o espaço vertical entre os campos da grade.
-
4
Copie o CSS
Uma folha de estilos completa que você pode colar e adaptar sem tocar no seu HTML.
O formulário básico
<form class="form">
<label class="field">
<span class="field-label">Email</span>
<input type="email" required>
<span class="field-error">Por favor, insira um email válido.</span>
</label>
<label class="field">
<span class="field-label">Senha</span>
<input type="password" minlength="8" required>
</label>
<button type="submit" class="button">Inscrever-se</button>
</form>
.field {
display: block;
margin-bottom: 1.25rem;
}
.field-label {
display: block;
font-weight: 500;
margin-bottom: .25rem;
}
.field input {
width: 100%;
padding: .5rem .75rem;
font: inherit;
border: 1px solid #d1d5db;
border-radius: 6px;
background: #fff;
transition: border-color 120ms, box-shadow 120ms;
}
.field input:focus-visible {
outline: none;
border-color: #2563eb;
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.15);
}
.field input:invalid:not(:placeholder-shown) {
border-color: #dc2626;
}
.field-error { display: none; color: #dc2626; font-size: .875rem; margin-top: .25rem; }
.field input:invalid:not(:placeholder-shown) ~ .field-error { display: block; }
Quatro estilos comuns
| Estilo | O que é | Melhor para |
|---|---|---|
| Contornado | Borda ao redor da entrada, fundo transparente | Formulários de desktop, layouts densos |
| Sublinhado | Apenas uma borda inferior | UI minimalista/editorial |
| Preenchido | Fundo cinza, sem borda | UI inspirada no Material Design |
| Rótulo flutuante | Rótulo fica dentro, anima para cima no foco/valor | Mobile-first, páginas de destino |
Rótulo flutuante é o mais bonito, mas requer marcação extra ou JavaScript para detectar estado vazio. Contornado é o mais universal.
Lista de verificação de acessibilidade
- Rótulo visível para cada entrada. Nunca use placeholder como o único rótulo, ele desaparece ao focar e falha no contraste.
<label for>ou<label>envolvente. Ambos são válidos; o envolvente é ligeiramente mais fácil.- Indicador de foco. Nunca
outline: nonesem uma substituição. Usuários de teclado precisam disso. - Mensagens de erro: vincule-as via
aria-describedbyna entrada. Não use apenas cor para marcar erros, inclua uma mensagem de texto ou ícone. - Campos obrigatórios: use o atributo
required. Adicione um marcador visual (asterisco) no rótulo para usuários com visão. - Tipos de entrada: use
type="email",type="tel",type="url",type="number". Teclados móveis se adaptam. - Atributos
autocomplete:autocomplete="email",autocomplete="current-password", etc. Economiza muito digitação dos usuários.
Estados de validação nativa
CSS tem pseudo-classes para validade de formulário:
:required/:optional:valid/:invalid:in-range/:out-of-range(para entradas numéricas com min/max):placeholder-shown(vazio, placeholder visível):user-invalid(inválido e o usuário interagiu, o correto para estilos de erro)
A pseudo-classe :user-invalid é a maneira mais limpa de mostrar erros apenas depois que o usuário fez algo, evitando bordas vermelhas pré-interação. Suporte foi adicionado em todos os principais em torno de 2023.
Estado desativado
.field input:disabled {
background: #f3f4f6;
color: #9ca3af;
cursor: not-allowed;
}
Entradas desativadas não são focáveis ou enviáveis. Se você quiser que sejam focáveis para leitores de tela, use readonly em vez disso, o formulário envia o valor, mas o usuário não pode editá-lo.
Perguntas frequentes
Não. Placeholders desaparecem assim que o usuário digita, então não podem servir como rótulos. Além disso, o texto do placeholder geralmente tem baixo contraste e falha no WCAG. Use um rótulo visível mais um placeholder opcional para dicas de formato.
Porque :invalid se aplica imediatamente a campos obrigatórios vazios. Use :user-invalid (consciente da interação) ou combine :invalid:not(:placeholder-shown) como uma solução alternativa em navegadores mais antigos.
Defina appearance: none, remova a seta padrão, adicione a sua via uma imagem de fundo ou um span envolvente com uma seta de pseudo-elemento. As listas de opções internas permanecem estilizadas pelo SO e não podem ser personalizadas com CSS.
Ambos. A validação HTML (required, type, pattern) captura casos simples sem JavaScript. O JavaScript lida com regras complexas (força de senha, dependências entre campos). Sempre valide no servidor também, a validação do lado do cliente é para UX, não segurança.
Ferramentas relacionadas
Referência da Tabela ASCII
Tabela ASCII completa de 0 a 127 com valores decimais, hexadecimais, octais e binários e notação de referência numérica HTML, incluindo NUL, LF e DEL.
Referência de Caracteres HTML
Lista pesquisável de entidades HTML, seus códigos nomeados e numéricos, e uma cópia com um clique para caracteres e símbolos especiais.
Referência de atalhos de teclado
Pesquise atalhos padrão documentados do VS Code, Chrome e Bash com GNU Readline no macOS, Windows e Linux.
Conversor de Binário para ASCII
Cole binário (bytes separados por espaço ou um longo fluxo de bits) e obtenha o texto ASCII que ele representa, decodificado 8 bits por vez.
Gerador de Cores Análogas
Crie uma paleta análoga de cinco cores a partir de qualquer cor base, com o trio clássico, dois tons externos e valores hex, RGB e HSL.
Conversor de ASCII para Hex
Converta texto ASCII em valores de byte hexadecimal. A saída usa dois dígitos hexadecimais por caractere, prontos para dumps de memória, rastreamentos de pacotes ou tabelas de firmware.