Kurs HTML

10.6. Pseudoklasy związane z formularzami

Strona główna > Kurs CSS > Rozdział 10: Zaawansowane Selektory CSS > Pseudoklasy związane z formularzami

Wprowadzenie: Stylizowanie dynamicznych stanów formularzy

Formularze HTML są interaktywne, a ich elementy (pola input, przyciski, listy wyboru) mogą znajdować się w różnych stanach (włączony, wyłączony, zaznaczony, wymagany, poprawny, niepoprawny itp.). CSS dostarcza specjalnych pseudoklas, które pozwalają **stylizować elementy formularzy w zależności od ich aktualnego stanu**.

Umożliwia to tworzenie bardziej intuicyjnych i responsywnych interfejsów użytkownika, dając wizualną informację zwrotną o stanie formularza i jego pól.

Stany włączenia/wyłączenia: :enabled i :disabled

  • :enabled: Wybiera elementy interfejsu użytkownika (głównie elementy formularzy jak input, button, select, textarea), które są **włączone** (domyślny stan, użytkownik może z nimi interagować).
  • :disabled: Wybiera elementy interfejsu użytkownika, które są **wyłączone** (mają ustawiony atrybut disabled). Użytkownik nie może z nimi interagować.
<input type="text" placeholder="Włączone pole">
<input type="text" placeholder="Wyłączone pole" disabled>
<button>Włączony przycisk</button>
<button disabled>Wyłączony przycisk</button>
/* Styl dla włączonych pól i przycisków */
input:enabled, button:enabled {
  border: 1px solid green;
}

/* Styl dla wyłączonych pól i przycisków */
input:disabled, button:disabled {
  border: 1px solid #ccc;
  background-color: #f5f5f5;
  color: #999;
  cursor: not-allowed; /* Zmień kursor na "niedozwolony" */
}

Stylizowanie stanu :disabled jest ważne, aby wizualnie zakomunikować użytkownikowi, że dany element jest nieaktywny.

Stan zaznaczenia: :checked

Pseudoklasa :checked wybiera elementy typu radio (input type="radio"), checkbox (input type="checkbox") lub opcje na liście wyboru (option wewnątrz select), które są aktualnie **zaznaczone** lub wybrane.

<input type="checkbox" id="cb1"> <label for="cb1">Opcja 1</label><br>
<input type="checkbox" id="cb2" checked> <label for="cb2">Opcja 2 (domyślnie zaznaczona)</label><br>

<input type="radio" name="rad" id="r1"> <label for="r1">Radio 1</label><br>
<input type="radio" name="rad" id="r2"> <label for="r2">Radio 2</label>
/* Styl dla zaznaczonych checkboxów i radio */
input:checked {
  box-shadow: 0 0 5px blue; /* Dodaj niebieską poświatę */
}

/* Można też stylizować etykietę powiązaną z zaznaczonym polem */
/* (używając selektora sąsiadującego + lub ogólnego ~) */
input:checked + label {
  color: blue;
  font-weight: bold;
}

Pseudoklasa :checked jest często wykorzystywana w połączeniu z selektorami rodzeństwa (+ lub ~) do tworzenia tzw. "CSS-only" interakcji, np. pokazywania/ukrywania elementów po zaznaczeniu checkboxa (tzw. "checkbox hack").

Stany walidacji: :required, :optional, :valid, :invalid

Te pseudoklasy odnoszą się do wbudowanych mechanizmów walidacji formularzy HTML5:

  • :required: Wybiera elementy formularza (input, select, textarea), które mają ustawiony atrybut required.
  • :optional: Wybiera elementy formularza, które **nie** mają atrybutu required (są opcjonalne).
  • :valid: Wybiera elementy formularza (głównie input), których aktualna wartość jest **zgodna** z ich regułami walidacji (np. poprawny email w input type="email", liczba w wymaganym zakresie w input type="number").
  • :invalid: Wybiera elementy formularza, których aktualna wartość jest **niezgodna** z ich regułami walidacji.
<label for="email">Email (wymagany):</label>
<input type="email" id="email" required>

<label for="phone">Telefon (opcjonalny):</label>
<input type="tel" id="phone">

<label for="age">Wiek (18-99):</label>
<input type="number" id="age" min="18" max="99" required>
/* Oznacz wizualnie pola wymagane */
input:required {
  border-left: 3px solid orange;
}

/* Oznacz wizualnie pola opcjonalne */
input:optional {
  border-left: 3px solid lightgray;
}

/* Styl dla pól z poprawną wartością (po interakcji użytkownika) */
input:valid {
  border-color: green;
}

/* Styl dla pól z niepoprawną wartością (po interakcji użytkownika) */
input:invalid {
  border-color: red;
  background-color: #ffeeee;
}

Przeglądarki zazwyczaj stosują style :valid/:invalid dopiero po interakcji użytkownika z polem (np. po wpisaniu czegoś i opuszczeniu pola), aby nie oznaczać pustych wymaganych pól jako niepoprawne od razu.

Stany zakresu: :in-range i :out-of-range

Te pseudoklasy dotyczą elementów input, które mają zdefiniowany zakres wartości za pomocą atrybutów min i max (np. input type="number", input type="range", input type="date").

  • :in-range: Wybiera element, którego aktualna wartość mieści się w dozwolonym zakresie (min <= wartość <= max).
  • :out-of-range: Wybiera element, którego aktualna wartość wykracza poza dozwolony zakres.
<label for="quantity">Ilość (1-10):</label>
<input type="number" id="quantity" min="1" max="10" value="5">
/* Styl dla wartości w zakresie */
input:in-range {
  outline: 2px solid lightgreen;
}

/* Styl dla wartości poza zakresem */
input:out-of-range {
  outline: 2px solid lightcoral;
  background-color: #ffeeee;
}

Zadania praktyczne

Zadanie 1 (z rozwiązaniem)

Stwórz pole checkbox i jego etykietę. Użyj pseudoklasy :checked i selektora +, aby przekreślić tekst etykiety, gdy checkbox jest zaznaczony.

Rozwiązanie:

HTML:

<input type="checkbox" id="task1-cb">
<label for="task1-cb">Zaznacz, aby przekreślić</label>

CSS:

#task1-cb:checked + label {
  text-decoration: line-through; /* Przekreślenie tekstu */
  color: gray;
}

Efekt: Po zaznaczeniu checkboxa, tekst etykiety zostanie przekreślony i zmieni kolor na szary.

Zadanie 2 (do samodzielnego wykonania)

Stwórz przycisk i nadaj mu atrybut disabled. Użyj pseudoklasy :disabled, aby nadać mu wyblakły wygląd (np. zmniejszając opacity) i zmienić kursor na not-allowed.

Zadanie 3 (do samodzielnego wykonania)

Stwórz pole input type="email" z atrybutem required. Użyj pseudoklas :valid i :invalid, aby dodać zielone obramowanie, gdy wpisany tekst jest poprawnym adresem email, i czerwone obramowanie, gdy jest niepoprawny (po interakcji).

FAQ - Najczęściej zadawane pytania

Czy mogę stylizować sam "ptaszek" w checkboxie lub kropkę w radio?

Bezpośrednie stylizowanie domyślnego wyglądu checkboxów i radio jest bardzo ograniczone i niespójne między przeglądarkami. Popularną techniką jest ukrycie domyślnego pola (opacity: 0; position: absolute;) i stworzenie własnego wyglądu za pomocą pseudoelementów (::before, ::after) na powiązanej etykiecie (label), a następnie zmiana stylu tych pseudoelementów w zależności od stanu :checked ukrytego pola.

Kiedy przeglądarka stosuje style :valid/:invalid?

Zazwyczaj przeglądarki nie stosują tych stylów od razu po załadowaniu strony, aby uniknąć oznaczania pustych wymaganych pól jako niepoprawne. Style te są aktywowane dynamicznie, gdy użytkownik wejdzie w interakcję z polem (np. zacznie pisać) lub gdy formularz zostanie przesłany.

Czy :required/:optional działają na wszystkich typach inputów?

Atrybut required i odpowiadające mu pseudoklasy działają na większości typów inputów, które mogą przyjmować wartość (text, email, password, number, date, checkbox, radio, file), a także na select i textarea. Nie mają zastosowania np. do input type="submit" czy input type="button".

Czy mogę łączyć pseudoklasy formularzy z innymi selektorami?

Tak, można je łączyć, np. input[type="text"]:required:invalid wybierze wymagane pole tekstowe, które aktualnie zawiera niepoprawną wartość. button:not(:disabled):hover wybierze przycisk, który nie jest wyłączony, gdy najedzie na niego kursor.