Menu

CSS Margin: Shorthand, margin auto dan Margin Collapsing

Margin adalah ruang transparan di luar border sebuah elemen yang mendorong elemen lain menjauh. Pelajari shorthand margin, menengahkan dengan margin: 0 auto, margin negatif, margin auto di flexbox, dan kenapa margin vertikal bisa menyatu.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Apa itu margin

Margin adalah ruang di luar border sebuah elemen. Margin selalu transparan, dan tugasnya adalah mendorong elemen lain menjauh. Di contoh ini, container abu-abu terlihat menembus margin di sekitar kotak biru:

Pita abu-abu itu bukan bagian dari kotak: background kotak itu sendiri berhenti di border-nya. Untuk ruang yang ikut memakai background elemen, pakai padding.

Shorthand margin

margin menerima satu sampai empat nilai, dengan urutan searah jarum jam yang sama seperti padding:

DeklarasiAtasKananBawahKiri
margin: 10px;10101010
margin: 10px 20px;10201020
margin: 10px 20px 30px;10203020
margin: 10px 20px 30px 40px;10203040

Setiap sisi juga punya property sendiri (margin-top, margin-right, margin-bottom, margin-left) dan versi logis yang mengikuti arah teks (margin-inline-start, margin-inline-end, margin-block, margin-inline).

Berbeda dengan padding, margin menerima auto dan nilai negatif:

NilaiContohCatatan
Panjang16px, 1.5remPaling umum
Persentase5%Dari lebar containing block, untuk keempat sisi
automargin: 0 autoBrowser mengisi sisa ruangnya
Negatifmargin-top: -10pxMenarik elemen atau tetangganya lebih dekat, bisa tumpang tindih

Menengahkan dengan margin: 0 auto

margin: 0 auto adalah cara klasik untuk menengahkan blok secara horizontal. auto di kedua sisi menyuruh browser membagi sisa ruang sama rata. Elemennya butuh lebar yang lebih kecil dari container, kalau tidak, tidak ada sisa ruang yang bisa dibagi:

Margin auto tidak menengahkan secara vertikal di normal flow (margin auto vertikal menjadi 0) dan tidak berpengaruh pada elemen inline. Untuk gambaran lengkap tentang cara menengahkan, lihat cara center a div.

Margin collapsing

Saat dua margin vertikal bersentuhan, keduanya tidak dijumlahkan. Browser hanya menyimpan yang lebih besar. Di sini kotak pertama punya margin-bottom: 30px dan kotak kedua margin-top: 20px, dan jarak di antara keduanya 30px, bukan 50px:

Collapsing ini disengaja: paragraf dan judul bisa membawa jaraknya masing-masing tanpa jarak itu menjadi ganda di tempat mereka bertemu. Yang sering mengejutkan adalah kasus kedua, saat margin atas sebuah child lolos keluar dari elemen induknya:

Di elemen induk pertama, margin 30px milik child menyatu melewati tepi atas induknya, jadi margin itu mendorong seluruh elemen induk ke bawah, bukan membuat ruang abu-abu di dalamnya. Salah satu cara berikut bisa mencegahnya:

  • display: flow-root pada elemen induk (berbeda dengan overflow: hidden, cara ini tidak memotong apa pun).
  • Padding atau border di tepi atas elemen induk.
  • Elemen induk flex atau grid: margin item flex dan grid tidak pernah menyatu.

Margin horizontal tidak pernah menyatu, begitu juga margin elemen yang memakai float atau diposisikan secara absolute.

Margin negatif

Margin negatif menarik ke arah yang berlawanan. Di sisi atas atau sisi awal, margin ini memindahkan elemen itu sendiri. Di sisi bawah atau sisi akhir, margin ini menarik elemen berikutnya lebih dekat. Kotak-kotaknya bisa saling tumpang tindih:

margin auto di flexbox

Di dalam container flex, margin auto mengambil semua ruang kosong di sisinya. Ini cara paling sederhana untuk mendorong satu item ke ujung terjauh sebuah baris, dan di flexbox auto juga berfungsi secara vertikal:

margin-inline-start: auto menaruh ruang kosong sebelum "Log in", di ujung baris, baik di halaman kiri ke kanan maupun kanan ke kiri.

Kesalahan yang sering terjadi

  • margin: 0 auto pada elemen tanpa lebar. Blok sudah mengisi container-nya, jadi tetapkan width atau max-width.
  • margin: auto pada elemen inline. Margin auto pada span, a, atau img yang dibiarkan inline bernilai 0. Ubah menjadi display: block.
  • Menjumlahkan dua margin vertikal dan mengharapkan totalnya. Keduanya menyatu menjadi yang lebih besar. Pakai gap di flex atau grid, atau konsisten memakai margin satu arah saja.
  • Margin child mendorong elemen induknya. Itu collapsing antara induk dan child, jadi tambahkan display: flow-root pada elemen induk.
  • Memakai margin untuk ruang yang seharusnya punya background. Margin itu transparan, jadi pakai padding.

Pertanyaan yang sering diajukan

Apa itu margin di CSS?

Margin adalah ruang di luar border sebuah elemen. Margin itu transparan dan mendorong elemen di sekitarnya menjauh. Margin diatur dengan margin atau property per sisi margin-top, margin-right, margin-bottom, dan margin-left.

Apa fungsi margin: 0 auto?

Deklarasi ini mengatur margin atas dan bawah menjadi 0, lalu membagi sisa ruang horizontal sama rata ke margin kiri dan kanan, sehingga elemen blok berada di tengah secara horizontal. Elemennya butuh lebar yang lebih kecil dari container-nya, misalnya max-width: 600px.

Kenapa margin auto tidak membuat elemenku berada di tengah?

Biasanya karena elemennya tidak punya lebar (blok mengisi container-nya, jadi tidak ada ruang yang bisa dibagi), atau karena elemennya inline (span, a, img secara default), di mana margin auto bernilai 0. Beri elemen itu lebar dan display: block, atau tengahkan dari elemen induk dengan flexbox atau grid.

Apa itu margin collapsing?

Saat dua margin vertikal bertemu, misalnya margin bawah satu paragraf dan margin atas paragraf berikutnya, browser hanya memakai yang lebih besar, bukan menjumlahkannya. Ini hanya terjadi pada margin vertikal kotak blok di normal flow, tidak di layout flex atau grid.

Apakah margin bisa bernilai negatif?

Bisa. Margin negatif menarik elemen ke sisi tersebut, atau menarik elemen berikutnya ke atasnya, sehingga kotak bisa saling tumpang tindih. Ini berguna untuk perbaikan perataan kecil dan untuk membuat elemen keluar dari padding container-nya.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai