Ilustrasi sampul artikel: Margin Adalah: Pengertian, Fungsi, dan Bedanya dengan Padding di CSS
·CSSDasarTutorial

Margin Adalah: Pengertian, Fungsi, dan Bedanya dengan Padding di CSS

Margin adalah jarak di luar elemen, antara border dan elemen tetangga. Pelajari perbedaan margin dan padding, margin auto untuk centering, margin collapse, dan margin negatif.

Pembuat Hyper Sheets & BelajarWeb.dev

Margin adalah ruang atau jarak di bagian luar sebuah elemen, antara border (tepi) elemen dengan elemen-elemen tetangga di sekitarnya. Kalau padding adalah bantalan di dalam kotak, margin adalah jarak kosong di luar kotak yang mendorong elemen lain menjauh. Dua kata itu, dalam versus luar, adalah inti dari seluruh perbedaan margin dan padding yang bikin banyak pemula bingung.

Kalimat di atas sudah menjawab sebagian besar kebingungan. Tapi sisanya, cara menulis shorthand margin: 10px 20px, kenapa margin: 0 auto bisa menengahkan elemen, kenapa jarak margin-bottom 30px di atas dan margin-top 20px di bawah hasilnya bukan 50px melainkan 30px, justru yang paling sering bikin layout terasa “misterius”. Artikel ini membahas semuanya berurutan, lengkap dengan contoh kode dan playground interaktif yang bisa langsung kamu mainkan.

Margin Adalah… (Pengertian dan Fungsinya di CSS)

Margin adalah properti CSS yang mengatur jarak di luar border sebuah elemen, ruang kosong yang memisahkan elemen itu dari elemen lain di sekitarnya. Karena berada di luar border, area margin selalu transparan: ia tidak pernah ikut terkena warna atau gambar background elemen, dan yang terlihat menembus di area margin adalah background elemen induk (parent). Ciri visual inilah yang paling gampang membedakannya dari padding.

Fungsi utama margin: memberi jarak antar elemen supaya tidak berdempetan, mendorong satu elemen menjauh dari tetangganya, dan menengahkan elemen secara horizontal lewat margin: auto.

Dalam kerangka box model CSS, setiap elemen HTML dirender sebagai kotak berlapis dari dalam ke luar: konten → padding → border → margin. Margin adalah lapisan terluar, tepat setelah border. Kalau konsep kotak berlapis ini masih terasa abstrak, lesson interaktif tentang margin di Hyper Sheets membahasnya dengan editor langsung di browser, kamu ubah nilainya, kotaknya bergeser saat itu juga.

margin
border
padding
contentwidth × height
Model kotak CSS: dari luar ke dalam, margin,border,padding, lalucontent.

Lihat contoh paling sederhana:

<p class="kotak">Paragraf pertama.</p>
<p class="kotak">Paragraf kedua.</p>
.kotak {
  background: #dbeafe;
  border: 2px solid #3b82f6;
  margin-bottom: 24px; /* 24px jarak di LUAR border, ke elemen di bawahnya */
}

Area 24px di bawah setiap paragraf tidak berwarna biru muda, ia transparan, karena margin bukan bagian dari elemen. Yang terjadi hanyalah paragraf kedua terdorong 24px ke bawah, menjauh dari paragraf pertama.

Margin vs Padding: Apa Bedanya?

Perbedaan margin dan padding: margin adalah jarak di luar elemen (antara border dan elemen tetangga), sedangkan padding adalah jarak di dalam elemen (antara konten dan border). Margin murni ruang kosong transparan yang mendorong elemen lain menjauh; padding memperluas “isi” kotak dan ikut terkena background. Keduanya sama-sama menciptakan “jarak”, tapi di sisi yang berlawanan dari border, dan dari situlah semua perbedaan perilakunya berasal.

Analogi yang paling gampang diingat: bayangkan kamu mengirim gelas keramik dalam kardus.

  • Padding = busa di dalam kardus. Ia mencegah gelas (konten) menyentuh dinding kardus (border). Makin tebal busanya, makin besar kardusnya.
  • Margin = jarak antar kardus di dalam mobil pengiriman. Ia mencegah kardus-kardus saling berbenturan. Jarak ini bukan bagian dari kardus mana pun; ia cuma ruang kosong di antaranya.

Sekarang versi tekniknya dalam tabel:

Aspek Margin Padding
Posisi Di luar elemen, antara border dan elemen lain Di dalam elemen, antara konten dan border
Background Selalu transparan, memperlihatkan background parent Ikut terkena warna/gambar background elemen
Ukuran elemen Tidak menambah ukuran elemen, hanya menggeser posisinya Menambah ukuran total elemen (kecuali pakai border-box)
Nilai negatif Boleh, sering dipakai untuk menarik elemen mendekat Tidak boleh, nilai negatif dianggap tidak valid
Nilai auto Berlaku, margin: auto klasik untuk centering Tidak berlaku
Margin collapse Bisa terjadi (margin vertikal antar elemen block “melebur”) Tidak pernah terjadi
Area klik/tap Tidak, area klik berhenti di border Ikut memperluas area yang bisa diklik

Contoh visual perbedaannya:

.kotak-a {
  background: #fef3c7;
  margin: 24px;    /* area kuning tetap, seluruh kotak menjauh dari tetangga */
}
.kotak-b {
  background: #fef3c7;
  padding: 24px;   /* area kuning membesar, konten menjauh dari tepi */
}

Pada .kotak-a, area kuning tidak berubah sedikit pun, yang berubah hanya posisinya, terdorong 24px menjauh dari elemen di sekitarnya. Pada .kotak-b, area kuning ikut melebar 24px ke segala arah karena padding bagian dari elemen. Kalau kamu ingin mendalami pasangan margin ini, ada artikel khusus tentang padding yang membedah ruang internal elemen secara tuntas.

Cara Menulis Margin: Sintaks Lengkap dari 1 sampai 4 Nilai

Margin bisa ditulis dua cara: properti per sisi (margin-top, margin-right, margin-bottom, margin-left) atau shorthand margin dengan 1 sampai 4 nilai sekaligus. Urutan shorthand-nya selalu searah jarum jam mulai dari atas: atas → kanan → bawah → kiri. Hafalkan urutan ini sekali, dan kamu tidak akan pernah bingung lagi membaca kode CSS orang lain.

Properti Per Sisi

Empat properti terpisah, masing-masing mengatur satu sisi:

.card {
  margin-top: 16px;
  margin-right: 24px;
  margin-bottom: 16px;
  margin-left: 24px;
}

Cara ini paling eksplisit dan berguna kalau kamu hanya ingin mengubah satu sisi tanpa menyentuh sisi lain, misalnya menambah margin-top saja pada judul supaya berjarak dari elemen di atasnya.

Shorthand: 1, 2, 3, dan 4 Nilai

Empat baris di atas bisa diringkas jadi satu baris. Aturannya berdasarkan jumlah nilai:

/* 1 nilai: semua sisi sama */
.a { margin: 16px; }
/* atas=16, kanan=16, bawah=16, kiri=16 */

/* 2 nilai: [atas-bawah] [kiri-kanan] */
.b { margin: 10px 20px; }
/* atas=10, kanan=20, bawah=10, kiri=20 */

/* 3 nilai: [atas] [kiri-kanan] [bawah] */
.c { margin: 8px 16px 24px; }
/* atas=8, kanan=16, bawah=24, kiri=16 */

/* 4 nilai: [atas] [kanan] [bawah] [kiri], searah jarum jam */
.d { margin: 4px 8px 12px 16px; }
/* atas=4, kanan=8, bawah=12, kiri=16 */

Cara paling gampang merasakan efek keempat sisi ini adalah dengan menggesernya sendiri. Perhatikan bagaimana box terdorong menjauh dari tepi container (garis putus-putus) begitu nilai margin naik, ini kebalikan persis dari padding yang justru menggemukkan isi kotaknya:

Coba Sendiri

24px
24px
24px
24px

Garis putus-putus = tepi container (parent)

boxmargin mendorongku dari tepi container
box tetangga (terdorong oleh margin-bottom di atas)
margin: 24px;

Perhatikan satu hal penting di playground itu: area yang tercipta oleh margin transparan, ia memperlihatkan background container, bukan background box. Itulah tanda paling jelas bahwa yang kamu geser adalah ruang luar, bukan ruang dalam.

margin: auto untuk Centering Horizontal

margin: auto menyuruh browser membagi ruang kosong yang tersisa secara otomatis, dan resep klasik margin: 0 auto memakainya untuk menengahkan elemen block secara horizontal. Nilai auto di sisi kiri dan kanan berarti “ambil semua sisa ruang dan bagi rata”, sehingga elemen terdorong tepat ke tengah container-nya.

.container {
  width: 600px;
  margin: 0 auto;   /* atas-bawah 0, kiri-kanan otomatis rata → di tengah */
}

Syarat mutlaknya cuma satu, dan justru ini yang paling sering terlewat: elemen harus punya width yang lebih kecil dari container-nya. Elemen block secara default punya lebar 100% (memenuhi seluruh container), sehingga tidak ada “sisa ruang” untuk dibagi, margin: auto pun tidak melakukan apa-apa. Beri lebar dulu, baru auto punya sesuatu untuk dikerjakan. Hubungan antara width dan perilaku block ini kami bahas lebih dalam di artikel width dan height adalah.

Perlu dicatat: margin: auto hanya bekerja untuk centering horizontal pada elemen block biasa. Untuk menengahkan secara vertikal, auto tidak berlaku di aliran normal, di situ kamu butuh Flexbox atau Grid. Salah satu keunggulan Flexbox justru margin: auto yang lebih fleksibel (bisa vertikal), dan itu kami bahas terpisah di panduan Flexbox.

Margin Collapse: Perilaku Paling Membingungkan dari Margin

Margin collapse (peleburan margin) adalah perilaku di mana dua margin vertikal yang bertemu tidak dijumlahkan, melainkan “melebur” menjadi satu, dan hanya nilai terbesar yang dipakai. Inilah alasan kenapa dua elemen dengan margin-bottom: 30px dan margin-top: 20px di antaranya menghasilkan jarak 30px, bukan 50px. Perilaku ini khas margin dan tidak pernah terjadi pada padding.

.paragraf-atas {
  margin-bottom: 30px;
}
.paragraf-bawah {
  margin-top: 20px;
}
/* Jarak nyata di antara keduanya: 30px (nilai terbesar), BUKAN 50px */

Kenapa CSS dirancang begitu? Supaya jarak antar paragraf tetap konsisten. Bayangkan kalau setiap paragraf punya margin-top dan margin-bottom masing-masing lalu semuanya dijumlahkan, jarak antar paragraf akan jadi dua kali lipat jarak dari paragraf pertama ke tepi atas. Dengan collapse, ritme vertikal teks tetap seragam.

Tiga hal penting yang wajib kamu ingat soal margin collapse:

  • Hanya terjadi pada margin vertikal (atas dan bawah). Margin horizontal (kiri dan kanan) tidak pernah melebur, mereka selalu dijumlahkan.
  • Hanya antar elemen block dalam aliran normal. Elemen inline, flex item, dan grid item tidak mengalami collapse.
  • Yang menang adalah nilai terbesar, bukan penjumlahan. 30px bertemu 20px30px.

Collapse juga bisa terjadi antara elemen induk dan anak (parent-child): kalau elemen induk tidak punya padding atau border di atas, margin-top anak pertamanya bisa “menembus” keluar dan melebur dengan margin induk. Ini penyebab umum bug “kenapa ada jarak aneh di atas container padahal saya tidak menaruh margin di sana”. Solusi cepatnya: beri padding kecil, border, atau overflow: hidden pada induk.

Margin Negatif: Sah dan Sering Berguna

Berbeda dengan padding, margin boleh bernilai negatif, dan ini teknik yang sah untuk menarik elemen mendekat, menumpuk elemen, atau menembus batas container. Margin negatif tidak “menghapus” ruang; ia menggeser elemen ke arah berlawanan dari margin positif, sering sampai tumpang tindih dengan tetangganya.

.avatar-tumpuk {
  margin-left: -12px;   /* valid: setiap avatar menumpuk 12px ke kiri */
}
.banner-lebar {
  margin: 0 -24px;      /* menembus keluar padding container 24px di kiri-kanan */
}

Contoh paling umum: deretan avatar yang saling menumpuk seperti di aplikasi chat, atau gambar banner yang sengaja dibuat lebih lebar dari container-nya dengan margin negatif kiri-kanan. Keduanya mustahil dilakukan dengan padding.

gap: Alternatif Modern untuk Jarak Antar Elemen

Di layout Flexbox dan Grid modern, gap sering jadi pilihan yang lebih bersih daripada margin untuk mengatur jarak antar item, karena ia hanya memberi ruang di antara item, tanpa menyisakan margin di tepi container. Dengan margin, kamu sering harus menghapus margin item terakhir (:last-child) supaya tidak ada jarak berlebih di ujung. Dengan gap, masalah itu hilang total.

/* Cara klasik: margin, dengan margin sisa yang harus dinolkan */
.card + .card {
  margin-top: 16px;
}

/* Cara modern: gap pada container flex */
.daftar-card {
  display: flex;
  flex-direction: column;
  gap: 16px;  /* jarak antar card, tanpa margin sisa di tepi */
}

gap juga kebal dari margin collapse, nilainya selalu persis seperti yang kamu tulis, tidak pernah melebur. Untuk jarak antar item dalam sebuah list, grid kartu, atau baris tombol, gap hampir selalu pilihan yang lebih mudah dirawat. Margin tetap relevan untuk kasus di luar container flex/grid, seperti jarak antar paragraf teks atau menengahkan dengan margin: auto.

Kesalahan Umum Saat Menggunakan Margin

Kesalahan margin yang paling sering terjadi bukan soal sintaks, melainkan salah memperkirakan perilakunya: kaget dengan margin collapse, memakai margin untuk jarak yang seharusnya padding, dan mengharap margin: auto bekerja tanpa width. Berikut daftarnya.

1. Mengira Margin Vertikal Selalu Dijumlahkan

margin-bottom: 30px di atas dan margin-top: 20px di bawah menghasilkan 30px, bukan 50px. Kalau jarakmu terasa “kurang”, ingat margin collapse, kedua margin melebur dan hanya yang terbesar dipakai. Untuk jarak yang pasti dijumlahkan, taruh margin hanya di satu sisi, atau pakai gap.

2. margin: auto Tanpa width

margin: 0 auto tidak menengahkan apa-apa kalau elemennya belum diberi width lebih kecil dari container. Elemen block default sudah selebar penuh, jadi tidak ada ruang sisa untuk dibagi. Beri width dulu.

3. Memakai Margin untuk Memperbesar Area Klik Tombol

Margin ada di luar border, jadi tidak ikut bisa diklik. Tombol kecil yang susah dipencet di HP tidak tertolong oleh margin, yang memperluas area klik adalah padding. Jarak antar tombol pakai margin atau gap; ruang di dalam tombol pakai padding.

4. Jarak Aneh di Atas Container

Kalau ada jarak yang tidak kamu minta di atas sebuah container, kemungkinan margin-top anak pertamanya menembus keluar dan melebur dengan margin container (parent-child collapse). Beri padding-top kecil, border, atau overflow: hidden pada container untuk mencegahnya.

5. Lupa Menolkan Margin Item Terakhir

Kalau kamu memberi margin-bottom pada setiap item dalam list, item terakhir menyisakan margin berlebih di bawahnya. Solusinya: pakai gap pada container flex/grid, atau nolkan dengan :last-child { margin-bottom: 0; }.

Cek Pemahaman

Dua elemen block bertumpuk vertikal: elemen atas punya `margin-bottom: 30px`, elemen bawah punya `margin-top: 20px`. Berapa jarak nyata di antara keduanya?

FAQ Seputar Margin

Margin adalah apa?

Margin adalah jarak di bagian luar sebuah elemen, ruang kosong transparan antara border (tepi) elemen dengan elemen-elemen tetangga di sekitarnya. Margin tidak ikut terkena background elemen dan tidak menambah ukuran elemen; ia hanya menggeser posisinya dan mendorong elemen lain menjauh.

Apa bedanya margin dan padding?

Margin adalah jarak di luar elemen (antara border dan elemen lain), padding adalah jarak di dalam elemen (antara konten dan border). Margin selalu transparan dan tidak menambah ukuran elemen; padding ikut kena background dan memperbesar ukuran elemen. Analogi: margin itu jarak antar kardus, padding itu busa di dalam kardus.

margin auto itu apa?

margin: auto menyuruh browser membagi ruang kosong yang tersisa secara otomatis. Resep klasik margin: 0 auto memakainya untuk menengahkan elemen block secara horizontal, dengan syarat elemen itu sudah punya width lebih kecil dari container-nya. Tanpa width, tidak ada ruang sisa untuk dibagi, sehingga centering-nya tidak terjadi.

Kenapa margin atas dan bawah tidak dijumlahkan?

Karena margin collapse: ketika margin vertikal dua elemen block bertemu, mereka “melebur” menjadi satu dan hanya nilai terbesar yang dipakai, bukan dijumlahkan. Jadi margin-bottom: 30px bertemu margin-top: 20px menghasilkan 30px. Ini menjaga jarak antar paragraf tetap konsisten. Collapse hanya terjadi pada margin vertikal antar elemen block, tidak pada margin horizontal maupun pada padding.

Apakah margin boleh bernilai negatif?

Boleh. Berbeda dengan padding, margin menerima nilai negatif dan ini teknik yang sah, sering dipakai untuk menarik elemen mendekat, menumpuk avatar, atau membuat elemen menembus keluar dari padding container-nya. Margin negatif menggeser elemen ke arah berlawanan dari margin positif.

Kapan pakai margin dan kapan pakai gap?

Pakai gap untuk jarak antar item di dalam container Flexbox atau Grid, ia lebih bersih karena tidak menyisakan margin di tepi dan kebal margin collapse. Pakai margin untuk kasus di luar container flex/grid, seperti jarak antar paragraf teks, atau untuk menengahkan elemen dengan margin: auto.

Langkah Selanjutnya

Sekarang kamu sudah pegang gambaran utuhnya: margin adalah jarak di luar elemen, shorthand-nya searah jarum jam dari atas, margin: 0 auto menengahkan asal ada width, margin vertikal antar block bisa melebur (collapse), dan margin negatif itu sah. Yang membedakan orang yang “tahu margin” dan yang “jago layout” tinggal satu: kebiasaan memilih alat yang tepat, margin dan gap untuk ruang antar elemen, padding untuk ruang internal, tanpa perlu mikir lagi.

Cara tercepat membentuk kebiasaan itu adalah latihan langsung. Mulai dari lesson margin untuk memantapkan dasar dan margin collapse, lalu mainkan nilai-nilainya sepuasnya di playground box model. Setelah kotak-kotakmu rapi, gerbang berikutnya adalah mengatur posisi mereka, dan di situlah panduan Flexbox kami menunggumu. Selamat ngoding!