Ce face :user-valid și :user-invalid (validarea formularelor)
Pseudo-clasele vechi :valid și :invalid se aplică imediat ce pagina se încarcă. Un câmp obligatoriu gol este deja „invalid”, așa că formularul apare plin de borduri roșii înainte ca utilizatorul să fi scris ceva.
:user-invalid și :user-valid folosesc aceleași reguli de validare HTML (required, type="email", minlength, pattern), dar se aplică doar după ce utilizatorul a modificat câmpul și l-a părăsit sau după ce a încercat să trimită formularul.
Pseudo-clase înrudite utile: :required și :optional (câmpuri obligatorii sau nu), :placeholder-shown (câmpul este gol și afișează textul de sugestie).
Valori uzuale
| Valoare | Descriere |
|---|---|
:user-invalid |
Câmpul este invalid și utilizatorul a interacționat deja cu el. |
:user-valid |
Câmpul este valid și utilizatorul a interacționat deja cu el. |
:invalid / :valid |
Starea de validare, aplicată imediat, inclusiv la încărcarea paginii. |
:required / :optional |
Câmpul are sau nu are atributul required. |
:placeholder-shown |
Câmpul este gol și afișează placeholder-ul. |
Exemple
Exemplul 1: Formular de înscriere fără erori premature
Bordura roșie și mesajul apar doar după ce utilizatorul a scris o adresă greșită și a trecut la alt câmp.
/* <input type="email" required> <span class="eroare">...</span> */
input {
border: 2px solid #cbd5e1;
border-radius: 6px;
padding: 8px;
}
input:user-invalid {
border-color: #dc2626;
}
input:user-valid {
border-color: #16a34a;
}
.eroare {
display: none;
color: #dc2626;
}
input:user-invalid + .eroare {
display: block;
}
Efect vizual în browser
La deschiderea paginii câmpul Email are bordură gri. Ana scrie „ana.popescu” și trece la câmpul următor: bordura devine roșie și apare mesajul „Introdu o adresă de email validă”. După ce corectează în „ana.popescu@gmail.com”, bordura devine verde și mesajul dispare.
Exemplul 2: Etichetă care se micșorează când câmpul nu mai este gol
:placeholder-shown permite un efect de etichetă flotantă fără JavaScript (câmpul are placeholder=” „).
.camp {
position: relative;
}
.camp label {
position: absolute;
left: 10px;
top: 10px;
color: #64748b;
transition: all 0.15s;
}
.camp input:not(:placeholder-shown) + label,
.camp input:focus + label {
top: -10px;
font-size: 0.75rem;
background: #ffffff;
padding: 0 4px;
}
Efect vizual în browser
Eticheta „Oraș” stă în interiorul câmpului gol. Când dai clic sau după ce ai scris „Cluj-Napoca”, eticheta urcă pe marginea de sus a câmpului și devine mai mică.
Greșeli frecvente
- Stilizarea cu :invalid în loc de :user-invalid; câmpurile obligatorii goale apar cu roșu încă de la încărcarea paginii și descurajează utilizatorul.
- Așteptarea ca :user-invalid să verifice reguli care nu există în HTML; pseudo-clasa folosește doar validarea nativă (required, type, min, max, pattern, minlength). Regulile personalizate cer JavaScript (setCustomValidity).
Comenzi înrudite
:focus-visible și :focus-within: Afișează conturul de focus doar când utilizatorul navighează cu tastatura (:focus-visible) și stilizează un părinte când un copil are focus.Pseudo-clase (:hover, :focus, :active, :nth-child): Stilizează un element în funcție de starea sa (interacțiune cu mouse-ul, tastatura) sau poziția structurală în listă.Selectori de atribut ([attr], ^=, $=, *=): Selectează elementele după prezența sau valoarea unui atribut HTML: tipul unui câmp, adresa unui link, atribute data-*.accent-color: Personalizează instantaneu culoarea controalelor native de formular (checkbox, radio, range, progress) dintr-o singură linie.