Jak zrobić listę rozwijaną w HTML
Lista rozwijana to element <select> z elementem <option> dla każdego wyboru. value każdej opcji to to, co wysyła formularz; tekst między znacznikami to to, co widzi czytelnik. Wybierz jedną i naciśnij Submit:
Formularz wysyła language=js: name elementu select i value wybranej opcji. selected ustawia opcję domyślną; bez niego wybrana jest pierwsza opcja. Jeśli opcja nie ma value, zamiast niego wysyłany jest jej tekst.
Połącz etykietę z listą przez for i id (albo obejmując listę etykietą), żeby kliknięcie etykiety ustawiało fokus na liście, a czytniki ekranu ją ogłaszały.
Atrybuty select i option
| Element | Atrybut | Działanie |
|---|---|---|
<select> | name | Klucz, pod którym wysyłana jest wartość |
<select> | required | Trzeba wybrać prawdziwą opcję, a nie pusty placeholder na początku |
<select> | multiple | Można wybrać kilka opcji |
<select> | size | Ile wierszy jest widocznych (zamienia listę rozwijaną w pole listy) |
<select> | disabled | Cała lista jest wyłączona i nie jest wysyłana |
<option> | value | Co jest wysyłane po jej wybraniu |
<option> | selected | Wybrana po wczytaniu strony |
<option> | disabled | Widoczna, ale nie da się jej wybrać |
<optgroup> | label | Nagłówek grupy |
Opcja placeholder z required
Select zawsze ma wartość, więc bez placeholdera wysyłana jest pierwsza prawdziwa opcja, nawet jeśli czytelnik w ogóle nie dotknął listy. Pusta pierwsza opcja to naprawia, a required blokuje wysłanie, dopóki nie zostanie wybrana prawdziwa opcja:
Naciśnij Continue przed wyborem: przeglądarka odmówi i poprosi o wybranie pozycji. Placeholder ma value="", co required traktuje jako pustą wartość, oraz disabled, żeby nie dało się go wybrać ponownie po wybraniu kraju.
Grupowanie opcji przez optgroup
<optgroup label="..."> umieszcza nagłówek nad zestawem opcji. Nagłówka nie da się wybrać:
Grup nie można zagnieżdżać: lista ma jeden poziom nagłówków, nie więcej. disabled na <optgroup> wyłącza wszystkie jego opcje.
Wybór wielokrotny
multiple pozwala czytelnikowi wybrać kilka opcji i zamienia listę rozwijaną w pole listy. Przytrzymaj Ctrl (Cmd na Macu), żeby dodawać opcje pojedynczo, albo Shift, żeby zaznaczyć zakres:
Formularz wysyła skills=html i skills=css: tę samą nazwę raz dla każdej wybranej opcji. Wiele osób nie zna gestu Ctrl+kliknięcie, więc przy kilku opcjach łatwiejsza w użyciu jest grupa checkboxów.
Odczyt i ustawianie wartości w JavaScript
select.value odczytuje i ustawia wartość wybranej opcji, a zdarzenie change zachodzi, gdy czytelnik wybierze inną opcję. Częste zastosowanie to druga lista, której opcje zależą od pierwszej:
new Option(text, value) tworzy opcję. select.selectedIndex to pozycja wybranej opcji, a select.selectedOptions wymienia wybrane opcje; tak odczytuje się select z wyborem wielokrotnym.
Stylowanie select
Rozwiniętą listę rysują przeglądarka i system operacyjny, więc da się ją ostylować tylko w niewielkim stopniu. Zamknięte pole już tak: appearance: none usuwa natywną strzałkę, a obrazek tła wstawia w jej miejsce twoją własną:
Dodatkowy padding na końcu zostawia miejsce na strzałkę, żeby długi tekst opcji nie wchodził pod nią. font: inherit ma tu takie samo znaczenie jak przy przyciskach: select domyślnie używa małej czcionki formularzy przeglądarki. Opcje w rozwiniętej liście zachowują natywny wygląd. Chrome pozwala ostylować też rozwiniętą listę, gdy włączysz to przez appearance: base-select; przeglądarki bez tej obsługi pokazują natywną listę. Pełna kontrola wszędzie wymaga własnego widżetu zbudowanego z ARIA, co jest dużo trudniejsze do zrobienia dobrze, niż się wydaje.
select, przyciski radio czy datalist?
| Użyj | Kiedy |
|---|---|
<select> | Jeden wybór z długiej listy albo gdy brakuje miejsca |
| Przycisków radio | Jeden wybór z kilku opcji, które powinny być widoczne naraz (zobacz radio button w HTML) |
<input> z <datalist> | Podpowiedzi, ale dozwolona jest dowolna wpisana wartość |
Częste błędy
- Brak placeholdera przy wymaganym wyborze. Wysyłana jest pierwsza prawdziwa opcja, nawet jeśli czytelnik jej nie wybrał.
- Placeholder z prawdziwą wartością, na przykład
value="none".requiredtraktuje go jako poprawny wybór. Użyjvalue="". - Opcje bez
value, gdy tekst jest długi albo tłumaczony. Serwer dostaje widoczny tekst, który zmienia się razem z językiem. multipleprzy kilku opcjach. Checkboxy są łatwiejsze w użyciu.- Nasłuchiwanie
clickna opcjach. Użyjchangena<select>; zachodzi też przy zmianach z klawiatury. - Brak etykiety. Select z samym placeholderem po wybraniu opcji nie ma żadnej nazwy.
Najczęściej zadawane pytania
Jak zrobić listę rozwijaną w HTML?
Użyj <select> z jednym <option> na każdy wybór: <select name="color"><option value="red">Red</option><option value="blue">Blue</option></select>. Nadaj elementowi select name i <label>.
Jak ustawić domyślną opcję w select?
Dodaj selected do tej opcji: <option value="blue" selected>Blue</option>. Bez niego wybrana jest pierwsza opcja. W JavaScript ustaw select.value = 'blue'.
Jak dodać placeholder do select?
Zrób pierwszą opcję pustą i niemożliwą do wybrania: <option value="" disabled selected>Choose a country</option>. Dodaj required do <select>, żeby formularza nie dało się wysłać, dopóki nie zostanie wybrana prawdziwa opcja.
Jak odczytać wybraną wartość select w JavaScript?
select.value to wartość wybranej opcji. Jej widoczny tekst to select.selectedOptions[0].text, a zdarzenie change pozwala zareagować na zmianę wyboru. Przy select z wyborem wielokrotnym przejdź przez select.selectedOptions.
Czym różni się select od datalist?
<select> pozwala tylko na opcje z listy. <input> z <datalist> podpowiada opcje podczas pisania, ale przyjmuje dowolny tekst. Użyj select, gdy odpowiedź musi być jedną z twoich opcji.