Select Lanjutan: optgroup dan multiple
Mengelompokkan opsi dengan optgroup dan memilih banyak dengan multiple + size: contoh nyata memilih kota per provinsi.
Masalahnya: Daftar Panjang yang Membingungkan
Dropdown berisi 30 kota dalam satu daftar datar itu melelahkan: pengguna scroll tanpa petunjuk, salah pilih, lalu mengulang. Solusinya bukan membelah jadi banyak dropdown, melainkan mengelompokkan opsi yang ada. Di sinilah optgroup berperan: memberi struktur pada daftar panjang tanpa menambah field baru.
optgroup: Kategori di Dalam Dropdown
<optgroup> membungkus beberapa <option> di bawah satu label kategori yang tidak bisa dipilih:
<label for="kota">Kota tujuan:</label>
<select id="kota" name="kota">
<optgroup label="Jawa Barat">
<option value="bdg">Bandung</option>
<option value="bgr">Bogor</option>
<option value="dpk">Depok</option>
</optgroup>
<optgroup label="Jawa Tengah">
<option value="smg">Semarang</option>
<option value="slo">Solo</option>
</optgroup>
<optgroup label="Jawa Timur">
<option value="sby">Surabaya</option>
<option value="mlg">Malang</option>
</optgroup>
</select>Label grup tampil sebagai judul abu-abu yang tidak bisa diklik, sehingga mata langsung tahu "oh, kota-kota ini satu provinsi". Atribut label pada optgroup itu wajib: tanpa itu grupnya tidak punya nama dan gunanya hilang.
Satu grup juga bisa dinonaktifkan sekaligus dengan disabled pada <optgroup>, misalnya kategori yang stoknya habis atau belum tersedia.
multiple + size: Pilih Lebih dari Satu
Secara default select hanya memilih satu opsi. Tambahkan multiple untuk mengizinkan banyak pilihan (dengan Ctrl+klik atau Cmd+klik), dan size untuk menentukan berapa opsi terlihat sekaligus tanpa membuka dropdown:
<label for="wisata">Kota wisata impian (boleh pilih banyak):</label><br />
<select id="wisata" name="wisata" multiple size="6">
<optgroup label="Jawa Barat">
<option value="bdg">Bandung</option>
<option value="bgr">Bogor</option>
</optgroup>
<optgroup label="Bali">
<option value="dps">Denpasar</option>
<option value="ubd">Ubud</option>
</optgroup>
<optgroup label="Sumatera Utara">
<option value="mdn">Medan</option>
<option value="prp">Parapat</option>
</optgroup>
</select>Tanpa size, select multiple hanya menampilkan satu baris dan pengguna harus tahu cara scroll di dalamnya: pengalaman yang buruk. size="6" mengubahnya menjadi kotak list yang jelas. Nilai yang terkirim adalah semua value yang dipilih, dan di sisi server biasanya dibaca sebagai array (konvensi umum: name="wisata[]").
Contoh Nyata: Pilih Kota per Provinsi
Gabungkan keduanya dalam form pemesanan travel yang realistis:
<form action="/pesan-travel" method="post">
<p>
<label for="asal">Kota keberangkatan:</label><br />
<select id="asal" name="kota_asal" required>
<option value="">-- Pilih kota --</option>
<optgroup label="Jawa Barat">
<option value="bdg">Bandung</option>
<option value="bgr">Bogor</option>
</optgroup>
<optgroup label="DKI Jakarta">
<option value="jkt-sel">Jakarta Selatan</option>
<option value="jkt-pst">Jakarta Pusat</option>
</optgroup>
</select>
</p>
<p>
<label for="tujuan">Kota tujuan (boleh lebih dari satu):</label><br />
<select id="tujuan" name="kota_tujuan" multiple size="5" required>
<optgroup label="Jawa Tengah">
<option value="smg">Semarang</option>
<option value="slo">Solo</option>
<option value="yog">Yogyakarta</option>
</optgroup>
<optgroup label="Jawa Timur">
<option value="sby">Surabaya</option>
<option value="mlg">Malang</option>
</optgroup>
</select>
</p>
<p><button type="submit">Cari Travel</button></p>
</form>Opsi pertama yang kosong (value="") berfungsi sebagai placeholder "pilih dulu", dan karena select-nya required, browser menolak submit selama opsi placeholder masih terpilih. Ini pola standar untuk dropdown wajib isi.
Kesalahan Umum: Salah vs Benar
<!-- SALAH: optgroup tanpa label, grupnya anonim -->
<select name="kota">
<optgroup>
<option>Bandung</option>
</optgroup>
</select>
<!-- SALAH: multiple tanpa size, cuma terlihat satu baris -->
<select name="hobi" multiple>
<option>Game</option>
<option>Musik</option>
<option>Masak</option>
</select>
<!-- BENAR: label jelas + size yang cukup -->
<select name="hobi" multiple size="4">
<optgroup label="Dalam ruangan">
<option value="game">Game</option>
<option value="musik">Musik</option>
</optgroup>
<optgroup label="Luar ruangan">
<option value="lari">Lari</option>
<option value="masak">Masak</option>
</optgroup>
</select>Kesalahan lain: menaruh <option> langsung sejajar <optgroup> secara acak sehingga sebagian opsi tidak terkelompokkan, dan lupa value sehingga yang terkirim adalah teks tampilan (rapuh kalau teksnya berubah). Untuk daftar pendek (2-4 opsi), pertimbangkan radio button: semua pilihan langsung terlihat tanpa perlu membuka apa-apa.
Catatan teknis: Tampilan
optgroup(label abu-abu yang tidak bisa dipilih) sangat bergantung pada browser dan sistem operasi, dan sulit di-style dengan CSS. Kalau butuh dropdown yang tampilannya dikustom total, biasanya orang membangunnya dengan JavaScript. Tapi untuk fungsionalitas murni,optgroupbawaan tetap pilihan paling ringan dan paling aksesibel.
Rangkuman
optgroup memberi struktur pada daftar panjang lewat kategori berlabel, multiple + size mengubah dropdown menjadi kotak pilihan ganda yang jelas. Kombinasi keduanya menangani kasus nyata seperti "pilih kota per provinsi" tanpa satu baris JavaScript pun.
export default function App(): JSX.Element { return <h1>Hello world</h1> }
Tantangan
Pilih Menu per Kategori
Buat form pemesanan katering: satu select 'Paket' dengan optgroup Makanan dan Minuman (minimal 3 opsi tiap grup), plus satu select multiple + size='5' untuk 'Tambahan' (boleh pilih banyak). Daftar yang dikelompokkan mengurangi salah pilih dan membuat form panjang tetap nyaman dipakai.
<!doctype html> <html lang="id"> <head> <meta charset="utf-8" /> <title>Katering</title> </head> <body> <h1>Pesan Katering</h1> <form action="/pesan" method="post"> <!-- select paket + select tambahan di sini --> </form> </body> </html>