W świecie formularzy HTML tag <optgroup> to niepozorny, ale niezwykle przydatny element, który pozwala na logiczne grupowanie opcji wewnątrz elementu <select>. Dzięki niemu listy rozwijane stają się czytelniejsze, szczególnie gdy mamy dziesiątki lub setki opcji do wyboru. Zamiast chaotycznej listy użytkownik widzi pogrupowane kategorie z etykietami, co znacząco poprawia user experience (UX).
Dobrze zaprojektowane grupy opcji przyspieszają wybór i redukują błędy, zwłaszcza w długich formularzach.
Wyobraź sobie formularz wyboru preferencji użytkownika – bez <optgroup> opcje mieszałyby się w jedną kupę, a z nim? Eleganckie sekcje jak „Owoce”, „Warzywa” czy „Środowiska programistyczne”. W tym wpisie przejdziemy od podstaw po atrybuty, przykłady, stylizację CSS i integrację z JavaScriptem. Zaczynamy!
Czym jest <optgroup> i do czego służy?
Element <optgroup> reprezentuje grupę opcji wyboru składającą się z elementów <option> osadzonych w nadrzędnym <select>. Służy do tworzenia wizualnych nagłówków nad powiązanymi opcjami, co ułatwia nawigację w długich listach:
- główny cel – grupowanie pokrewnych opcji, np. produkty wg kategorii, kraje wg kontynentów czy technologie wg typów;
- kontekst użycia – tylko jako dziecko elementu
<select>; nie działa samodzielnie; - zawartość – wyłącznie elementy
<option>(inne węzły, jak tekst czy skrypty, nie są dozwolone); - renderowanie – przeglądarki wyświetlają etykietę grupy jako pogrubiony nagłówek, a opcje poniżej, jednak dokładny wygląd zależy od przeglądarki.
Dzięki <optgroup> długa lista przestaje być przytłaczająca i staje się zrozumiałą mapą kategorii.
Podstawowa składnia i wymagane atrybuty
Oto prosta składnia – otwierający tag z atrybutem label, lista <option> i zamykający tag:
<select name="preferencje">
<optgroup label="Rodzaj muzyki">
<option>techno</option>
<option>rock</option>
<option>pop</option>
</optgroup>
<optgroup label="Rodzaj filmu">
<option>komedia</option>
<option>dramat</option>
</optgroup>
</select>
Najważniejsze atrybuty elementu <optgroup> to:
label– wymagany tekst etykiety grupy, np.label="Owoce"; wyświetlany jako nagłówek;disabled– opcjonalnie wyłącza całą grupę (opcje stają się niewybieralne);- globalne atrybuty –
id,class,style,titleitp. do identyfikacji i stylizacji.
W HTML dozwolone jest pominięcie tagu zamykającego, jeśli po <optgroup> następuje kolejny <optgroup> lub koniec <select>.
Przykłady użycia w praktyce
1. Podstawowy formularz z grupami (muzyka i filmy)
Kompletny przykład z <fieldset> i <legend> dla lepszej semantyki i dostępności:
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Przykład optgroup</title>
</head>
<body>
<form>
<fieldset>
<legend>Rodzaje muzyki oraz filmu</legend>
<select name="preferencje" id="preferencje">
<optgroup label="Rodzaj muzyki">
<option>techno</option>
<option>rock</option>
<option>pop</option>
<option>trance</option>
</optgroup>
<optgroup label="Rodzaj filmu">
<option>komedia</option>
<option>dramat</option>
<option>horror</option>
<option>dokument</option>
</optgroup>
</select>
<button type="submit">Zatwierdź</button>
</fieldset>
</form>
</body>
</html>
Efekt – w przeglądarce zobaczysz dwie grupy z czytelnymi etykietami nagłówków.
2. Grupowanie owoców i warzyw z disabled
Poniżej przykład z wyłączoną grupą – przydatne, gdy część opcji jest tymczasowo niedostępna:
<select name="roslina">
<optgroup label="Owoce">
<option>ananas</option>
<option>malina</option>
<option>truskawka</option>
</optgroup>
<optgroup label="Owoce sezonowe" disabled>
<option>jabłko</option>
<option>gruszka</option>
</optgroup>
<optgroup label="Warzywa">
<option>ziemniak</option>
<option>marchew</option>
</optgroup>
</select>
Grupa oznaczona jako disabled będzie wyszarzona i niewybieralna.
3. Zaawansowany przykład – środowiska programistyczne
Przykład grupowania narzędzi kierowany do deweloperów:
<select name="ide">
<optgroup label="Środowiska programistyczne">
<option value="netbeans">NetBeans</option>
<option value="eclipse">Eclipse</option>
<option value="visualstudio">Visual Studio</option>
</optgroup>
<optgroup label="Edytory tekstu">
<option value="vscode">VS Code</option>
<option value="sublime">Sublime Text</option>
</optgroup>
</select>
4. Grupowanie miast wg krajów
Krótkie, klarowne pogrupowanie miast:
<select name="miasto">
<optgroup label="Polska">
<option>Warszawa</option>
<option>Kraków</option>
</optgroup>
<optgroup label="Niemcy">
<option>Berlin</option>
<option>Monachium</option>
</optgroup>
</select>
Stylizacja CSS dla <optgroup>
Możliwości stylizacji <optgroup> są ograniczone i zależne od przeglądarki. Zwykle etykieta grupy jest pogrubiona, ale nie zawsze zastosują się tło, marginesy czy zaokrąglenia. Poniżej propozycja bezpiecznych reguł (testuj w docelowych przeglądarkach):
optgroup {
font-weight: 700;
color: #222;
}
optgroup:disabled {
color: #888;
}
option {
padding: 2px 4px;
}
Uwaga – nie wszystkie przeglądarki wspierają pełne stylizowanie <optgroup> (np. tło lub padding mogą być ignorowane). Testuj w Chrome, Firefox, Safari i na urządzeniach mobilnych.
Integracja z JavaScript
<optgroup> świetnie współpracuje z JS. Oto przykład dynamicznego dodawania grup i ich wyłączania:
// Dodaj nową grupę dynamicznie
const select = document.querySelector('select');
const newGroup = document.createElement('optgroup');
newGroup.label = 'Nowa kategoria';
newGroup.innerHTML = '<option value="nowa">Nowa opcja</option>';
select.appendChild(newGroup);
// Wyłącz pierwszą grupę po kliknięciu przycisku
document.querySelector('button')?.addEventListener('click', () => {
const group = document.querySelector('optgroup');
if (group) group.disabled = true;
});
// Odczyt wybranej wartości (ignoruje grupy, zwraca <option value>)
console.log(select.value);
Najlepsza praktyka – zdarzenia przypinaj do <select> lub deleguj z poziomu opcji; nie wszystkie przeglądarki obsłużą zdarzenia bezpośrednio na <optgroup>.
Najczęstsze błędy i dobre praktyki
Przed wdrożeniem upewnij się, że unikasz typowych pułapek i trzymasz się sprawdzonych zasad:
- błąd – użycie
<optgroup>poza<select>; nie zadziała; - błąd – brak atrybutu
label; powoduje problemy z dostępnością i walidacją HTML; - dobra praktyka – łącz
<select>z<label for="..."/>oraz zadbaj o czytelnelabelw grupach; - dobra praktyka – ograniczaj liczbę opcji do ok. 10–15 na grupę, by zachować czytelność;
- kompatybilność – element jest wspierany w nowoczesnych przeglądarkach desktopowych i mobilnych; zawsze testuj stylizację;
- zdarzenia – nie zakładaj, że atrybuty jak
onclickzadziałają na<optgroup>; stosuj delegację zdarzeń do<select>.
Kiedy używać <optgroup>?
Poniżej proste wskazówki wyboru rozwiązania w zależności od kontekstu:
- tak – długie listy (powyżej ~20 opcji) oraz jasno zdefiniowane kategorie tematyczne;
- nie – krótkie listy (2–5 opcji), gdzie grupowanie tylko zaciemni przekaz;
- alternatywy –
<datalist>dla podpowiedzi w polach tekstowych lub biblioteki JS (np. Select2, Choices.js) dla wyszukiwania i tagowania.
Alternatywy i ich zastosowania – szybkie porównanie
Jeśli nie jesteś pewien, czy <optgroup> to najlepszy wybór, porównaj go z innymi rozwiązaniami:
| Rozwiązanie | Kiedy używać | Główna zaleta | Ograniczenie |
|---|---|---|---|
| <optgroup> | Gdy masz wiele opcji i naturalne kategorie | Czytelne grupowanie bez JS | Ograniczona stylizacja i brak wyszukiwania |
| <datalist> | Podpowiedzi podczas wpisywania tekstu | Szybkie znajdowanie pozycji przez wpisywanie | Brak grup i słaba kontrola stylu |
| Select2 / Choices.js | Gdy potrzebne jest wyszukiwanie, tagowanie, multiselect | Zaawansowane UX bez kompromisów | Wymaga JS i dodatkowych zasobów |