Box Model adalah konsep paling fundamental dalam CSS yang harus dipahami oleh setiap web developer. Setiap elemen HTML sebenarnya adalah sebuah kotak (box) yang memiliki beberapa lapisan. Memahami Box Model akan membantu Anda mengatur layout, jarak, dan ukuran elemen dengan presisi.
Apa Itu CSS Box Model?
CSS Box Model adalah konsep bahwa setiap elemen HTML dirender sebagai kotak persegi panjang yang terdiri dari beberapa lapisan:
1. Margin → jarak di luar border (transparan, untuk jarak antar elemen)
2. Border → garis tepi (bisa diatur warna, ketebalan, gaya)
3. Padding → jarak di dalam border (kena background, untuk jarak konten ke tepi)
4. Content → isi elemen (teks, gambar, atau elemen lain)
Visualisasi Box Model: Margin (merah) → Border (kuning) → Padding (hijau) → Content (biru)
- Margin = jarak antara bingkai foto dengan bingkai lain di dinding
- Border = tebal bingkai foto itu sendiri
- Padding = jarak antara foto dengan bingkai (busa/alas)
- Content = foto itu sendiri
1. Content (Isi Elemen)
Content adalah area di mana teks, gambar, atau elemen lain ditampilkan. Ukuran content bisa diatur dengan properti width dan height.
Contoh:
<style>
.content-box {
width: 200px;
height: 100px;
background: #3b82f6;
color: white;
text-align: center;
line-height: 100px;
}
</style>
<div class="content-box">Content 200x100px</div>
2. Padding (Jarak Dalam)
Padding adalah jarak antara content dengan border. Padding membuat konten tidak menempel ke tepi elemen.
Contoh Tanpa Padding vs Dengan Padding:
<style>
.no-padding {
background: #3b82f6;
color: white;
width: 250px;
}
.with-padding {
background: #22c55e;
color: white;
width: 250px;
padding: 20px;
}
</style>
<div class="no-padding">Teks menempel ke tepi (tanpa padding)</div>
<div class="with-padding">Teks memiliki jarak 20px dari tepi (dengan padding)</div>
Padding Per Sisi:
<style>
.padding-custom {
background: #3b82f6;
color: white;
padding-top: 10px;
padding-right: 30px;
padding-bottom: 20px;
padding-left: 15px;
}
</style>
<div class="padding-custom">
Padding: top 10px, right 30px, bottom 20px, left 15px
</div>
Cara Penulisan Padding (Shorthand):
| Jumlah Nilai | Contoh | Hasil |
|---|---|---|
| 1 nilai | padding: 20px; |
semua sisi 20px |
| 2 nilai | padding: 10px 20px; |
atas-bawah 10px, kiri-kanan 20px |
| 3 nilai | padding: 10px 20px 15px; |
atas 10px, kiri-kanan 20px, bawah 15px |
| 4 nilai | padding: 10px 15px 20px 25px; |
atas 10px, kanan 15px, bawah 20px, kiri 25px |
3. Border (Garis Tepi)
Border adalah garis tepi yang mengelilingi padding dan content. Border memiliki 3 komponen: ketebalan (width), gaya (style), dan warna (color).
Contoh:
<style>
.border-solid { border: 2px solid #3b82f6; padding: 15px; margin: 10px; }
.border-dashed { border: 2px dashed #ef4444; padding: 15px; margin: 10px; }
.border-dotted { border: 2px dotted #22c55e; padding: 15px; margin: 10px; }
.border-double { border: 4px double #8b5cf6; padding: 15px; margin: 10px; }
.border-groove { border: 4px groove #f59e0b; padding: 15px; margin: 10px; }
</style>
Border Per Sisi:
<style>
.border-sides {
border-top: 3px solid #ef4444;
border-right: 3px solid #22c55e;
border-bottom: 3px solid #3b82f6;
border-left: 3px solid #f59e0b;
padding: 15px;
}
</style>
<div class="border-sides">Setiap sisi punya warna berbeda!</div>
4. Margin (Jarak Luar)
Margin adalah jarak di luar border yang memisahkan elemen dengan elemen lain. Margin transparan dan tidak memiliki warna background.
Contoh Tanpa Margin vs Dengan Margin:
<style>
.no-margin {
background: #3b82f6;
color: white;
padding: 15px;
}
.with-margin {
background: #22c55e;
color: white;
padding: 15px;
margin: 20px;
}
</style>
<div class="no-margin">Kotak 1 (tanpa margin)</div>
<div class="no-margin">Kotak 2 (tanpa margin) - menempel</div>
<div class="with-margin">Kotak 3 (dengan margin 20px)</div>
<div class="with-margin">Kotak 4 (dengan margin 20px)</div>
Margin Auto (Memusatkan Elemen):
<style>
.center-box {
width: 200px;
background: #3b82f6;
color: white;
padding: 15px;
text-align: center;
margin: 0 auto;
}
</style>
<div class="center-box">Kotak di tengah (margin: 0 auto)</div>
- Gunakan
margin: 0 auto;untuk memusatkan elemen block (seperti div) secara horizontal - Margin bisa bernilai negatif (contoh:
margin-top: -10px;) untuk menarik elemen ke atas - Margin vertikal (atas-bawah) bisa collapse (menyatu) jika dua elemen bersebelahan
Perhitungan Lebar Total (Box Model)
Penting untuk dipahami: Lebar total elemen TIDAK hanya dari properti width, tapi juga padding + border (kecuali menggunakan box-sizing: border-box).
Rumus Lebar Total (tanpa box-sizing: border-box):
Lebar Total = width + padding-left + padding-right + border-left + border-right
Contoh Perhitungan:
<style>
.box {
width: 200px;
padding: 20px;
border: 5px solid black;
background: #3b82f6;
color: white;
}
</style>
<div class="box">Lebar total = 200 + 40 + 10 = 250px</div>
Meskipun width="200px", lebar total menjadi 236px karena padding dan border ditambahkan di luar.
Box Sizing: Solusi untuk Perhitungan yang Mudah
box-sizing: border-box; membuat width dan height sudah termasuk padding dan border. Ini adalah praktik terbaik modern.
Contoh border-box:
<style>
.border-box {
width: 200px;
padding: 20px;
border: 5px solid black;
background: #22c55e;
color: white;
box-sizing: border-box;
}
</style>
<div class="border-box">Lebar total = 200px</div>
Dengan box-sizing: border-box, padding dan border sudah termasuk dalam width.
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
Contoh Proyek: Kartu Profil dengan Box Model
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Box Model - Kartu Profil</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
}
/* Kartu Profil - Menerapkan Box Model */
.profile-card {
background: white;
width: 350px;
border-radius: 20px;
text-align: center;
box-shadow: 0 20px 40px rgba(0,0,0,0.2);
/* Box Model properties */
padding: 30px;
margin: 20px;
border: 1px solid rgba(0,0,0,0.05);
}
.avatar {
width: 120px;
height: 120px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 50%;
margin: 0 auto 20px;
display: flex;
align-items: center;
justify-content: center;
font-size: 48px;
color: white;
/* Border pada avatar */
border: 3px solid white;
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
}
h1 {
font-size: 24px;
margin-bottom: 5px;
color: #1e293b;
}
.title {
color: #3b82f6;
font-weight: 500;
margin-bottom: 15px;
}
.bio {
color: #64748b;
line-height: 1.6;
margin-bottom: 20px;
}
.social-links {
display: flex;
justify-content: center;
gap: 15px;
margin-bottom: 25px;
}
.social-link {
display: inline-block;
padding: 8px 16px;
background: #f0f4f8;
border-radius: 20px;
text-decoration: none;
color: #1e293b;
font-size: 14px;
transition: all 0.3s;
/* Border pada sosial link */
border: 1px solid #e2e8f0;
}
.social-link:hover {
background: #3b82f6;
color: white;
border-color: #3b82f6;
transform: translateY(-2px);
}
.contact-btn {
display: inline-block;
background: #3b82f6;
color: white;
padding: 12px 24px;
border-radius: 30px;
text-decoration: none;
font-weight: 500;
transition: all 0.3s;
/* Border pada tombol */
border: none;
cursor: pointer;
}
.contact-btn:hover {
background: #2563eb;
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(59,130,246,0.4);
}
.info-box {
background: #eef2ff;
border-radius: 16px;
padding: 20px;
margin-top: 30px;
text-align: left;
border-left: 4px solid #3b82f6;
}
.info-box h3 {
margin-bottom: 15px;
color: #1e293b;
}
.info-box ul {
margin-left: 20px;
}
.info-box li {
margin-bottom: 8px;
color: #475569;
}
.info-box code {
background: #e2e8f0;
padding: 2px 6px;
border-radius: 4px;
font-family: monospace;
}
hr {
margin: 15px 0;
border: none;
border-top: 1px solid #e2e8f0;
}
</style>
</head>
<body>
<div class="profile-card">
<div class="avatar">
JD
</div>
<h1>John Doe</h1>
<p class="title">Frontend Developer</p>
<p class="bio">
Seorang pengembang web yang antusias dengan teknologi frontend.
Memiliki pengalaman dalam membangun website responsif dan interaktif.
</p>
<div class="social-links">
<a href="#" class="social-link">GitHub</a>
<a href="#" class="social-link">LinkedIn</a>
<a href="#" class="social-link">Twitter</a>
</div>
<a href="#" class="contact-btn">Hubungi Saya</a>
<div class="info-box">
<h3>Box Model Properties yang Digunakan</h3>
<ul>
<li><code>margin: 20px;</code> → jarak kartu dari elemen lain</li>
<li><code>padding: 30px;</code> → jarak konten di dalam kartu ke border</li>
<li><code>border: 1px solid rgba(0,0,0,0.05);</code> → garis tepi kartu</li>
<li><code>width: 350px;</code> → lebar kartu (dengan box-sizing: border-box)</li>
<li><code>border: 3px solid white;</code> → border pada avatar</li>
<li><code>margin: 0 auto;</code> → memusatkan avatar secara horizontal</li>
<li><code>padding: 8px 16px;</code> → padding pada tombol sosial link</li>
</ul>
<hr>
<h3>Perhitungan Box Model</h3>
<ul>
<li>Tanpa <code>box-sizing: border-box</code>: lebar total = width + padding + border</li>
<li>Dengan <code>box-sizing: border-box</code>: lebar total = width (sudah termasuk padding + border)</li>
</ul>
<hr>
<h3>Ringkasan Box Model</h3>
<ul>
<li><strong>Content</strong> → isi elemen (teks, gambar)</li>
<li><strong>Padding</strong> → jarak dalam (kena background)</li>
<li><strong>Border</strong> → garis tepi</li>
<li><strong>Margin</strong> → jarak luar (transparan)</li>
</ul>
</div>
</div>
</body>
</html>
Hasil visual kartu profil:
Tabel Ringkasan Box Model
| Properti | Posisi | Fungsi | Contoh |
|---|---|---|---|
margin |
Luar border | Jarak antar elemen | margin: 20px; |
border |
Antara margin dan padding | Garis tepi | border: 2px solid blue; |
padding |
Dalam border | Jarak konten ke border | padding: 15px; |
width/height |
Content | Ukuran area konten | width: 200px; |
Kesalahan Umum Pemula
- Tertukar margin dan padding → margin untuk jarak luar, padding untuk jarak dalam.
- Lupa bahwa padding dan border menambah lebar total → width 200px + padding 20px = lebar total 240px.
- Lupa menggunakan box-sizing: border-box → Sering menyebabkan layout berantakan.
- Menggunakan margin: auto tanpa menentukan width → Margin auto hanya berfungsi jika elemen memiliki lebar yang ditentukan.
- Margin collapse (margin menyatu) → Margin vertikal antara dua elemen bisa menyatu (yang terbesar yang dipakai).
- Buka Developer Tools (F12) → inspect elemen → lihat Box Model visual di tab Styles (biasanya di bagian bawah)
- Hover ke elemen untuk melihat area margin (kuning), border (abu-abu), padding (hijau), content (biru)
- Gunakan
* { margin: 0; padding: 0; box-sizing: border-box; }untuk reset default browser
Latihan Singkat
- Buat file HTML dengan 3 div, beri margin, padding, dan border yang berbeda
- Buat kotak dengan lebar 300px, padding 20px, border 5px, hitung lebar totalnya
- Buat kotak yang sama dengan box-sizing: border-box, bandingkan lebarnya
- Buat tombol dengan padding 10px 20px, border-radius 30px (efek pil)
- Buat kartu sederhana dengan margin antar kartu 20px, padding dalam kartu 15px, border 1px solid #ddd
Intisari Hari Ini
- Box Model adalah konsep bahwa setiap elemen adalah kotak dengan 4 lapisan
- Margin → jarak luar (transparan, untuk jarak antar elemen)
- Border → garis tepi (bisa diatur warna, ketebalan, gaya)
- Padding → jarak dalam (kena background, untuk jarak konten ke tepi)
- Content → isi elemen (teks, gambar)
- box-sizing: border-box → membuat width/height sudah termasuk padding dan border
- Selalu gunakan reset
* { margin: 0; padding: 0; box-sizing: border-box; }untuk konsistensi
- Grid galeri dengan 6 foto (3x2 atau 2x3)
- Setiap foto memiliki padding 10px di dalam kartu
- Setiap kartu memiliki border 1px solid #ddd dan border-radius 12px
- Jarak antar kartu (margin) 20px
- Container utama memiliki padding 20px
- Gunakan box-sizing: border-box di semua elemen
- Hitung lebar total setiap kartu jika width: 250px, padding: 10px, border: 1px
- Tambahkan kotak penjelasan yang menunjukkan perhitungan box model pada kartu
Selamat mencoba!
Artikel Sebelumnya: CSS Dasar #14 - Menggunakan Google Fonts di CSS (Lanjutan)
Artikel Selanjutnya: CSS Dasar #16 - Margin Collapse dan Negative Margin
