Ce face :focus-visible și :focus-within
:focus se aplică oricând un element primește focus, inclusiv la clic cu mouse-ul. De aceea mulți designeri ascund conturul cu outline: none, iar navigarea cu tastatura devine imposibilă.
:focus-visible se aplică doar când browserul consideră că utilizatorul are nevoie să vadă focusul: la navigarea cu tasta Tab, dar nu la un clic pe un buton. La câmpurile de text, conturul apare și la clic, pentru că urmează tastarea.
:focus-within se aplică unui element atunci când el sau oricare descendent are focus. Este util pentru a evidenția un întreg formular, un card sau un meniu derulant cât timp utilizatorul lucrează în interiorul lui.
Valori uzuale
| Valoare | Descriere |
|---|---|
:focus |
Elementul are focus, indiferent cum l-a primit. |
:focus-visible |
Elementul are focus și browserul decide că focusul trebuie arătat (de regulă la tastatură). |
:focus-within |
Elementul sau unul dintre descendenții lui are focus. |
Exemple
Exemplul 1: Contur vizibil doar la navigarea cu tastatura
Butoanele nu mai afișează un contur la clic, dar rămân accesibile pentru cei care folosesc tasta Tab.
.buton {
background: #16a34a;
color: #ffffff;
border: none;
padding: 10px 20px;
border-radius: 6px;
}
.buton:focus-visible {
outline: 3px solid #f59e0b;
outline-offset: 3px;
}
Efect vizual în browser
La clic cu mouse-ul pe butonul verde „Plătește 120 lei” nu apare niciun contur. Când ajungi la buton apăsând Tab, în jurul lui apare un contur portocaliu de 3px, la 3px distanță de margine.
Exemplul 2: Formular de căutare evidențiat cât timp scrii în el
:focus-within stilizează containerul, nu câmpul, ceea ce permite colorarea iconiței și a butonului deodată.
.cautare {
display: flex;
border: 2px solid #cbd5e1;
border-radius: 999px;
padding: 4px 12px;
transition: border-color 0.2s, box-shadow 0.2s;
}
.cautare:focus-within {
border-color: #2563eb;
box-shadow: 0 0 0 4px #dbeafe;
}
Efect vizual în browser
Bara de căutare „Caută un oraș (ex. Iași)” are bordură gri. Când dai clic în câmpul de text, întreaga bară primește bordură albastră și un halou albastru-deschis în jur; la ieșirea din câmp revine la gri.
Greșeli frecvente
- Scrierea :focus { outline: none; } fără un stil :focus-visible alternativ; utilizatorii care navighează cu tastatura nu mai văd unde se află.
- Așteptarea ca :focus-visible să nu apară niciodată la clic; la câmpurile de text (input, textarea) apare și la clic, pentru că browserul se așteaptă la tastare.
Comenzi înrudite
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ă.outline și outline-offset: Desenează un contur în jurul elementului, în afara chenarului, fără să ocupe spațiu și fără să miște elementele vecine.:user-valid și :user-invalid (validarea formularelor): Marchează câmpurile valide sau invalide abia după ce utilizatorul a interacționat cu ele, nu imediat la încărcarea paginii.accent-color: Personalizează instantaneu culoarea controalelor native de formular (checkbox, radio, range, progress) dintr-o singură linie.