Empat lapisan setiap kotak
Setiap elemen di halaman digambar sebagai persegi panjang yang terdiri dari empat lapisan, dari dalam ke luar:
- Content: teks, gambar, atau elemen anak, ukurannya diatur oleh
widthdanheight. - Padding: ruang di dalam kotak, di antara content dan border. Padding menampilkan background elemen.
- Border: garis di sekeliling padding.
- Margin: ruang di luar border yang mendorong kotak lain menjauh. Selalu transparan.
Di contoh ini setiap lapisan punya warna sendiri: content biru, padding hijau, border gelap, dan area kuning tua di sekeliling kotak yang merupakan margin (digambar oleh elemen pembungkus, karena margin sendiri transparan).
Baris di bawah kotak diukur oleh browser: 160 + 20 + 20 + 10 + 10 = 220px. Margin menambah 24px lagi di setiap sisinya, tetapi margin berada di luar kotak, jadi tidak termasuk dalam 220 itu.
Hitungan lebar: content-box vs border-box
Secara default (box-sizing: content-box), width hanya mengatur content. Padding dan border ditambahkan di atasnya, jadi kotak akhirnya lebih lebar dari angka yang kamu tulis. Dengan box-sizing: border-box, width adalah seluruh kotak, dan content menyusut untuk memberi ruang bagi padding dan border.
content-box (default) | border-box | |
|---|---|---|
Arti width | Content | Content + padding + border |
width: 200px; padding: 20px; border: 5px | Lebar 250px | Lebar 200px |
| Area content dalam kasus itu | 200px | 150px |
| Margin | Di luar, tidak dihitung | Di luar, tidak dihitung |
Reset border-box
Karena border-box membuat ukuran terjumlah dengan benar, hampir setiap stylesheet modern dimulai dengan aturan ini:
*,
*::before,
*::after {
box-sizing: border-box;
}
Hal ini paling penting saat memakai persentase. Dua kolom width: 50% dengan padding tidak muat dalam satu baris jika memakai content-box, karena masing-masing lebarnya 50% ditambah padding-nya:
(Komentar HTML menghilangkan spasi di antara kolom inline-block, yang kalau tidak akan menambah beberapa piksel.)
Melihat box model di DevTools
Setiap browser menggambar box model untukmu. Klik kanan sebuah elemen, pilih Inspect, lalu buka tab Computed (Layout di Firefox): sebuah diagram menampilkan ukuran content di tengah, dikelilingi nilai padding, border, dan margin. Mengarahkan kursor ke elemen di panel Elements juga mewarnai halaman: content biru, padding hijau, margin oranye.
Kotak inline mengikuti aturan yang berbeda
Box model di atas menjelaskan kotak block seperti <div> dan <p>. Elemen inline seperti <span>, <a>, dan <strong> mengalir di dalam satu baris teks, dan memperlakukan ruang vertikal secara berbeda:
| Properti | Pada elemen inline |
|---|---|
width, height | Diabaikan |
| Padding, border, margin horizontal | Diterapkan, dan mendorong elemen di sebelahnya ke samping |
| Padding dan border vertikal | Digambar, tetapi tidak mendorong baris di atas dan di bawahnya |
| Margin vertikal | Diabaikan |
display: inline-block memberi elemen di dalam baris box model yang lengkap: width, height, padding, dan margin-nya semua memakan ruang. Lihat padding CSS dan margin CSS untuk penjelasan rinci setiap lapisan.
Kesalahan umum
- Menambahkan padding ke kotak berlebar tetap lalu heran kenapa kotaknya membesar. Dengan
content-box, padding dan border ditambahkan kewidth. Pakaiborder-box. - Berharap margin ikut berwarna background. Margin selalu transparan; pakai padding untuk ruang yang berwarna.
- Mengatur
heightatau margin vertikal pada elemen inline. Tidak terjadi apa-apa; pakaidisplay: inline-blockataublock. - Lupa memperhitungkan border. Border 1px pada elemen
width: 100%membuatnya kelebihan 2px dengancontent-box, yang bisa memunculkan scrollbar horizontal. - Tertukar antara margin dan padding. Versi singkatnya: padding ada di dalam border, margin di luarnya. Halaman margin vs padding membandingkan keduanya berdampingan.
Pertanyaan yang sering diajukan
Apa itu box model CSS?
Box model adalah aturan bahwa setiap elemen ditampilkan sebagai kotak persegi panjang dengan empat lapisan: content, padding di sekelilingnya, border di sekeliling padding, dan margin di luar border. Lebar, tinggi, dan jarak di CSS semuanya diatur pada lapisan-lapisan ini.
Apa fungsi box-sizing: border-box?
Nilai ini membuat width dan height sudah mencakup padding dan border. Kotak width: 200px dengan padding: 20px dan border 5px jadi tepat 200px lebarnya, dan area content menyusut menjadi 150px agar muat. Nilai default, content-box, menambahkan padding dan border di atasnya, sehingga hasilnya 250px.
Bagaimana cara menghitung lebar total sebuah elemen?
Dengan content-box default: width + padding kiri dan kanan + border kiri dan kanan. Dengan border-box: cukup width. Di kedua kasus, margin berada di luar kotak, jadi ia menambah ruang yang dipakai elemen, bukan lebar elemen itu sendiri.
Apakah margin termasuk bagian dari box model?
Ya, margin adalah lapisan paling luar, tetapi selalu transparan dan tidak pernah dihitung dalam lebar maupun background elemen itu sendiri. Margin hanya mendorong kotak di sekitarnya menjauh.
Perlukah saya mengatur box-sizing: border-box untuk semua elemen?
Kebanyakan proyek melakukannya, dengan *, *::before, *::after { box-sizing: border-box; } di bagian atas stylesheet. Dengan begitu, lebar persentase dan padding terjumlah seperti yang diharapkan orang, dan framework seperti Bootstrap dan Tailwind juga menyertakan reset yang sama.