Tag <option> jest fundamentalnym elementem HTML, który definiuje poszczególne pozycje w listach wyboru. Choć wygląda niepozornie, to od niego zależy logika wyboru wartości w formularzach i jakość doświadczenia użytkownika.
Czym jest tag <option>?
Tag <option> reprezentuje pojedynczą opcję do wyboru w menu. Występuje wyłącznie wewnątrz elementów <select> lub <datalist>. To podstawowy „klocek” każdej listy rozwijanej w formularzach HTML.
Składnia i podstawowe zastosowanie
Najprostsza postać opcji wygląda tak:
<option>Nazwa opcji</option>
Praktycznie zawsze warto dodać atrybut value, aby wysyłana na serwer wartość była jednoznaczna i stabilna:
<select name="wybor">
<option value="opcja1">Pierwsza opcja</option>
<option value="opcja2">Druga opcja</option>
<option value="opcja3">Trzecia opcja</option>
</select>
Tekst widoczny dla użytkownika może być opisowy, natomiast wartość value powinna pozostać krótka i przyjazna backendowi.
Atrybuty tagu <option>
Poniżej znajdziesz szybkie porównanie najczęściej używanych atrybutów:
| Atrybut | Działanie | Domyślnie | Wskazówka |
|---|---|---|---|
value |
Wartość wysyłana w formularzu | Treść elementu | Zawsze ustawiaj jawnie, aby nie zależeć od tekstu wyświetlanego. |
selected |
Ustawia opcję jako wstępnie wybraną | Brak | Używaj oszczędnie; preferuj czytelne domyślne placeholdery. |
disabled |
Wyłącza możliwość wyboru opcji | Aktywna | Stosuj, gdy opcja jest tymczasowo niedostępna (np. brak towaru). |
label |
Dostarcza etykietę używaną, gdy brak treści wewnątrz <option> |
Brak | Dodaj zawartość tekstową lub użyj label jako zwięzłej etykiety. |
value
Atrybut value określa wartość wysyłaną na serwer. Gdy go nie podasz, zostanie użyta treść opcji.
<select name="owoc">
<option value="jablko">Jabłko</option>
<option value="gruszka">Gruszka</option>
<option value="banan">Banan</option>
</select>
selected
selected ustawia wstępnie zaznaczoną opcję po załadowaniu strony.
<select name="owoc">
<option>Ananas</option>
<option>Banan</option>
<option>Kokos</option>
<option>Malina</option>
<option selected>Truskawka</option>
<option>Wiśnia</option>
</select>
Nie nadużywaj domyślnych wyborów – użytkownik powinien świadomie potwierdzić swój wybór.
disabled
disabled sprawia, że opcja staje się niedostępna do wskazania.
<select name="owoc">
<option>Ananas</option>
<option>Banan</option>
<option>Kokos</option>
<option disabled>Malina</option>
<option>Truskawka</option>
<option>Wiśnia</option>
</select>
Przykładowe wyróżnienie opcji wyłączonych w CSS:
option:disabled {
color: #888;
}
label
label pozwala ustawić etykietę opcji (wyświetlaną, gdy element nie ma treści).
<select name="muzyka">
<option label="techno" value="rodzaj-1"></option>
<option label="rock" value="rodzaj-2"></option>
<option label="pop" value="rodzaj-3"></option>
<option label="trance" value="rodzaj-4"></option>
</select>
Użycie z elementem <select>
Najczęściej <option> buduje klasyczne menu rozwijane wewnątrz <select>:
<label for="cars">Wybierz samochód:</label>
<select id="cars" name="cars">
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="opel">Opel</option>
<option value="audi">Audi</option>
</select>
Użycie z elementem <datalist>
<datalist> dostarcza podpowiedzi dla pola tekstowego – opcje stają się sugestiami wpisu:
<label for="browser">Wybierz przeglądarkę z listy:</label>
<input list="browsers" name="browser" id="browser">
<datalist id="browsers">
<option value="Edge">
<option value="Firefox">
<option value="Chrome">
<option value="Opera">
<option value="Safari">
</datalist>
Grupowanie opcji za pomocą <optgroup>
Przy dłuższych listach grupuj powiązane pozycje za pomocą <optgroup> dla lepszej nawigacji:
<label for="cars2">Wybierz samochód:</label>
<select id="cars2" name="cars2">
<optgroup label="Samochody Szwedzkie">
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
</optgroup>
<optgroup label="Samochody Niemieckie">
<option value="mercedes">Mercedes</option>
<option value="audi">Audi</option>
</optgroup>
</select>
Inny przykład grupowania treści:
<select name="multimedia">
<optgroup label="Rodzaj Muzyki">
<option>Techno</option>
<option>Rock</option>
<option>Pop</option>
<option>Trance</option>
</optgroup>
<optgroup label="Rodzaj Filmu">
<option>Akcja</option>
<option>Dramat</option>
<option>Komedia</option>
</optgroup>
</select>
Grupowanie znacząco ułatwia wybór – zwłaszcza na urządzeniach mobilnych.
Praktyczne przykłady
Formularz rejestracji
Przykładowy formularz z dwoma listami rozwijanymi:
<form action="submit.php" method="POST">
<fieldset>
<legend>Rejestracja Użytkownika</legend>
<label for="country">Kraj:</label>
<select id="country" name="country" required>
<option value="">-- Wybierz kraj --</option>
<option value="pl">Polska</option>
<option value="de">Niemcy</option>
<option value="uk">Wielka Brytania</option>
<option value="fr">Francja</option>
</select>
<label for="age">Przedział wiekowy:</label>
<select id="age" name="age">
<option value="18-25">18–25 lat</option>
<option value="26-35">26–35 lat</option>
<option value="36-50">36–50 lat</option>
<option value="50+">50+ lat</option>
</select>
<button type="submit">Zarejestruj się</button>
</fieldset>
</form>
Dynamiczne dodawanie opcji za pomocą JavaScript
Tak możesz programowo dodawać, wybierać i usuwać elementy <option>:
const select = document.getElementById('moja-lista');
// dodanie nowej opcji
const nowaOpcja = document.createElement('option');
nowaOpcja.value = 'nowa-wartosc';
nowaOpcja.textContent = 'Nowa opcja';
select.appendChild(nowaOpcja);
// ustawienie nowej opcji jako wybranej
nowaOpcja.selected = true;
// usunięcie opcji o indeksie 2
select.remove(2);
// wyczyszczenie wszystkich opcji
select.innerHTML = '';
Stylowanie opcji za pomocą CSS
Stylowanie <select>/<option> jest ograniczone przez przeglądarki, ale podstawowe modyfikacje są możliwe:
select {
padding: 10px;
font-size: 16px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #fff;
}
option {
padding: 10px;
}
option:disabled {
color: #999;
background-color: #f5f5f5;
}
option:checked {
background: linear-gradient(#1e90ff, #1e90ff);
background-color: #1e90ff;
color: #fff;
}
Pamiętaj: pełna kontrola wyglądu często wymaga niestandardowych komponentów (np. aria-combobox) lub bibliotek UI.
Atrybuty standardowe i zdarzenia
<option> obsługuje globalne atrybuty HTML5, m.in. id, class, title i style. Zdarzenia na samym <option> bywają obsługiwane niespójnie w różnych przeglądarkach, dlatego preferuj nasłuchiwanie zdarzenia change na elemencie <select>:
<select name="wybor" id="wybor">
<option value="1" class="standard">Opcja 1</option>
<option value="2" class="premium" title="To jest opcja premium">Opcja 2</option>
<option value="3" id="special-option">Opcja 3</option>
</select>
<script>
document.getElementById('wybor').addEventListener('change', (e) => {
alert('Wybrano wartość: ' + e.target.value);
});
</script>
Ważne zagadnienia związane z <option>
Domyślne opcje
Dobra praktyka to dodanie pustej, neutralnej opcji na początku listy, aby wymusić świadomy wybór:
<select name="owoc">
<option value="">-- Nie wybrano --</option>
<option>Ananas</option>
<option>Banan</option>
<option>Kokos</option>
</select>
Różnica między tekstem a wartością
Tekst widzi użytkownik, a wartość przetwarza system – rozdzielenie tych ról porządkuje logikę:
<select name="preferencja_klienta">
<option value="opt_001">Bardzo mi się podoba</option>
<option value="opt_002">Podoba mi się</option>
<option value="opt_003">Obojętnie</option>
<option value="opt_004">Nie podoba mi się</option>
<option value="opt_005">Bardzo mi się nie podoba</option>
</select>
Znaczniki zamykające
Znacznik otwierający <option> jest obowiązkowy, a zamykający </option> bywa opcjonalny, jeśli po nim następuje kolejna opcja, <optgroup> lub koniec elementu nadrzędnego:
<!-- Poprawnie, bez tagów zamykających -->
<select>
<option>Opcja 1
<option>Opcja 2
<option>Opcja 3
</select>
<!-- Również poprawnie, z tagami zamykającymi -->
<select>
<option>Opcja 1</option>
<option>Opcja 2</option>
<option>Opcja 3</option>
</select>
Dla czytelności i spójności zawsze domykaj </option>.
Dobre praktyki i dostępność
Aby listy wyboru działały niezawodnie i były wygodne w użyciu, trzymaj się poniższych wskazówek:
- Zawsze ustawiaj atrybut value – gwarantuje stabilne, przewidywalne wartości po stronie serwera;
- Dodawaj neutralny placeholder – pierwsza opcja typu „– Wybierz –” pomaga uniknąć przypadkowego wyboru;
- Grupuj długie listy przez optgroup – szybciej znajdziesz właściwą pozycję i poprawisz ergonomię na mobile;
- Nasłuchuj change na select – zdarzenia na option są niespójne, dlatego logikę osadzaj na elemencie nadrzędnym;
- Dbaj o dostępność – łącz select z etykietą label, stosuj zrozumiałe teksty i unikaj ukrywania istotnych informacji w title.