PorównaniePorównania

:focus vs :focus-visible

focus pasuje do każdego elementu z fokusem, także po kliknięciu myszą. focus-visible pokazuje wskaźnik tylko tam, gdzie przeglądarka uzna go za potrzebny.

Na tej stronie

Porównanie w tabeli

#
  • Pasuje po kliknięciu myszą

    :focus
    Tak, w większości przeglądarek, nawet na przyciskach
    :focus-visible
    Zwykle nie, poza polami tekstowymi
  • Pasuje po nawigacji Tab

  • Kto decyduje, czy pokazać wskaźnik

    :focus
    Zawsze pasuje, gdy element ma fokus
    :focus-visible
    Przeglądarka ocenia, czy wskaźnik jest potrzebny
  • Pole tekstowe po kliknięciu myszą

    :focus
    Pasuje
    :focus-visible
    Też pasuje, bo zaraz zaczniesz pisać
  • Wsparcie przeglądarek

    :focus
    Od dawna, widely
    :focus-visible
    Nowsza, ale też widely
  • Rekomendacja do stylu fokusu

    :focus
    Tylko gdy chcesz reagować na fokus niezależnie od urządzenia
    :focus-visible
    Tak, to współczesny standard widocznego fokusu

Przykład

#
CSS
button:focus-visible {
  outline: 3px solid #f59e0b;
  outline-offset: 3px;
}
Podgląd

Kliknij przycisk myszą: obwódki nie będzie. Teraz naciśnij Tab: pojawi się, bo nawigujesz klawiaturą.

Definicja i zastosowanie

#

Pseudoklasa :focus pasuje do elementu z fokusem niezależnie od tego, jak go dostał: po kliknięciu myszą, stuknięciu na telefonie czy po przejściu klawiszem Tab. W większości przeglądarek kliknięcie przycisku też daje mu fokus, dlatego obwódka pojawiająca się po zwykłym kliknięciu bywa zaskakująca.

:focus-visible jest mądrzejsza. Przeglądarka sama ocenia, czy wskaźnik fokusu jest w danej chwili potrzebny. Po nawigacji klawiszem Tab pasuje zawsze, a po kliknięciu myszą na przycisku czy linku zwykle nie, bo użytkownik widzi, co kliknął. Pola tekstowe są wyjątkiem: pasują do obu, bo po kliknięciu i tak zaraz zaczniesz w nich pisać.

W praktyce styl fokusu warto pisać w :focus-visible, a nie w :focus. Dzięki temu osoby klikające myszą nie widzą obwódki na każdym kliknięciu, a osoby nawigujące klawiaturą wciąż dostają wyraźny wskaźnik. Nigdy nie usuwaj obwódki przez :focus { outline: none } bez takiego zamiennika.

Składnia

#
Składnia
selektor:focus { właściwość: wartość; }
selektor:focus-visible { właściwość: wartość; }

Więcej przykładów

#
:focus pokazuje obwódkę nawet po kliknięciu
CSS
button:focus {
  outline: 3px solid #f59e0b;
  outline-offset: 3px;
}
Podgląd

Dla porównania: zwykłe :focus w większości przeglądarek pokazuje obwódkę także po kliknięciu myszą.

Pole tekstowe pasuje do obu pseudoklas
CSS
input:focus-visible {
  outline: 3px solid #a78bfa;
}
Podgląd

Pole tekstowe pasuje do :focus-visible nawet po kliknięciu myszą, bo zaraz będziesz w nim pisać.

Dobre praktyki

#
  • Nigdy nie pisz :focus { outline: none } bez zamiennika w :focus-visible, bo odbierasz orientację osobom nawigującym klawiaturą.
  • Styluj wskaźnik fokusu w :focus-visible, żeby nie pojawiał się na każdym kliknięciu myszą.
  • Efekty najechania łącz z fokusem klawiatury: .btn:hover, .btn:focus-visible { ... }.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.