Form adalah elemen HTML yang memungkinkan pengguna mengirimkan data ke server — mulai dari login, registrasi, pencarian, pemesanan, hingga komentar. Hampir semua interaksi pengguna di web melibatkan form.
Tag pembungkus seluruh elemen form adalah <form>:
<form action="/proses.php" method="POST">
<!-- elemen input di sini -->
<button type="submit">Kirim</button>
</form>
Dua atribut terpenting pada <form>:
action — ke mana data dikirim (URL tujuan)method — cara pengiriman data (GET atau POST)actionaction menentukan URL endpoint yang akan menerima dan memproses data form:
<!-- Kirim ke file PHP di server -->
<form action="/proses-login.php">...</form>
<!-- Kirim ke halaman yang sama -->
<form action="">...</form>
<form action="#">...</form>
<!-- Kirim ke API endpoint -->
<form action="https://api.example.com/submit">...</form>
<!-- Kirim ke halaman lain di proyek -->
<form action="/halaman-sukses.html">...</form>
Jika atribut action tidak dicantumkan, data dikirim ke URL halaman saat ini secara default.
method — GET vs POSTmethod menentukan metode HTTP yang digunakan untuk mengirim data:
<!-- Method GET -->
<form action="/cari" method="GET">
<input type="text" name="kata-kunci">
<button type="submit">Cari</button>
</form>
<!-- Method POST -->
<form action="/login" method="POST">
<input type="email" name="email">
<input type="password" name="password">
<button type="submit">Masuk</button>
</form>
| Aspek | GET | POST |
|---|---|---|
| Data tampil di URL | ✅ Ya — ?nama=Budi&email=... |
❌ Tidak |
| Keamanan | Kurang aman | Lebih aman |
| Panjang data | Terbatas (~2000 karakter) | Tidak terbatas |
| Bisa di-bookmark | ✅ Ya | ❌ Tidak |
| Cocok untuk | Pencarian, filter, query | Login, registrasi, upload |
| Cache browser | Di-cache | Tidak di-cache |
Contoh URL setelah submit GET:
https://tokobuku.com/cari?judul=html+dasar&kategori=pemrograman&harga=50000
Data tampil jelas di URL — cocok untuk pencarian karena bisa dibagikan dan di-bookmark.
POST menyembunyikan data di body request — cocok untuk data sensitif seperti password atau data pribadi.
enctype — Tipe Encoding Dataenctype menentukan bagaimana data form diencode sebelum dikirim ke server:
<!-- Default — untuk form teks biasa -->
<form action="/submit" method="POST"
enctype="application/x-www-form-urlencoded">
...
</form>
<!-- Wajib untuk form yang mengandung upload file -->
<form action="/upload" method="POST"
enctype="multipart/form-data">
<input type="file" name="foto">
<button type="submit">Upload</button>
</form>
<!-- Data dikirim tanpa encoding apapun -->
<form action="/submit" method="POST"
enctype="text/plain">
...
</form>
Nilai enctype |
Kapan digunakan |
|---|---|
application/x-www-form-urlencoded |
Default — form teks biasa |
multipart/form-data |
Wajib jika ada <input type="file"> |
text/plain |
Jarang digunakan, biasanya untuk debugging |
target pada FormSama seperti tag <a>, form juga memiliki atribut target untuk menentukan di mana response ditampilkan:
<!-- Tampilkan response di tab yang sama — default -->
<form action="/submit" method="POST" target="_self">...</form>
<!-- Tampilkan response di tab baru -->
<form action="/submit" method="POST" target="_blank">...</form>
novalidateMenonaktifkan validasi bawaan browser — berguna saat validasi ditangani oleh JavaScript atau server:
<form action="/submit" method="POST" novalidate>
<input type="email" name="email" required>
<button type="submit">Kirim</button>
</form>
Tanpa novalidate, browser akan memvalidasi email dan field required sebelum data dikirim.
autocompleteMengontrol apakah browser boleh mengisi otomatis nilai form dari riwayat sebelumnya:
<!-- Aktifkan autocomplete — default -->
<form action="/submit" autocomplete="on">...</form>
<!-- Nonaktifkan autocomplete — untuk data sensitif -->
<form action="/submit" autocomplete="off">...</form>
Form bukan hanya <input> — ada beberapa elemen pendukung yang penting:
<label> — Label Input:
Menghubungkan teks keterangan dengan elemen input. Klik label = fokus ke input:
<!-- Cara 1 — menggunakan atribut for dan id -->
<label for="nama">Nama Lengkap</label>
<input type="text" id="nama" name="nama">
<!-- Cara 2 — input di dalam label -->
<label>
Nama Lengkap
<input type="text" name="nama">
</label>
Selalu gunakan <label> — sangat penting untuk aksesibilitas karena screen reader membacakan label saat input difokuskan.
<fieldset> dan <legend> — Mengelompokkan Input:
<form action="/daftar" method="POST">
<fieldset>
<legend>Data Pribadi</legend>
<label for="nama">Nama Lengkap</label>
<input type="text" id="nama" name="nama"><br><br>
<label for="tgl-lahir">Tanggal Lahir</label>
<input type="date" id="tgl-lahir" name="tgl-lahir">
</fieldset>
<fieldset>
<legend>Data Akun</legend>
<label for="email">Email</label>
<input type="email" id="email" name="email"><br><br>
<label for="password">Password</label>
<input type="password" id="password" name="password">
</fieldset>
<button type="submit">Daftar Sekarang</button>
</form>
Hasilnya:
┌─ Data Pribadi ──────────────────────┐
│ Nama Lengkap: [________________] │
│ Tanggal Lahir: [________________] │
└─────────────────────────────────────┘
┌─ Data Akun ─────────────────────────┐
│ Email: [________________] │
│ Password: [________________] │
└─────────────────────────────────────┘
[Daftar Sekarang]
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Login</title>
<style>
* { box-sizing: border-box; }
body {
font-family: sans-serif;
background: #f0f4ff;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
margin: 0;
}
.form-card {
background: white;
padding: 40px;
border-radius: 16px;
box-shadow: 0 8px 32px rgba(0,0,0,0.1);
width: 100%;
max-width: 420px;
}
h2 {
margin: 0 0 24px;
color: #1e1e1e;
font-size: 24px;
}
.form-group {
margin-bottom: 20px;
}
label {
display: block;
margin-bottom: 6px;
font-size: 14px;
font-weight: 600;
color: #374151;
}
input {
width: 100%;
padding: 10px 14px;
border: 1px solid #d1d5db;
border-radius: 8px;
font-size: 15px;
transition: border-color 0.2s;
outline: none;
}
input:focus {
border-color: #4a9eed;
box-shadow: 0 0 0 3px rgba(74, 158, 237, 0.15);
}
.btn-submit {
width: 100%;
padding: 12px;
background-color: #4a9eed;
color: white;
border: none;
border-radius: 8px;
font-size: 16px;
font-weight: 600;
cursor: pointer;
transition: background-color 0.2s;
}
.btn-submit:hover {
background-color: #2563eb;
}
.form-footer {
text-align: center;
margin-top: 16px;
font-size: 14px;
color: #6b7280;
}
.form-footer a {
color: #4a9eed;
text-decoration: none;
}
</style>
</head>
<body>
<div class="form-card">
<h2>Masuk ke Akun</h2>
<form action="/login" method="POST" autocomplete="off">
<div class="form-group">
<label for="email">Alamat Email</label>
<input
type="email"
id="email"
name="email"
placeholder="[email protected]"
required
>
</div>
<div class="form-group">
<label for="password">Password</label>
<input
type="password"
id="password"
name="password"
placeholder="Masukkan password Anda"
required
>
</div>
<button type="submit" class="btn-submit">Masuk</button>
</form>
<div class="form-footer">
Belum punya akun? <a href="/daftar">Daftar sekarang</a>
</div>
</div>
</body>
</html>
<form action="/daftar" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>Informasi Pribadi</legend>
<div class="form-group">
<label for="nama-depan">Nama Depan</label>
<input type="text" id="nama-depan" name="nama_depan" required>
</div>
<div class="form-group">
<label for="nama-belakang">Nama Belakang</label>
<input type="text" id="nama-belakang" name="nama_belakang">
</div>
<div class="form-group">
<label for="tgl-lahir">Tanggal Lahir</label>
<input type="date" id="tgl-lahir" name="tgl_lahir" required>
</div>
<div class="form-group">
<label for="foto">Foto Profil</label>
<input type="file" id="foto" name="foto" accept="image/*">
</div>
</fieldset>
<fieldset>
<legend>Informasi Akun</legend>
<div class="form-group">
<label for="reg-email">Email</label>
<input type="email" id="reg-email" name="email" required>
</div>
<div class="form-group">
<label for="reg-password">Password</label>
<input type="password" id="reg-password" name="password"
minlength="8" required>
</div>
<div class="form-group">
<label for="konfirmasi">Konfirmasi Password</label>
<input type="password" id="konfirmasi" name="konfirmasi_password" required>
</div>
</fieldset>
<button type="submit">Daftar Sekarang</button>
<button type="reset">Reset Form</button>
</form>
name — Sangat Penting!Setiap input yang datanya ingin dikirim wajib memiliki atribut name. Inilah yang menjadi key/kunci data saat diterima server:
<!-- Input TANPA name — datanya tidak akan terkirim -->
<input type="text" id="nama">
<!-- Input DENGAN name — datanya terkirim sebagai "nama=nilai" -->
<input type="text" id="nama" name="nama">
Saat form di-submit, server menerima data seperti ini:
nama=Budi Santoso
[email protected]
password=rahasia123
<form>| Atribut | Fungsi | Nilai Umum |
|---|---|---|
action |
URL tujuan pengiriman data | URL relatif / absolut |
method |
Metode HTTP pengiriman | GET, POST |
enctype |
Cara encode data | application/x-www-form-urlencoded, multipart/form-data |
target |
Di mana response ditampilkan | _self, _blank |
autocomplete |
Izinkan autocomplete browser | on, off |
novalidate |
Nonaktifkan validasi browser | Boolean |
✓ Selalu gunakan method POST untuk data sensitif
✓ Gunakan enctype="multipart/form-data" jika ada upload file
✓ Setiap input memiliki atribut name
✓ Setiap input memiliki label yang terhubung via for dan id
✓ Gunakan fieldset dan legend untuk mengelompokkan input
✓ Tambahkan atribut required untuk field wajib
✓ Gunakan autocomplete="off" untuk data sensitif
✓ Sertakan tombol reset jika form panjang dan kompleks
💡 Tips: Atribut
actiondanmethodpada form hanyalah instruksi pengiriman data — siapa yang benar-benar memproses data adalah kode di sisi server (PHP, Python, Node.js, dll). Di tahap belajar HTML murni, kita fokus dulu pada struktur form yang benar. Pemrosesan data di server adalah materi back-end yang dipelajari setelah menguasai HTML dan CSS. 🚀
Kursus
HTML Dasar
Kategori
Form & Input
Durasi Pelajaran
20 menit