:user-valid / :user-invalid
Baseline 2023 (Chrome 119, Safari 16.5, Firefox 88); `:user-invalid` amplamente disponível desde maio de 2026.
Chrome 119
Edge 119
Safari 16.5
Firefox 88
Como `:valid`/`:invalid`, mas só depois que o usuário interagiu com o campo, então um campo obrigatório não fica vermelho ao carregar a página. Entrega validação inline adequada com zero JS.
CSS
.fx-016 {
font-family: system-ui;
display: grid;
gap: 4px;
max-width: 320px
}
.fx-016 input {
padding: 8px;
border: 1px solid #bbb;
border-radius: 6px
}
.fx-016 input:user-valid {
border-color: #16a34a
}
.fx-016 input:user-invalid {
border-color: #dc2626
}
.fx-016-err {
display: none;
color: #dc2626
}
.fx-016:has(input:user-invalid) .fx-016-err {
display: block
}
.fx-016 :is(a,button,input,select,textarea):focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }
HTML
<form class="fx-016">
<label>Email <input type="email" required placeholder="[email protected]"></label>
<small class="fx-016-err">Enter a valid email address.</small>
</form>Fallback: Nenhum necessário; sem suporte o campo simplesmente não recebe cor.
Prompt
Estilize a validação de formulários com `:user-invalid` e `:user-valid` em vez de `:invalid`, para os erros aparecerem só depois que o usuário digitou ou saiu do campo. Mostre o texto de erro com `.field:has(input:user-invalid) .error { display:block }`. Mantenha os atributos nativos `required`, `type` e `pattern` como fonte da validação em vez de JS.