- Daftar HTML harus dipilih berdasarkan makna dan cara interaksinya, bukan tampilan visual, dan terbagi menjadi daftar kontrol, berurutan, deskripsi, menu, dan tidak berurutan
- Untuk pilihan tetap, yang tepat adalah
<select>/<option>, sedangkan untuk input berbasis saran gunakan <datalist>; pahami perbedaan perilaku multiple, optgroup, size, dan value
<ol> digunakan untuk prosedur, peristiwa, dan rangkaian yang maknanya berubah jika urutannya diubah, dan reversed hanya membalik penomoran tanpa mengubah urutan item yang sebenarnya
<dl> di HTML5 berkembang dari daftar definisi menjadi daftar deskripsi, dan cocok untuk pasangan kunci-nilai seperti istilah-nilai, metadata, dan debugging JSON
<menu> digunakan untuk daftar perintah seperti tombol alat; makna dan konten yang diizinkannya berbeda dari nav, sedangkan daftar umum lainnya ditangani oleh <ul>
Daftar kontrol: <select>/<option> dan <datalist>
- Di dalam form, kita juga bisa menyusun daftar yang berinteraksi dengan pengguna
-
Pilihan tetap adalah <select> dan <option>
- Jika pengguna harus hanya bisa memilih item yang ada di dalam daftar, gunakan
<select> dan <option>
- Contoh daftar bahasa menempatkan
<option> seperti Select a Language, English, French, Spanish, Portuguese di dalam <select name="languages">
<select> bawaan hanya memungkinkan tepat satu pilihan
- Untuk memungkinkan memilih beberapa item, tambahkan atribut
multiple
- Saat
multiple digunakan, tampilan daftar berubah dan semua opsi ditampilkan; pengguna dapat memilih beberapa item dengan Shift atau Cmd + klik
- Jika benar-benar memakai
select dan option, semantik bawaan browser akan menanganinya sehingga tidak perlu menambahkan aria-multiselectable secara manual ke elemen daftar dengan role="listbox"
-
Kelompokkan opsi terkait dengan <optgroup>
- Jika ingin mengelompokkan bahasa berdasarkan rumpun bahasa, kelompokkan daftar opsi dengan
<optgroup>
- Contohnya membuat
<optgroup> berlabel Germanic, Romance, Celtic, lalu menempatkan English, French, Spanish, Portuguese, Irish, Welsh di setiap grup
- Jika ingin membuat subkelompok tertentu tidak bisa dipilih, tambahkan atribut
disabled ke <optgroup> tersebut
- Dalam contoh, grup
Celtic diberi disabled sehingga kelompok yang berisi Irish, Welsh dinonaktifkan
-
Tingkatkan dengan fitur HTML bawaan
- Jika perlu pemisah visual antargrup, Anda dapat menggunakan
<hr> yang diizinkan di dalam <select>
- Atribut
size mengontrol jumlah item yang ditampilkan sekaligus, sehingga berguna untuk daftar yang panjang
- Jika
size dan optgroup dipakai bersama, label grup juga memakan ruang tampilan
- Contohnya,
<select name="languages" size="4" multiple> berisi grup Germanic, Romance, Celtic, Afroasiatic, pemisah <hr /> di antaranya, dan juga mencakup Hebrew, Arabic
Daftar saran: <datalist>
- Jika pengguna tidak harus memilih hanya dari daftar, tetapi daftar itu hanya menyarankan pilihan, gunakan
<datalist>
<datalist> dihubungkan dalam dua tahap
- Buat
<datalist> dan beri id
- Masukkan nilai
id itu ke atribut list pada <input> yang sesuai
- Contoh saran bahasa menempatkan opsi
English, French, Spanish, Portuguese, Irish, Welsh, Hebrew, Arabic di dalam <datalist id="languages">, lalu menghubungkannya ke field input dengan <input name="language" list="languages">
-
Perilaku <option value>
- Nilai default
<option> adalah teks yang dibungkusnya, dan jika ada atribut value, nilai itu akan menimpa default sementara teks berfungsi seperti label
- Di
<select>, ini biasanya bukan masalah besar karena pengguna hanya melihat teks, tetapi di <datalist> pengguna dapat melihat label, lalu setelah memilih justru value yang masuk ke kotak input sehingga bisa membingungkan
- Dalam contoh, jika memilih
<option value="cy">Welsh</option>, pengguna melihat Welsh tetapi input berisi cy
- Saat memakai
<datalist>, pahami bahwa nilai yang disisipkan adalah value, bukan label
-
Digabungkan dengan berbagai tipe input
<datalist> tidak hanya dipakai untuk opsi teks, tetapi juga bisa dipakai bersama tipe input lainnya
- Contoh pemilihan minggu menghubungkan
<datalist id="preferred-weeks"> ke <input type="week" name="week" id="camp-week" min="2026-W2" max="2026-W51" list="preferred-weeks" />
- Minggu yang disarankan adalah
2026-W22, 2026-W23, 2026-W24, 2026-W25
-
Digabungkan dengan <input type="range">
<datalist> tidak terbatas pada nilai string dan juga bekerja dengan angka, jadi bisa digabungkan dengan input range untuk membuat titik berlabel di atas rentang
- Contoh input persentase tip menghubungkan
<datalist id="recommended-tips"> ke <input type="range" name="tips" id="tips" min="0" max="50" step="1" list="recommended-tips" /> dan menaruh label 10%, 18%, 30%, 45%
- Pada browser keluarga Chrome,
@supports (x: attr(x type(percentage))) digunakan untuk membaca nilai label dari attr(), lalu mendeklarasikan nilainya sebagai persentase dengan type(), kemudian menempatkan opsi dengan position: absolute
- Pendekatan untuk Firefox menggunakan
@supports not (x: attr(x type(percentage))), dan nilainya ditampilkan dengan ::before
- Pendekatan ini tidak menjamin semua browser bekerja dengan cara yang sama atau tampil identik di layar
Daftar berurutan: <ol>
- Untuk kumpulan item yang harus dibaca dalam urutan tertentu, gunakan
<ol>
- Patokannya bukan apakah angka harus terlihat di samping item, melainkan apakah makna daftar berubah jika urutan item diubah
- Koleksi yang cocok untuk
<ol> meliputi algoritme, rangkaian peristiwa, item pada kontinum yang meningkat atau menurun, resep, dan daftar alfabetis
- Contoh resep banana bread mengekspresikan urutan memanaskan oven dan mengoles loyang, mencampur bahan, menuang adonan, memanggang 60 menit atau sampai tusuk gigi keluar bersih, lalu mendinginkannya di rak kawat sebagai
<ol>
- Daftar bahan yang disusun alfabetis juga mengikuti kontinum alfabet, jadi termasuk
<ol>, dengan urutan baking soda, bananas, brown sugar, butter, eggs, flour, salt
-
Nesting daftar berurutan dan tidak berurutan
- Daftar berurutan yang terstruktur dengan baik bisa dibaca untuk memahami urutan kejadian tanpa perlu melihat render browser
- Contoh resep menggunakan
<ol> untuk langkah tingkat atas; di dalam langkah tersebut, item yang urutannya tidak penting memakai <ul>, dan sublangkah yang urutannya penting kembali memakai <ol>
- Strukturnya mempertahankan urutan tingkat atas
Prepare, Mix, Pour, Bake, Cool, sementara item paralel di dalam Prepare dan Bake dinyatakan dengan <ul>, dan prosedur di dalam Mix dan Cool dinyatakan dengan <ol>
-
reversed
- Atribut
reversed mengubah urutan penomoran dari menaik menjadi menurun
- Atribut ini tidak mengubah urutan item daftar yang sebenarnya
- Ini bisa digunakan untuk daftar bahan dan jumlah dari
most to least, misalnya menampilkan dari yang paling banyak ke yang paling sedikit
- Contohnya,
<ol reversed> berisi eggs (2), flour (2 cups), bananas (2) (mashed), brown sugar (¾ cup), butter (½ cup), baking soda (1 teaspoon), salt (¼ teaspoon)
-
Membalik urutan item sebenarnya dengan JavaScript
- Jika ingin benar-benar membalik daftar, gunakan JavaScript untuk menyusun ulang anak
li dalam urutan terbalik lalu men-toggle atribut reversed
- Fungsi contoh membuat array dari hasil
list.querySelectorAll('li'), lalu .reverse(), setelah itu mengosongkannya dengan list.innerHTML = '' dan menambahkannya kembali dengan list.append(...children)
- Di akhir, fungsi memanggil
list.toggleAttribute('reversed')
- Event contoh menjalankan pembalikan saat klik ganda dengan
orderedList.addEventListener('dblclick', (evt) => { reverseList(orderedList) })
-
start
- Atribut
start dipakai untuk menjaga kesinambungan nomor saat satu daftar besar dipecah menjadi beberapa daftar berurutan
- Dalam contoh resep banana bread,
Prepare dibiarkan sebagai ul, sementara Mix memakai <ol start=2>, Pour memakai <ol start=5>, dan Cool memakai <ol start=7> agar nomor langkah tetap berlanjut di masing-masing daftar
- Meski di tengah ada bagian seperti
6: Bake yang dinyatakan sebagai daftar tidak berurutan, alur penomoran keseluruhan tetap dipertahankan dengan memulai ol untuk Cool dari start=7
Daftar deskripsi: <dl>, <dt>, <dd>
- Daftar deskripsi (description list) adalah jenis daftar yang mencegah kita memaksakan semua isi ke dalam
ol atau ul
-
Daftar definisi di HTML 4
- Di HTML 4, ini disebut daftar definisi (definition list), bukan
description list, dan ditujukan untuk penggunaan sempit berupa pemberian definisi
- Strukturnya terdiri dari
<dt> sebagai istilah yang didefinisikan dan <dd> sebagai isi definisinya; agar secara semantik tepat, istilah yang didefinisikan dibungkus dengan <dfn>
- Contohnya menghubungkan
throw, yeet ke definisi yang sama, serta memberi definisi terpisah untuk no cap, bet
<dl>
<dt><dfn>throw</dfn></dt>
<dt><dfn>yeet</dfn></dt>
<dd>Verb. To discard at a high velocity</dd>
<dt><dfn>no cap</dfn></dt>
<dd>Interjection. Expresses authenticity and truthfulness, sometimes surprise.</dd>
<dt><dfn>bet</dfn></dt>
<dd>Interjection. Expresses agreement and affirmation.</dd>
</dl>
-
Makna yang diperluas di HTML5
- Di HTML5, ini menjadi daftar deskripsi yang tidak lagi terbatas pada definisi, dan bisa dipakai ketika ada “sekumpulan istilah dan nilai”
- Di HTML5, pembungkus nonsemantik
<div> diizinkan untuk mengelompokkan <dt> dan <dd> yang saling terkait
- Contoh engine browser mengelompokkan
Chrome, Opera, Brave, Edge ke Blink-based browsers, dan Firefox, Tor, Librewolf ke Gecko-based browsers
<dl>
<div class="dl-item">
<dt>Chrome</dt>
<dt>Opera</dt>
<dt>Brave</dt>
<dt>Edge</dt>
<dd>Blink-based browsers</dd>
</div>
<div class="dl-item">
<dt>Firefox</dt>
<dt>Tor</dt>
<dt>Librewolf</dt>
<dd>Gecko-based browsers</dd>
</div>
</dl>
-
Metadata dan debugging JSON
- Jika isinya berupa rangkaian fakta dan label, penggunaan daftar deskripsi untuk menampilkan metadata sangat tepat
- Profil pengguna juga bisa dimasukkan ke dalam
<dl>; contohnya mengekspresikan First Frank, Last Taylor, Age 44, Job Writer, Handle Paceaux sebagai pasangan <dt> dan <dd>
- Daftar deskripsi juga bisa dipakai untuk debugging JSON di aplikasi halaman tunggal
- Contoh
DebugJson mengiterasi setiap key, value pada objek dengan Object.entries(obj), lalu merender kunci sebagai <dt><var>...</var></dt> dan nilai sebagai <dd><code>...</code></dd>
- Jika nilainya adalah objek dan bukan array,
DebugJson.createDl(value) dipanggil lagi untuk membuat <dl> bersarang; selain itu, value.toString() dimasukkan ke dalam <code>
const debugJson = new DebugJson({foo: 'bar', arr: ['a', 'b'], car: 1}, '.container')
debugJson.render();
- Daftar deskripsi sangat luas kecocokannya untuk kebutuhan pasangan kunci-nilai
Menu: <menu>
- Elemen
menu merepresentasikan daftar perintah dan lebih dekat ke web interaktif daripada sekadar render konten
menu cocok untuk daftar tombol yang berfungsi sebagai “alat”, seperti kontrol modifikasi teks pada rich text editor
- Contoh rich text editor menempatkan tombol
Strong, Emphasize, Strike sebagai li di dalam menu
<menu>
<li><button onclick="strong()">Strong</button></li>
<li><button onclick="emphasize()">Emphasize</button></li>
<li><button onclick="strike()">Strike</button></li>
</menu>
- Dalam spesifikasi HTML, ini termasuk penggunaan toolbar, dan di halaman interaktif, tempat yang memiliki tombol alat sangat mungkin cocok memakai
menu
- Contoh kontrol video juga masuk ke dalam
menu, dengan button yang memiliki commandfor="vid-123" serta command="--play", --mute, --fullscreen
<div class="player player--video">
<video source="whatever.mp4" id="vid-123"></video>
<menu>
<li><button commandfor="vid-123" command="--play">Play</button></li>
<li><button commandfor="vid-123" command="--mute">Mute</button></li>
<li><button commandfor="vid-123" command="--fullscreen">Fullscreen</button></li>
</menu>
</div>
Daftar tidak berurutan: <ul>
ul adalah daftar serbaguna yang menampung kebutuhan daftar lain yang tidak diselesaikan oleh jenis daftar lain dan nav
- Dalam HTML lama, perbedaan antara daftar berurutan dan tidak berurutan lebih dekat ke perbedaan visual seperti angka versus bullet
- Sekarang, karena mempertimbangkan aksesibilitas, screen reader, dan optimisasi mesin pencari, fokusnya harus pada apakah urutan punya makna, bukan pada tampilan visual
- Daftar anggota band tidak memiliki urutan yang penting, sehingga cocok memakai
ul
<h3>Beatles</h3>
<ul>
<li>John Lennon</li>
<li>Paul McCartney</li>
<li>Ringo Star</li>
<li>George Harrison</li>
</ul>
- Daftar nama band juga bisa dinyatakan sebagai daftar tidak berurutan
<ul>
<li>Beatles</li>
<li>Rolling Stones</li>
<li>Van Halen</li>
<li>Foo Fighters</li>
</ul>
1 komentar
Opini Hacker News
Bahkan hanya dengan mencoba contohnya saja, sepertinya datalist tidak bekerja dengan baik di Mobile Safari
Jika ada masalah kompatibilitas di pasar sebesar ini, bisa dibilang hampir tidak ada skenario yang benar-benar layak untuk memakainya
Ini seperti informasi tamparan realitas yang tidak diinginkan tapi memang perlu
Lebih dari 10 tahun lalu aku pernah mengerjakan proyek yang memakai widget saran input yang cukup agresif di UI, dan saat itu kami memakai plugin jQuery
Itu adalah bagian paling rumit di frontend, dan pada dasarnya menjadi alasan utama kami memakai jQuery di proyek tersebut
Saat membaca artikel ini, aku sempat berpikir akan sangat mudah mengimplementasikan ulang frontend itu dalam versi JS minimal yang ringan, tetapi kenyataannya tidak sesederhana itu kecuali aku bisa mengirimkan lingkunganku persis sama ke perangkat pengguna
Meski begitu, fitur-fitur yang kini masuk ke dalam spesifikasi HTML cukup mengesankan
Sejak membaca XHTML saat SMA, aku hampir tidak pernah mengikuti perubahan spesifikasinya, jadi sesekali rasanya perlu melihat apa saja yang berubah
Hanya saja, kompatibilitas browser tetap sama merepotkannya dulu maupun sekarang
Contoh datalist jelas bekerja di iPhone-ku
Ia terintegrasi ke area saran autocomplete di atas keyboard native iOS
Hanya saja tidak ada cara untuk menelusuri semua sarannya, dan sepertinya memang bukan itu cara penggunaan datalist yang dimaksud
Namun atribut
disabledpadagroupjelas tidak berfungsiDi Firefox untuk Android juga tidak berfungsi
Dulu sekali, saat bekerja di pekerjaan pertamaku, datalist di Firefox tidak berfungsi, dan karena itu Firefox dikeluarkan dari daftar browser yang didukung
Ini memang sudah lama jadi fitur bermasalah kalau ingin mendukung browser selain Chrome
Tidak bekerja dengan baik jika dipakai bersama GBoard di iOS
Contoh yang menambahkan atribut
disabledpadaoptgroupagar sebagian opsi tidak bisa dipilih tampaknya rusak di Mobile SafariDalam praktiknya, itu tidak benar-benar dinonaktifkan, dan item yang seharusnya nonaktif tetap bisa dipilih
Seharusnya ini berfungsi di Safari versi terbaru, jadi mungkin bukan benar-benar rusak melainkan berada dalam keadaan yang aneh
https://caniuse.com/mdn-html_elements_optgroup_disabled
Kemungkinan ini adalah bug Safari
Inilah alasan sulit memakai HTML native untuk hal-hal yang lebih dari dasar
Bahkan jika kamu sudah cukup banyak membaca dan cukup yakin untuk menulis artikel seperti ini, di komentar tetap akan muncul perilaku aneh, batasan, dan ketidakdukungan tergantung kombinasi browser dan perangkat
Tumpukan
divmungkin pilihan yang terlalu jauh ke sisi sebaliknya, tetapi setidaknya perilaku aneh dan batasannya cukup konsisten serta terlihat jelasKarena itu lebih konsisten dengan apa yang kutulis sendiri atau yang dihasilkan framework
Artikel yang menarik dan komprehensif
Sayangnya sekarang ada banyak developer yang langsung belajar React tanpa belajar HTML, dan dengan adanya LLM, besar kemungkinan mereka bahkan tidak akan belajar HTML sama sekali
Akibatnya, bahkan untuk hal-hal yang cukup dengan HTML sederhana pun mereka akan lebih dulu mencari komponen React
Menurutku itu tidak apa-apa
Saat pertama kali harus memakai XML, kami harus mempelajari spesifikasi XML dan menghasilkan output-nya sendiri
Itu masa ketika library serialisasi nyaris tidak ada
Setelah itu aku melihat generasi junior memakai XML, lalu kemudian JSON, sebagai format pertukaran tanpa benar-benar mempelajarinya secara mendalam, dan tidak terjadi masalah besar
AJAX juga berubah dari teknologi baru yang sedang panas menjadi istilah yang orang bahkan tidak tahu kepanjangannya, dan sekarang kebanyakan orang bahkan tidak lagi mengenali istilah itu sendiri
AJAX bukan mati, melainkan menjadi terlalu umum sampai tidak perlu lagi istilah khusus untuk menyebutnya
Masalahku adalah aku mempelajari HTML dengan sangat mendalam 20 tahun lalu, lalu setelah itu hanya mengetahui sedikit demi sedikit secara kebetulan bagaimana ia berubah dan membaik
CSS bahkan lebih parah lagi
Jujur saja, HTML itu merepotkan
Misalnya, pendekatan ala HTML untuk menata sebagian kontrol adalah memakai pseudo-class, tetapi kadang selektornya berbeda antar-browser
Jadi kita tetap harus mengetes per browser karena tidak tahu apakah itu benar-benar bekerja dengan semestinya
React bukan hanya lebih mudah, tapi juga lebih dapat dipercaya
Jika dibuat dengan React dan
div, kita bisa berharap hasilnya akan berfungsi sama di semua browserIsinya bagus, tapi jangan terlalu berharap pada
datalistDalam praktiknya, titik integrasinya terlalu sedikit untuk benar-benar berguna, jadi tidak cocok untuk penggunaan di luar prototipe kecil
Aku penasaran apakah linter HTML benar-benar membantu membedakan hal-hal seperti ini
Aku juga ingin tahu apakah ada linter yang bisa memaksakan pilihan tag semantik semacam ini
Aku kurang paham dengan gagasan memaksakan tag semantik
HTML pada dasarnya dibuat agar penulis bisa memakainya secara kreatif, jadi menurutku tidak masuk akal memaksakan tag tertentu dibanding tag lain
Aksesibilitas memang penting, tetapi batasannya saja sudah cukup banyak
Yang paling mendekati yang kutahu adalah https://github.com/kristoff-it/superhtml#diagnostics
SuperHTML memvalidasi bukan hanya sintaks, tetapi juga nesting elemen dan nilai atribut
Tidak ada language server lain yang mengimplementasikan seluruh spesifikasi HTML ke dalam kode validasi
Baru tahu hari ini
Aku penasaran kenapa lebih banyak framework tidak memanfaatkannya
Dari sudut pandang pengalaman pengguna, itu sama saja dengan daftar biasa
Kalau itu membantu memahami kodenya, silakan dipakai, tetapi dalam accessibility tree browser dan hampir semua aspek lainnya, itu tetap hanya daftar tak berurutan biasa
Untuk menyampaikan bahwa itu adalah daftar tindakan, kamu harus menambahkan atribut ARIA
Artikel itu menyebut
role=menu, tetapi itu saja tidak cukup, setiap item juga perlu peranmenuitemWAI Authoring Practices Guide menjelaskan peran dan ekspektasi interaksinya, tetapi jangan menyalin contoh kodenya mentah-mentah, dan khususnya jangan memakai peran ini untuk menu navigasi
https://www.w3.org/WAI/ARIA/apg/patterns/menubar/
Orang pintar tidak belajar HTML yang sulit, mereka cukup menyelesaikannya dengan beberapa
divHTML modern punya banyak fitur menarik
Aku suka bertanya kepada orang-orang menurut mereka suatu elemen melakukan apa
Aku sendiri juga awalnya tidak bisa menebak sama sekali
Setelah beberapa tahun menjadi frontend lead, ternyata masih banyak informasi berguna yang belum kuketahui
Sepertinya kami pasti akan mulai mencobanya di perusahaan juga
Andai saja para desainer menyukai tampilan default datalist
Tulisan blognya bagus sekali, tapi aku tidak bisa menemukan cara untuk melihat semua daftar tulisannya sekaligus
https://blog.frankmtaylor.com/archive tidak ada
https://blog.frankmtaylor.com/archives juga bukan
https://blog.frankmtaylor.com/posts tidak ada
https://blog.frankmtaylor.com/all juga tidak ada
https://blog.frankmtaylor.com/blog juga bukan
Karena ada juga orang yang punya lebih dari 10 ribu bookmark, akan sangat membantu jika ada satu halaman daftar yang hanya menampilkan semua tulisan yang pernah dibuat sampai sekarang tanpa penjelasan atau isi lengkap artikelnya
Maksudmu sitemap bukan?
Sebagian besar blog punya
sitemap.xmlyang mencantumkan semua tulisannyaDan aku juga penasaran kenapa kamu ingin menelusuri semua 235 artikelnya