1664 kata
8 menit

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:

padding memberi 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:

heading
paragraf

Browser 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
↓
margin

Inilah 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: 2px
gaya: solid
warna: #d1d5db

Kita tidak perlu membedah seluruh variasi border sekarang.

Yang penting kita bisa melihat urutannya:

content
↓
padding
↓
border

Border 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
│ ┌──────── content

Margin berada setelah border:

content
↓
padding
↓
border
↓
margin
↓
elemen berikutnya

Jadi 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 = dalam
margin = luar

Karena 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 20px
kanan 20px
bawah 20px
kiri 20px

Kalau dua nilai:

padding: 10px 20px;

artinya:

atas + bawah → 10px
kanan + kiri → 20px

Atau kalau ingin mengingatnya dengan istilah yang sering muncul di dokumentasi:

vertical | horizontal

Kalau empat nilai:

padding: 10px 20px 30px 40px;

urutannya:

atas 10px
kanan 20px
bawah 30px
kiri 40px

Atau:

top → right → bottom → left

Tidak 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 300px
padding kiri 20px
padding kanan 20px
border kiri 2px
border kanan 2px
--------------------- +
total 344px

Atau:

300 + 20 + 20 + 2 + 2
= 344px

Jadi kita menulis:

width: 300px;

tetapi box yang terlihat sampai border menjadi:

344px

Margin 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:

300px

Browser menyesuaikan lebar content agar padding dan border tetap muat di dalam ukuran tersebut.

Bandingkan:

content-box
width
↓
content saja
+ padding
+ border
↓
ukuran sampai border bertambah

dengan:

border-box
width
↓
content + padding + border
ukuran sampai border tetap sesuai width

Margin 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:

height

Misalnya:

.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:

.card

karena 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:

shadow
gradient
animation
layout rumit

Target 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:

margin
border
padding
content

Tampilan 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 content

Setelah selesai, kembalikan ke nilai yang lebih masuk akal.

Apa yang Sudah Kita Pelajari?#

Sekarang ketika melihat sebuah elemen, kita tidak lagi hanya melihat:

teks
gambar
form

Kita juga bisa membayangkan box di belakangnya:

margin
└── border
└── padding
└── content

Kita 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 navigasi

berada dalam satu baris?

Atau:

foto profil informasi profil

berdampingan?

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

Selesai

Bagian 3 dari 6Tulisan ini bagian dari seri

Bagikan Artikel

Buat poster berbagi atau salin tautan artikel ini.

Lanjut membaca

Bacaan terkait

Berdasarkan tag dan kategori yang sama

Coba jalur lain

Pilihan konsisten dari artikel lain