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:
| Deklarasi | Atas | Kanan | Bawah | Kiri |
|---|---|---|---|---|
margin: 10px; | 10 | 10 | 10 | 10 |
margin: 10px 20px; | 10 | 20 | 10 | 20 |
margin: 10px 20px 30px; | 10 | 20 | 30 | 20 |
margin: 10px 20px 30px 40px; | 10 | 20 | 30 | 40 |
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:
| Nilai | Contoh | Catatan |
|---|---|---|
| Panjang | 16px, 1.5rem | Paling umum |
| Persentase | 5% | Dari lebar containing block, untuk keempat sisi |
auto | margin: 0 auto | Browser mengisi sisa ruangnya |
| Negatif | margin-top: -10px | Menarik 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-rootpada elemen induk (berbeda denganoverflow: 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 autopada elemen tanpa lebar. Blok sudah mengisi container-nya, jadi tetapkanwidthataumax-width.margin: autopada elemen inline. Margin auto padaspan,a, atauimgyang dibiarkan inline bernilai 0. Ubah menjadidisplay: block.- Menjumlahkan dua margin vertikal dan mengharapkan totalnya. Keduanya menyatu menjadi yang lebih besar. Pakai
gapdi 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-rootpada 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.