Saya memiliki div
( orang tua ) yang berisi div
( anak ) lain. Induk adalah elemen pertama body
tanpa gaya CSS tertentu. Ketika saya mengatur
.child
{
margin-top: 10px;
}
Hasil akhirnya adalah bahwa bagian atas anak saya masih sejajar dengan orang tua. Alih-alih digeser anak untuk 10px ke bawah, orang tua saya bergerak 10px ke bawah.
Saya DOCTYPE
diatur ke XHTML Transitional
.
Apa yang kulewatkan di sini?
sunting 1
Orang tua saya perlu memiliki dimensi yang ditentukan secara ketat karena memiliki latar belakang yang harus ditampilkan di bawahnya dari atas ke bawah (pixel perfect). Jadi pengaturan margin vertikal di atasnya adalah jalan .
sunting 2
Perilaku ini sama pada FF, IE dan juga CR.
Jawaban:
Menemukan alternatif di elemen Anak dengan margin dalam DIVs Anda juga dapat menambahkan:
atau:
Ini mencegah margin untuk runtuh . Perbatasan dan bantalan melakukan hal yang sama. Karenanya, Anda juga dapat menggunakan yang berikut untuk mencegah keruntuhan margin atas:
Perbarui dengan permintaan populer: Inti dari margin yang runtuh adalah menangani konten tekstual. Sebagai contoh:
Karena browser menciutkan margin, teks akan muncul seperti yang Anda harapkan, dan
<div>
tag pembungkus tidak memengaruhi margin. Setiap elemen memastikan ada spasi di sekitarnya, tetapi spasi tidak akan digandakan. Margin<h2>
dan<p>
tidak akan menjumlahkan, tetapi geser satu sama lain (mereka runtuh). Hal yang sama terjadi pada elemen<p>
dan<ul>
.Sayangnya, dengan desain modern, ide ini dapat menggigit Anda ketika Anda secara eksplisit menginginkan sebuah wadah. Ini disebut konteks pemformatan blok baru di CSS. The
overflow
atau marjin trik akan memberikan itu.sumber
<h2>
,<p>
,<ul>
akan tidak mendapatkan celah aneh atau "double" margin dengan cara ini.margin: 5px 10px;
id berharap 2 divs 5 px dari atas dan 20px di antara mereka tidak 5 px dari atas dan 10px di antara mereka. jika saya ingin 10 px di antara mereka id telah ditentukanmargin: 5px 5px;
. sejujurnya saya berharap ada aturan root yang bisa saya tempatkan yang akan menghentikan semua margin runtuh. Saya benci bahwa saya harus menggandakan ukuran margin di atas kertas untuk membuat mereka benar-benar melakukan apa yang saya inginkan di layar. dan hal utama ini ... benar-benar bencanaIni adalah perilaku normal (setidaknya di antara implementasi browser). Margin tidak mempengaruhi posisi anak dalam kaitannya dengan induknya, kecuali jika induknya memiliki padding, dalam hal ini sebagian besar browser kemudian akan menambahkan margin anak ke padding orangtua.
Untuk mendapatkan perilaku yang Anda inginkan, Anda perlu:
sumber
.parent {border: solid 1px;}
Meskipun semua jawaban memperbaiki masalah tetapi mereka datang dengan trade-off / penyesuaian / kompromi seperti
floats
, Anda harus mengapung elemenborder-top
, Ini mendorong induk setidaknya 1px ke bawah yang kemudian harus disesuaikan dengan memperkenalkan-1px
margin ke elemen induk itu sendiri. Ini dapat membuat masalah ketika orang tua sudah memilikimargin-top
unit relatif.padding-top
, efek yang sama seperti menggunakanborder-top
overflow: hidden
, Tidak dapat digunakan ketika orang tua harus menampilkan konten yang meluap, seperti menu drop downoverflow: auto
, Memperkenalkan bilah gulir untuk elemen induk yang (secara sengaja) meluap konten (seperti bayangan atau segitiga ujung pahat)Masalah ini dapat diatasi dengan menggunakan elemen pseudo CSS3 sebagai berikut
https://jsfiddle.net/hLgbyax5/1/
sumber
margin-top: -1px
tampaknya tidak perlu. Tapi saya suka ini.margin-top: -1px
danheight: 0
tampaknya tidak perlu. Diuji di Chrome. Tapi solusi terbaik..parent:after...
tambahkan gaya
display:inline-block
ke elemen anaksumber
elemen induk tidak boleh kosong setidaknya diletakkan
sebelum elemen anak.sumber
Inilah yang bekerja untuk saya
http://jsfiddle.net/97fzwuxh/
sumber
Saya menemukan itu, di dalam .css Anda> jika Anda mengatur properti tampilan elemen div ke inline-block itu memperbaiki masalah. dan margin akan berfungsi seperti yang diharapkan.
sumber
Solusi khusus CSS yang rapi
Gunakan kode berikut untuk menambahkan anak pertama tanpa konten ke div bergerak yang tidak disengaja:
Keuntungan dari metode ini adalah Anda tidak perlu mengubah CSS elemen apa pun yang ada, dan karena itu memiliki dampak minimal pada desain. Di sebelah ini, elemen yang ditambahkan adalah elemen pseudo, yang tidak ada di pohon DOM.
Dukungan untuk elemen semu tersebar luas: Firefox 3+, Safari 3+, Chrome 3+, Opera 10+, dan IE 8+. Ini akan berfungsi di browser modern apa pun (hati-hati dengan yang lebih baru
::before
, yang tidak didukung di IE8).Konteks
Jika anak pertama dari suatu elemen memiliki
margin-top
, orang tua akan menyesuaikan posisinya sebagai cara meruntuhkan margin yang berlebihan. Mengapa? Seperti itu saja.Diberikan masalah berikut:
Anda dapat memperbaikinya dengan menambahkan anak dengan konten, seperti ruang sederhana. Tapi kita semua benci menambahkan ruang untuk apa yang hanya masalah desain. Karena itu, gunakan
white-space
properti untuk konten palsu.Di mana
position: relative;
memastikan posisi perbaikan yang benar. Danwhite-space: pre;
membuat Anda tidak perlu menambahkan konten apa pun - seperti ruang kosong - untuk memperbaikinya. Danheight: 0px;width: 0px;overflow: hidden;
pastikan Anda tidak akan pernah melihat perbaikannya.Anda mungkin perlu menambah
line-height: 0px;
ataumax-height: 0px;
memastikan ketinggian sebenarnya nol di browser IE kuno (saya tidak yakin). Dan opsional Anda bisa menambahkannya<!--dummy-->
di browser IE lama, jika tidak berfungsi.Singkatnya, Anda dapat melakukan semua ini hanya dengan CSS (yang menghilangkan kebutuhan untuk menambahkan anak yang sebenarnya ke pohon HTML DOM):
sumber
overflow: hidden;
untuk orang tua.Untuk mencegah "Div parent" gunakan margin "div child":
Pada parent gunakan css ini:
sumber
The
margin
unsur yang terkandung dalam.child
runtuh.Dalam contoh ini,
p
menerimamargin
dari gaya default browser. Default browserfont-size
biasanya 16px. Dengan memilikimargin-top
lebih dari 16px pada#child
Anda mulai memperhatikan posisi itu bergerak.sumber
Saya punya masalah ini juga tetapi lebih suka untuk mencegah hacks margin negatif, jadi saya meletakkan
<div class="supercontainer"></div>
di sekelilingnya semua yang memiliki bantalan bukan margin. Tentu saja ini berarti lebih banyak divitis tetapi mungkin cara paling bersih untuk menyelesaikannya dengan benar.
sumber
Menariknya solusi favorit saya untuk masalah ini belum disebutkan di sini: menggunakan pelampung.
html:
css:
lihat di sini: http://codepen.io/anon/pen/Iphol
Perhatikan bahwa jika Anda memerlukan tinggi dinamis pada induk, ia juga harus mengambang, jadi cukup ganti
height:100px;
denganfloat:left;
sumber
Solusi alternatif yang saya temukan sebelum saya tahu jawaban yang benar adalah menambahkan perbatasan transparan ke elemen induk.
Kotak Anda akan menggunakan piksel tambahan ...
sumber
Menggunakan
top
alih-alihmargin-top
adalah solusi lain yang mungkin, jika perlu.sumber