HTML Forms Inputs Labels Validation Accessibility
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama HTML untuk melanjutkan topik lainnya.
Kembali ke rujukan utama HTML untuk melanjutkan topik lainnya.
Form HTML adalah struktur untuk mengumpulkan input dari pengguna dan mengirimkannya ke browser, JavaScript, atau server. Di dalam form, elemen seperti input, textarea, select, button, dan label bekerja sebagai satu sistem, bukan sebagai elemen terpisah.
Topik ini penting karena form adalah titik interaksi paling sensitif di banyak halaman web. Di sini, detail kecil seperti hubungan label-input, tipe input, urutan field, dan validasi native langsung memengaruhi usability, aksesibilitas, dan tingkat error pengguna.
Banyak form terlihat “jalan”, tetapi sebenarnya rapuh:
Kalau fondasinya salah, form akan terasa melelahkan dipakai meskipun tampilannya rapi.
Struktur form yang sehat biasanya mengikuti pola ini:
<form action="/register" method="post">
<fieldset>
<legend>Data akun</legend>
<div>
<label for="name">Nama lengkap</label>
<input id="name" name="name" type="text" autocomplete="name" required />
</div>
<div>
<label for="email">Email</label>
<input id="email" name="email" type="email" autocomplete="email" required />
</div>
<div>
<label for="password">Kata sandi</label>
<input
id="password"
name="password"
type="password"
autocomplete="new-password"
minlength="8"
required
/
>
</div>
</fieldset>
<button type="submit">Daftar</button>
</form>Pola di atas menunjukkan beberapa prinsip dasar:
form menjadi pembungkus utama interaksilabel memberi nama yang jelas pada setiap kontrolname dipakai untuk identitas data saat submittype memberi perilaku dan validasi bawaanrequired, minlength, dan atribut lain menambah validasi nativefieldset dan legend membantu mengelompokkan field yang satu topikfieldsetfieldset cocok saat beberapa field berada dalam satu kelompok logis, misalnya:
Kalau field hanya satu-dua dan tidak perlu pengelompokan semantik, fieldset bisa tidak dipakai. Tapi begitu form mulai panjang, pengelompokan jadi sangat membantu pembaca dan teknologi bantu.
Hubungan label dan input itu inti dari accessibility form.
Hubungkan label dengan input memakai for dan id:
<label for="email">Email</label>
<input id="email" name="email" type="email" />Keuntungan pola ini:
<label>
Email
<input name="email" type="email" />
</label>Pola ini valid, tetapi untuk form yang lebih kompleks, penggunaan for dan id biasanya lebih mudah dibaca, lebih gampang di-scan, dan lebih konsisten saat layout berubah.
aria-label untuk field yang sebenarnya bisa diberi label nyataPlaceholder boleh dipakai sebagai petunjuk tambahan, tetapi tidak boleh menjadi satu-satunya nama field. Begitu pengguna mulai mengetik, placeholder menghilang, sementara label tetap harus tersedia.
Memilih type yang tepat bukan soal kosmetik. Browser memakai type untuk mengubah keyboard mobile, validasi native, dan perilaku default field.
textDipakai untuk teks umum yang tidak punya format khusus.
Contoh: nama, judul, kota.
emailDipakai untuk alamat email.
Browser biasanya akan:
passwordDipakai untuk kata sandi.
Perilakunya berbeda karena karakter disamarkan. Gunakan dengan autocomplete yang tepat, misalnya current-password atau new-password.
numberDipakai untuk angka yang memang berupa nilai numerik.
Catatan penting:
number bukan selalu pilihan terbaik untuk semua data angkatype="text" sering lebih amannumber bisa memunculkan spinner dan validasi format yang tidak selalu cocok dengan kebutuhan datatelDipakai untuk nomor telepon.
Browser tidak memvalidasi format telepon secara ketat, jadi format tetap perlu dikelola sesuai kebutuhan aplikasi.
urlDipakai untuk alamat URL.
Cocok jika field memang harus berupa link lengkap dengan skema, misalnya https://....
date, time, datetime-localDipakai untuk input waktu dan tanggal.
Keunggulannya:
Tetapi dukungan UI bisa berbeda antar browser, jadi tetap perlu diuji.
checkbox dan radioDipakai untuk pilihan diskret.
checkbox: pilihan bisa lebih dari satu atau ya/tidakradio: satu pilihan dari beberapa opsiUntuk grup radio, semua input yang terkait harus punya name yang sama agar browser memperlakukan mereka sebagai satu grup pilihan.
fileDipakai untuk upload file.
Biasanya dipasangkan dengan accept jika tipe file perlu dibatasi.
textareaDipakai untuk teks panjang, bukan input biasa.
Cocok untuk:
selectDipakai saat pilihan terbatas dan paling baik dipilih dari daftar.
Cocok untuk:
Validasi native adalah validasi bawaan browser melalui atribut HTML. Ini biasanya langkah pertama yang paling murah dan paling stabil.
required — field wajib diisiminlength / maxlength — panjang inputmin / max — batas nilai numerik atau tanggalpattern — pola regex untuk validasi formattype="email", type="url", type="number" — validasi dasar dari tipe inputstep — kelipatan nilai pada input numerik atau waktuContoh:
<input
id="username"
name="username"
type="text"
minlength="3"
maxlength="20"
pattern="[a-zA-Z0-9_]+"
required
/>Saat form disubmit, browser akan mengecek constraint validation yang sudah terpasang. Kalau ada field yang tidak valid, browser bisa:
Perilaku ini berguna karena user mendapat feedback langsung tanpa harus menunggu request server atau script tambahan.
Validasi native sering cukup untuk:
Kalau aturan bisnisnya lebih kompleks, barulah tambahkan validasi JavaScript atau server-side. Intinya, native validation bukan pengganti semua validasi lain, tetapi fondasi pertama yang sangat berguna.
Alur form yang sehat biasanya seperti ini:
submit event berjalan kalau lolosPoin terakhir penting: validasi di client tidak pernah cukup sebagai satu-satunya pengaman. Client bisa dimodifikasi, dilewati, atau dimatikan.
Accessibility form bukan tambahan belakangan. Ia harus ikut dirancang sejak struktur awal.
aria-describedby jika perlu menghubungkan helper text atau pesan error<label for="email">Email</label>
<input
id="email"
name="email"
type="email"
aria-describedby="email-help email-error"
required
/
>
<p
aria-* bukan pengganti semantik nativeKalau elemen HTML sudah menyediakan perilaku bawaan yang tepat, gunakan itu dulu.
Contoh:
button, bukan div yang dikliklabel, bukan teks biasainput type="checkbox", bukan komponen custom tanpa alasanARIA berguna untuk melengkapi, bukan untuk menambal semua hal yang seharusnya bisa diselesaikan oleh HTML native.
Ini jebakan paling klasik. Placeholder hilang saat user mengetik, jadi konteks field bisa menghilang.
type="number"Tidak semua data numerik cocok dengan number. Nomor telepon, kode pos, dan nomor identitas sering lebih aman sebagai teks.
Kalau hanya bergantung pada JS, form jadi rapuh saat script gagal, dimatikan, atau belum selesai termuat.
Pesan seperti “input tidak valid” tidak cukup membantu. Lebih baik jelaskan field mana yang salah dan kenapa.
Kalau label tidak terhubung ke input, pengguna keyboard dan screen reader kehilangan kenyamanan dasar.
Kalau DOM dan visual layout tidak selaras, navigasi keyboard bisa terasa lompat-lompat.
Field error yang hanya berubah warna tipis sering tidak cukup. Tambahkan teks atau indikator yang lebih jelas.
Semua validasi client-side tetap harus diulang di server. Client-side hanya UX, bukan trust boundary.
<form action="/contact" method="post">
<div>
<label for="name">Nama</label>
<input id="name" name=
Contoh ini memang sederhana, tetapi sudah menunjukkan fondasi yang benar:
requiredtextarealabel dengan input lewat for dan id.type berdasarkan makna data, bukan semata bentuk UI.fieldset dan legend.input, textarea, select, dan button.<input>, <label>, <textarea>, <select>