Memahami CSS Box Model: Margin, Border, Padding, dan Content
Di CSS #1 kita pernah menulis:
header { background-color: #2563eb; color: white; padding: 20px;}Hasilnya sederhana.
Isi header tidak lagi menempel ke tepi.
Kita waktu itu cukup puas dengan penjelasan:
paddingmemberi ruang.
Selesai.
Tapi sekarang kita sudah mulai bisa membaca CSS dengan lebih baik.
Jadi ada pertanyaan yang seharusnya mulai muncul:
Ruang 20px itu sebenarnya berada di mana?
Apakah di luar header?
Di dalam header?
Apakah ukuran header ikut bertambah?
Dan apa bedanya dengan margin yang sering muncul di contoh CSS?
Nah.
Sekarang waktunya kita membongkar kotaknya. 😄
Kalau Gabuters belum mengikuti artikel sebelumnya, baca dulu Mengenal Selector, Property, dan Value CSS.
Kita akan melanjutkan halaman profil yang sama.
Browser Melihat Elemen sebagai Kotak
Ambil section Tentang Saya dari project kita:
<section id="tentang"> <h2>Tentang Saya</h2>
<p> Halo! Saya BapakGabut. Saat ini saya sedang belajar membuat website menggunakan HTML. </p></section>Kita melihat:
headingparagrafBrowser juga perlu menghitung ruang yang ditempati elemen tersebut.
Untuk memahami perhitungan itu, kita bisa membayangkan sebuah elemen sebagai kotak yang memiliki beberapa lapisan.
┌────────────── margin ──────────────┐│ ┌─────────── border ────────────┐ ││ │ ┌──────── padding ────────┐ │ ││ │ │ │ │ ││ │ │ content │ │ ││ │ │ │ │ ││ │ └─────────────────────────┘ │ ││ └───────────────────────────────┘ │└─────────────────────────────────────┘Dari dalam ke luar:
content↓padding↓border↓marginInilah konsep dasar yang disebut CSS Box Model.
Sekarang kita bongkar satu per satu.
Content: Isi Kotaknya
Bagian paling dalam adalah:
content.
Misalnya:
<p>Ngoding, main game, dan ngulik apa saja.</p>Teks tersebut berada pada area content.
Pada elemen lain, content bisa berupa:
- teks;
- gambar;
- elemen lain;
- form;
- dan sebagainya.
Untuk sekarang kita cukup membayangkan content sebagai area tempat isi elemen dirender.
Padding: Ruang di Dalam Kotak
Sekarang kita kembali ke:
padding: 20px;Padding adalah ruang antara content dan border elemen.
Mari kita melihatnya langsung pada project profil.
Buka index.html, lalu tambahkan class card pada section Tentang Saya:
<section id="tentang" class="card"> <h2>Tentang Saya</h2>
<p> Halo! Saya BapakGabut. Saat ini saya sedang belajar membuat website menggunakan HTML. </p></section>Kita tidak mengganti id="tentang".
id tersebut masih dibutuhkan oleh link navigasi:
<a href="#tentang">Tentang</a>Kita hanya menambahkan class baru agar section tersebut mudah diatur tampilannya.
Sekarang buka style.css, lalu tambahkan:
.card { background-color: white; padding: 20px;}Simpan dan refresh.
Sekarang isi section tidak menempel langsung pada tepi background putih.
Ruang tersebut berada di dalam box.
Itulah padding.
Secara konseptual:
┌─────────────────────────┐│ padding ││ ┌─────────────────┐ ││ │ content │ ││ └─────────────────┘ ││ padding │└─────────────────────────┘Background elemen juga terlihat pada area padding.
Ini nanti membantu kita membedakan padding dari margin.
Border: Garis di Sekelilingnya
Saat ini kita sudah memberi background putih pada card.
Tetapi batas kotaknya mungkin belum terlalu jelas karena background halaman juga cukup terang.
Sekarang tambahkan border:
.card { background-color: white; padding: 20px; border: 2px solid #d1d5db;}Refresh.
Sekarang batas box menjadi jauh lebih mudah dilihat.
Aturan:
border: 2px solid #d1d5db;secara praktis berarti kita memberi border dengan:
ketebalan: 2pxgaya: solidwarna: #d1d5dbKita tidak perlu membedah seluruh variasi border sekarang.
Yang penting kita bisa melihat urutannya:
content↓padding↓borderBorder mengelilingi area content dan padding.
Margin: Ruang di Luar Kotak
Sekarang kita punya card.
Tapi kalau ada beberapa section, card-card tersebut bisa terasa terlalu berdekatan.
Tambahkan:
.card { background-color: white; padding: 20px; border: 2px solid #d1d5db; margin-bottom: 20px;}Refresh.
Sekarang ada ruang setelah card.
Bedanya dengan padding?
Lihat posisinya.
Padding berada sebelum border:
border││ padding│ ┌──────── contentMargin berada setelah border:
content↓padding↓border↓margin↓elemen berikutnyaJadi cara sederhana membedakannya:
Padding memberi ruang di dalam batas elemen.
Margin memberi ruang di luar batas elemen.
Background putih .card terlihat pada content dan padding, tetapi tidak mengisi area margin.
Margin berada di luar border dan transparan.
Mental model tersebut belum mencakup semua perilaku margin di CSS. Margin vertikal tertentu, misalnya, bisa memiliki perilaku khusus ketika bertemu margin elemen lain.
Kita belum perlu membahas detail itu sekarang.
Eksperimen: Padding atau Margin?
Coba hapus sementara:
padding: 20px;Refresh.
Isi card kembali mendekati border.
Sekarang kembalikan padding, lalu hapus:
margin-bottom: 20px;Refresh.
Isi card tetap memiliki ruang dari border.
Tetapi jarak dengan elemen berikutnya berubah.
Eksperimen kecil ini biasanya jauh lebih mudah diingat daripada sekadar menghafal:
padding = dalammargin = luarKarena kita melihat sendiri efeknya.
Empat Sisi Box
Padding dan margin sebenarnya bisa diatur untuk masing-masing sisi.
Misalnya:
padding-top: 10px;padding-right: 20px;padding-bottom: 10px;padding-left: 20px;Begitu juga margin:
margin-top: 10px;margin-right: 20px;margin-bottom: 10px;margin-left: 20px;Tapi menulis empat baris terus-menerus cukup melelahkan.
CSS menyediakan bentuk singkat atau shorthand.
Shorthand Padding dan Margin
Kalau kita menulis satu nilai:
padding: 20px;semua sisi mendapat nilai yang sama.
atas 20pxkanan 20pxbawah 20pxkiri 20pxKalau dua nilai:
padding: 10px 20px;artinya:
atas + bawah → 10pxkanan + kiri → 20pxAtau kalau ingin mengingatnya dengan istilah yang sering muncul di dokumentasi:
vertical | horizontalKalau empat nilai:
padding: 10px 20px 30px 40px;urutannya:
atas 10pxkanan 20pxbawah 30pxkiri 40pxAtau:
top → right → bottom → leftTidak perlu langsung menghafalnya mati-matian.
Kalau lupa, developer juga boleh membuka dokumentasi. 😄
Yang penting kita tahu bahwa shorthand tersebut ada.
Konsep yang sama juga berlaku pada margin.
Sekarang Masuk ke Width
Mari buat contoh sederhana:
.card { width: 300px; padding: 20px; border: 2px solid #d1d5db;}Sekilas kita mungkin berpikir:
Oke, berarti lebar card 300px.
Ternyata…
belum tentu ukuran total box-nya 300px.
Kenapa?
Karena secara default elemen menggunakan:
box-sizing: content-box;Pada model ini, width mengatur lebar content box.
Jadi pada contoh tadi, perhitungan horizontal sampai ke sisi luar border adalah:
content 300pxpadding kiri 20pxpadding kanan 20pxborder kiri 2pxborder kanan 2px--------------------- +total 344pxAtau:
300 + 20 + 20 + 2 + 2= 344pxJadi kita menulis:
width: 300px;tetapi box yang terlihat sampai border menjadi:
344pxMargin berada di luar ukuran 344px tersebut. Margin bukan bagian dari ukuran border box.
Perhitungan ini berlaku selama tidak ada kondisi lain yang mengubah cara ukuran elemen tersebut dihitung.
Kalau belum tahu Box Model, bagian ini sering terasa seperti:
CSS kok tidak bisa berhitung? 😄
CSS-nya bisa.
Kita saja yang baru tahu apa yang sebenarnya dihitung.
Kenalan dengan box-sizing
Ada cara lain menghitung width yang sering lebih nyaman ketika kita mengatur ukuran elemen.
Gunakan:
box-sizing: border-box;Sekarang aturan card kita menjadi:
.card { width: 300px; padding: 20px; border: 2px solid #d1d5db; box-sizing: border-box;}Dengan:
box-sizing: border-box;nilai width: 300px mencakup:
- content;
- padding;
- border.
Jadi ukuran sampai batas luar border tetap:
300pxBrowser menyesuaikan lebar content agar padding dan border tetap muat di dalam ukuran tersebut.
Bandingkan:
content-box
width↓content saja
+ padding+ border↓ukuran sampai border bertambahdengan:
border-box
width↓content + padding + border
ukuran sampai border tetap sesuai widthMargin tetap berada di luar perhitungan width pada keduanya.
Ini salah satu property kecil yang nantinya sangat membantu ketika kita mulai mengatur layout.
Banyak project menerapkan border-box secara lebih luas pada banyak elemen. Tetapi sekarang kita menggunakannya langsung pada .card agar lebih dulu memahami apa yang diubah oleh property tersebut.
Bagaimana dengan Height?
Prinsip yang sama berlaku pada:
heightMisalnya:
.card { height: 200px;}Pada content-box, nilai tersebut menentukan tinggi content area.
Padding dan border dapat menambah tinggi box.
Dengan border-box, padding dan border dihitung di dalam tinggi yang ditentukan.
Tetapi ada satu kebiasaan yang perlu kita bangun sejak awal:
Jangan buru-buru memberi height tetap pada semua elemen.
Sering kali lebih baik membiarkan tinggi elemen mengikuti content-nya.
Kalau teks bertambah tetapi tinggi dipaksa terlalu kecil, kita justru bisa menciptakan masalah baru.
Jadi untuk project kita sekarang, kita lebih banyak bermain dengan width, padding, border, dan margin.
Terapkan ke Halaman Profil
Sekarang mari gunakan Box Model untuk membuat beberapa bagian halaman lebih mudah dibaca.
Di CSS #2 kita sudah belajar bahwa satu class dapat digunakan pada banyak elemen.
Karena itu kita bisa menambahkan class card pada beberapa section yang sudah ada di index.html.
Section Tentang Saya:
<section id="tentang" class="card"> <h2>Tentang Saya</h2> <!-- gambar dan paragraf tetap seperti sebelumnya --></section>Section Yang Sedang Saya Pelajari:
<section id="belajar" class="card"> <h2>Yang Sedang Saya Pelajari</h2> <!-- daftar tetap seperti sebelumnya --></section>Section Link Favorit memang tidak memiliki id, dan itu tidak menjadi masalah:
<section class="card"> <h2>Link Favorit</h2> <!-- daftar link tetap seperti sebelumnya --></section>Section Hubungi Saya:
<section id="kontak" class="card"> <h2>Hubungi Saya</h2> <!-- form tetap seperti sebelumnya --></section>Kita tidak menghapus id yang dipakai oleh navigasi.
Satu elemen boleh memiliki id dan class sekaligus karena keduanya memiliki fungsi berbeda.
Sekarang gunakan aturan berikut di style.css:
.card { background-color: white; padding: 20px; border: 1px solid #d1d5db; margin-bottom: 20px; box-sizing: border-box;}Simpan, lalu refresh browser.
Sekarang beberapa section memiliki pola visual yang sama.
Perhatikan sesuatu dari CSS #2.
Kita tidak perlu menulis:
#tentang { background-color: white; padding: 20px; border: 1px solid #d1d5db; margin-bottom: 20px; box-sizing: border-box;}lalu mengulang semua declaration tersebut untuk #belajar dan #kontak.
Kita menggunakan:
.cardkarena style tersebut memang ingin digunakan ulang.
Jadi materi selector dari artikel sebelumnya mulai terpakai pada project nyata.
Kita juga tidak perlu memasang width: 300px pada card project kita. Nilai tersebut tadi hanya dipakai untuk memahami perhitungan ukuran dengan angka yang mudah dilihat.
Jangan Terlalu Sibuk Mempercantik
Sekarang halaman profil kita mulai terlihat lebih rapi.
Tapi jangan tergoda menambahkan semua hal sekaligus.
Belum perlu:
shadowgradientanimationlayout rumitTarget kita sekarang adalah memahami:
Kenapa elemen punya ukuran seperti ini?
Kenapa ada ruang di sini?
Ruang tersebut padding atau margin?
Border berada di mana?
Apa yang sebenarnya dihitung oleh width?Kalau pertanyaan tersebut mulai bisa Gabuters jawab, Box Model sudah mulai masuk akal.
Bonus: Lihat Box Model dari Browser
Browser modern memiliki Developer Tools atau DevTools.
Buka halaman profil.
Klik kanan pada salah satu card, lalu pilih menu untuk memeriksa atau meng-inspect elemen. Nama menunya bisa sedikit berbeda pada setiap browser.
Pada panel style atau computed, biasanya ada visualisasi Box Model yang menunjukkan:
marginborderpaddingcontentTampilan persisnya juga bisa berbeda antar-browser.
Tapi konsepnya sama.
Ini sangat berguna ketika suatu hari kita melihat:
Kok jaraknya dari mana, ya?
Daripada menebak-nebak, inspect elemennya.
Developer tidak harus menyimpan seluruh CSS di kepala.
Kita juga punya alat untuk melihat apa yang sedang dilakukan browser.
Coba Rusakkan Box-nya
Seperti biasa, eksperimen sebentar. 😄
Coba:
.card { padding: 60px;}Refresh.
Lalu:
.card { margin-bottom: 80px;}Refresh.
Coba border lebih tebal:
.card { border: 10px solid tomato;}Kemudian coba bandingkan:
box-sizing: content-box;dengan:
box-sizing: border-box;sambil menggunakan width pada card untuk sementara.
Tujuannya bukan membuat desain bagus.
Tujuannya supaya mata kita mulai bisa mengenali:
ini padding
ini border
ini margin
ini contentSetelah selesai, kembalikan ke nilai yang lebih masuk akal.
Apa yang Sudah Kita Pelajari?
Sekarang ketika melihat sebuah elemen, kita tidak lagi hanya melihat:
teksgambarformKita juga bisa membayangkan box di belakangnya:
margin└── border └── padding └── contentKita tahu:
- content adalah area isi;
- padding memberi ruang antara content dan border;
- border mengelilingi area content dan padding;
- margin memberi ruang di luar border.
Kita juga sudah melihat kenapa:
width: 300px;tidak selalu berarti ukuran sampai border tepat 300px pada default content-box.
Dan kita sudah mengenal:
box-sizing: border-box;yang membuat perhitungan ukuran sering terasa lebih intuitif.
Halaman profil kita sekarang juga mulai terlihat lebih terstruktur.
Tapi ada masalah berikutnya.
Selanjutnya: Bagaimana Mengatur Elemen Berdampingan?
Sejauh ini kita banyak mengatur tampilan sebuah elemen secara individual.
Tapi bagaimana kalau kita ingin:
nama situs navigasiberada dalam satu baris?
Atau:
foto profil informasi profilberdampingan?
Atau beberapa bagian disusun dengan jarak yang rapi tanpa mengatur posisi satu per satu?
Kita membutuhkan cara untuk mengatur hubungan layout antar-elemen.
Dan salah satu alat CSS yang paling berguna untuk itu adalah:
Flexbox.
Itulah yang akan kita gunakan pada artikel berikutnya.
CSS
SelesaiBagikan Artikel
Buat poster berbagi atau salin tautan artikel ini.
Lanjut membaca
Coba jalur lain
Pilihan konsisten dari artikel lain
Terakhir diperbarui pada , 31 hari yang lalu
Sebagian konten mungkin sudah tidak berlaku