Saya mencoba menambahkan nilai margin pada div di dalam div lain. Semua berfungsi dengan baik kecuali nilai tertinggi, tampaknya diabaikan. Tapi kenapa?
Apa yang saya harapkan:
Apa yang saya dapatkan:
Kode:
#outer {
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto 0 auto;
display: block;
}
#inner {
background: #FFCC33;
margin: 50px 50px 50px 50px;
padding: 10px;
display: block;
}
<div id="outer">
<div id="inner">
Hello world!
</div>
</div>
W3Schools tidak memiliki penjelasan mengapa margin berperilaku seperti ini.
float:left;
ini berfungsi ... tapi mengapa ini diperlukan. Saya tidak ingin itu melayang. Dan mengapa margin untuk kiri / kanan berfungsi?Jawaban:
Anda sebenarnya melihat margin atas
#inner
elemen runtuh ke tepi atas#outer
elemen, hanya menyisakan#outer
margin yang utuh (meskipun tidak ditampilkan dalam gambar Anda). Tepi atas kedua kotak rata terhadap satu sama lain karena marginnya sama.Berikut adalah poin yang relevan dari spesifikasi W3C:
Anda dapat melakukan salah satu dari yang berikut ini untuk mencegah margin dari runtuh:
Alasan opsi di atas mencegah margin dari runtuh adalah karena:
Margin kiri dan kanan berperilaku seperti yang Anda harapkan karena:
sumber
Coba gunakan
display: inline-block;
pada inner div.sumber
display:inline-block;
. Juga diatur kembali ketika menggunakandisplay:inline-block;
adalah bahwa Anda kehilangan lebar 100% pada div.display:inline-block
bekerja untukku. Terima kasih banyak.Apa yang @BoltClock sebutkan cukup solid. Dan Di sini saya hanya ingin menambahkan beberapa solusi untuk masalah ini. periksa margin w3c_collapsing ini . Bagian hijau adalah pemikiran potensial bagaimana masalah ini dapat diselesaikan.
Solusi 1
itu berarti saya dapat menambahkan
float:left
ke salah satu#outer
atau#inner
demo1 .juga pemberitahuan yang
float
akan membatalkanauto
margin.Solusi 2
selain
visible
, mari dimasukkanoverflow: hidden
ke dalam#outer
. Dan cara ini tampaknya cukup sederhana dan layak. Saya suka itu.Solusi 3
atau
dua metode ini akan mematahkan aliran normal
div
Solusi 4
sama dengan @enderskill
Solusi 5
Ini tidak banyak berhubungan dengan pertanyaan karena itu adalah jatuhnya margin antara saudara kandung. itu umumnya berarti jika kotak atas memiliki
margin-bottom: 30px
dan kotak saudaramargin-top: 10px
. Margin total di antara mereka30px
bukan40px
.Solusi 6
Ini sangat menarik dan saya bisa menambahkan satu garis batas atas
Dan juga
<div>
adalah blok-level secara default, jadi Anda tidak perlu mendeklarasikannya dengan sengaja. Maaf karena tidak dapat memposting lebih dari 2 tautan dan gambar karena reputasi pemula saya. Setidaknya Anda tahu dari mana masalahnya berasal saat Anda melihat sesuatu yang serupa.sumber
Tidak yakin mengapa apa yang Anda miliki tidak berfungsi, tetapi Anda dapat menambahkan
overflow: auto;
ke div luar.
sumber
Jika Anda menambahkan bantalan apa pun
#outer
, itu berfungsi.Demo
sumber
Tidak begitu yakin mengapa, tetapi mengubah CSS bagian dalam menjadi
tampaknya berhasil;
sumber
Tidak menjawab "mengapa" (harus berupa sesuatu dengan margin yang runtuh), tetapi sepertinya cara termudah / paling logis untuk melakukan apa yang Anda coba lakukan adalah dengan hanya menambah
padding-top
div luar :http://jsfiddle.net/hpU5d/1/
Catatan kecil - seharusnya tidak perlu mengatur div
display:block;
kecuali jika ada sesuatu yang lain dalam kode Anda mengatakan itu tidak boleh diblokir.sumber
coba ini:
http://jsfiddle.net/7AXTf/
Semoga berhasil
sumber
Saya kira pengaturan properti posisi dari div internal ke relatif juga dapat membantu mencapai efek. Tapi bagaimanapun saya mencoba kode asli yang disisipkan di Pertanyaan pada IE9 dan Google Chrome terbaru dan mereka sudah memberikan efek yang diinginkan tanpa modifikasi.
sumber
Gunakan
padding-top:50px
untuk div luar. Sesuatu seperti ini:Catatan: bantalan akan menambah ukuran div Anda. Dalam hal ini jika ukuran div Anda penting, maksud saya jika itu harus memiliki ketinggian tertentu. kurangi ketinggian hingga 50px .:
sumber
Sudahkah Anda mencoba! Penting sebelumnya, itu akan memaksa segalanya:
sumber
Hanya untuk perbaikan cepat, cobalah membungkus elemen anak Anda menjadi
div
elemen seperti ini -Margin of
inner
div tidak akan runtuh karena padding1px
di-antaraouter
daninner
div. Jadi secara logis Anda akan memiliki1px
ruang tambahan bersama dengan margininner
div yang ada.sumber