Bagian pertama proyek ini membangun kerangka dasar formulir: kumpulan kontrol yang benar jenisnya, dikelompokkan dengan jelas, dan disebutkan namanya dengan tepat. Kita sengaja menahan diri dari atribut validasi dan gaya visual — keduanya masuk pada Bagian 2 dan Bagian 3. Fokus tahap ini adalah memastikan setiap kolom punya label yang menempel, setiap kelompok punya judul, dan data yang terkirim nanti punya nama yang jelas.
Rancangan Formulir #
Acara fiktif kita adalah Seminar Web Komunitas. Formulir pendaftarannya memuat empat kelompok isian:
- Data diri: nama lengkap, tanggal lahir, dan kota domisili (select).
- Kategori peserta: pilihan tunggal berupa radio — pelajar, mahasiswa, atau profesional.
- Akun: email dan kata sandi.
- Persetujuan: satu checkbox wajib sebelum data boleh dikirim.
Pemetaan ini menentukan jenis kontrol setiap isian: teks bebas memakai input type="text", pilihan dari daftar memakai select, pilihan tunggal dari beberapa opsi memakai radio dengan atribut name yang sama, dan persetujuan memakai satu checkbox.
File formulir.html #
Simpan file berikut sebagai formulir.html di folder bagian-1/:
<!doctype html>
<html lang="id">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Pendaftaran Seminar Web Komunitas</title>
</head>
<body>
<main>
<h1>Pendaftaran Seminar Web Komunitas</h1>
<p><img src="../assets/logo-acara.svg" alt="Logo Seminar Web Komunitas" width="96" height="96"></p>
<p>Isi formulir berikut untuk mengikuti acara pada Sabtu, 8 Maret 2025, di Gedung Belajar Kota.</p>
<form action="www.example.com/daftar" method="post">
<fieldset>
<legend>Data diri</legend>
<p>
<label for="nama">Nama lengkap</label>
<input type="text" id="nama" name="nama">
</p>
<p>
<label for="tanggal-lahir">Tanggal lahir</label>
<input type="date" id="tanggal-lahir" name="tanggal-lahir">
</p>
<p>
<label for="kota">Kota domisili</label>
<select id="kota" name="kota">
<option value="">-- Pilih kota --</option>
<option value="bandung">Bandung</option>
<option value="jakarta">Jakarta</option>
<option value="surabaya">Surabaya</option>
<option value="yogyakarta">Yogyakarta</option>
</select>
</p>
</fieldset>
<fieldset>
<legend>Kategori peserta</legend>
<p>
<input type="radio" id="kategori-pelajar" name="kategori" value="pelajar">
<label for="kategori-pelajar">Pelajar</label>
</p>
<p>
<input type="radio" id="kategori-mahasiswa" name="kategori" value="mahasiswa">
<label for="kategori-mahasiswa">Mahasiswa</label>
</p>
<p>
<input type="radio" id="kategori-profesional" name="kategori" value="profesional">
<label for="kategori-profesional">Profesional</label>
</p>
</fieldset>
<fieldset>
<legend>Akun</legend>
<p>
<label for="email">Email</label>
<input type="email" id="email" name="email">
</p>
<p>
<label for="kata-sandi">Kata sandi</label>
<input type="password" id="kata-sandi" name="kata-sandi">
</p>
</fieldset>
<p>
<input type="checkbox" id="persetujuan" name="persetujuan" value="setuju">
<label for="persetujuan">Saya menyetujui penggunaan data untuk keperluan acara ini</label>
</p>
<button type="submit">Kirim pendaftaran</button>
</form>
</main>
</body>
</html>Output yang Dihasilkan:
Jendela browser menampilkan:
- Logo acara dan judul halaman di atas formulir
- Tiga kotak berbingkai berjudul "Data diri", "Kategori peserta", dan "Akun"
- Kolom nama, pemilih tanggal, daftar kota, tiga radio, email, dan kata sandi
- Satu checkbox persetujuan dan tombol "Kirim pendaftaran"Mari kita bedah keputusan strukturnya:
- Baris 13 (
<form action="www.example.com/daftar" method="post">): alamat tujuan pengiriman berupa domain fiktif, denganmethod="post"karena data pendaftaran mengubah keadaan di server. Pada halaman nyata nilai action ditulis sebagai alamat absolut lengkap dengan skema. - Baris 14-31 (
fieldsetData diri): pasanganfieldsetdanlegendmemberi judul pada kelompok; pembaca layar membacakan judul ini bersama setiap kolom di dalamnya, sehingga label “Nama lengkap” terdengar sebagai “Data diri, Nama lengkap”. - Baris 16-17 (pasangan
label fordaninput id): nilaiforharus sama persis denganidkontrol. Kaitan inilah yang membuat klik pada label memfokuskan kolom dan membuat pembaca layar menyebut nama kolom dengan benar. - Baris 23-28 (
selectkota): opsi pertama bernilai kosong (value="") berfungsi sebagai penanda “belum memilih”; nilainya akan berguna pada validasi di Bagian 2. - Baris 33-44 (radio kategori): ketiga radio berbagi
name="kategori"sehingga browser menganggapnya satu grup — memilih satu otomatis membatalkan pilihan lain. Atributvaluepada tiap radio adalah nilai yang terkirim ke server. - Baris 58-60 (checkbox persetujuan): kontrol tunggal di luar fieldset karena tidak termasuk kelompok mana pun; labelnya berupa kalimat pernyataan yang sedikit panjang, dan itu wajar untuk persetujuan.
- Baris 62 (
<button type="submit">): tombol pengiriman dengan label berbahasa perintah yang jelas;type="submit"adalah nilai bawaan, tetapi menuliskannya eksplisit mencegah kebingungan saat tombol lain ditambahkan kelak.
Perhatikan juga src="../assets/logo-acara.svg": logo berada di folder assets/ pada akar proyek, satu tingkat di atas folder penyimpan file ini, sehingga path memakai awalan ../.
Langkah Pemeriksaan #
Tuntaskan Bagian ini dengan urutan berikut:
- Unduh
formulir.htmlbeserta folder pendukung, lalu buka di browser. Pastikan logo tampil dan seluruh kontrol dapat diketik, dipilih, serta dicentang. - Klik teks label “Nama lengkap”: fokus harus berpindah ke kolom nama. Ulangi pada label lain — bila ada yang tidak memfokuskan, pasangan
for/id-nya keliru. - Jalankan
../tests/cek-struktur.htmldari foldertests/, lalu centang butir-butir kelompok Struktur form dan Label dan fieldset yang telah terpenuhi.
Struktur berdiri dengan seluruh labelnya menempel. Bagian 2 menambahkan aturan main untuk setiap isian: validasi HTML native yang memeriksa data sebelum form dikirim.
Referensi resmi untuk pendalaman:
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
formulir.html
Unduh berkas<!doctype html>
<html lang="id">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Pendaftaran Seminar Web Komunitas</title>
</head>
<body>
<main>
<h1>Pendaftaran Seminar Web Komunitas</h1>
<p><img src="../assets/logo-acara.svg" alt="Logo Seminar Web Komunitas" width="96" height="96"></p>
<p>Isi formulir berikut untuk mengikuti acara pada Sabtu, 8 Maret 2025, di Gedung Belajar Kota.</p>
<form action="www.example.com/daftar" method="post">
<fieldset>
<legend>Data diri</legend>
<p>
<label for="nama">Nama lengkap</label>
<input type="text" id="nama" name="nama">
</p>
<p>
<label for="tanggal-lahir">Tanggal lahir</label>
<input type="date" id="tanggal-lahir" name="tanggal-lahir">
</p>
<p>
<label for="kota">Kota domisili</label>
<select id="kota" name="kota">
<option value="">-- Pilih kota --</option>
<option value="bandung">Bandung</option>
<option value="jakarta">Jakarta</option>
<option value="surabaya">Surabaya</option>
<option value="yogyakarta">Yogyakarta</option>
</select>
</p>
</fieldset>
<fieldset>
<legend>Kategori peserta</legend>
<p>
<input type="radio" id="kategori-pelajar" name="kategori" value="pelajar">
<label for="kategori-pelajar">Pelajar</label>
</p>
<p>
<input type="radio" id="kategori-mahasiswa" name="kategori" value="mahasiswa">
<label for="kategori-mahasiswa">Mahasiswa</label>
</p>
<p>
<input type="radio" id="kategori-profesional" name="kategori" value="profesional">
<label for="kategori-profesional">Profesional</label>
</p>
</fieldset>
<fieldset>
<legend>Akun</legend>
<p>
<label for="email">Email</label>
<input type="email" id="email" name="email">
</p>
<p>
<label for="kata-sandi">Kata sandi</label>
<input type="password" id="kata-sandi" name="kata-sandi">
</p>
</fieldset>
<p>
<input type="checkbox" id="persetujuan" name="persetujuan" value="setuju">
<label for="persetujuan">Saya menyetujui penggunaan data untuk keperluan acara ini</label>
</p>
<button type="submit">Kirim pendaftaran</button>
</form>
</main>
</body>
</html>