Mam div
( rodzica ), który zawiera inny div
( dziecko ). Parent jest pierwszym elementem body
bez określonego stylu CSS. Kiedy ustawię
.child
{
margin-top: 10px;
}
Rezultat końcowy jest taki, że góra mojego dziecka jest nadal wyrównana z rodzicem. Zamiast przesunięcia dziecka o 10 pikseli w dół, mój rodzic przesuwa się o 10 pikseli w dół.
Mój DOCTYPE
jest ustawiony na XHTML Transitional
.
Czego tu brakuje?
edytuj 1
Mój rodzic musi mieć ściśle określone wymiary, ponieważ ma pod nim tło, które musi być wyświetlane od góry do dołu (idealnie w pikselach). Tak marginesy pionowe ustawienie na nim to nie idź .
edytuj 2
To zachowanie jest takie samo w FF, IE, jak i CR.
Odpowiedzi:
Znalazłem alternatywę w elementach potomnych z marginesami w DIV. Możesz także dodać:
lub:
Zapobiega to marginesy załamania . Obramowanie i wypełnienie to samo. W związku z tym można również użyć następujących elementów, aby zapobiec zwinięciu górnej krawędzi:
Aktualizuj według popularnego żądania: Cały punkt zwijania marginesów to obsługa treści tekstowych. Na przykład:
Ponieważ przeglądarka zwija marginesy, tekst będzie wyglądał tak, jak można się spodziewać, a
<div>
tagi opakowania nie wpływają na marginesy. Każdy element zapewnia odstępy wokół niego, ale odstępy nie zostaną podwojone. Marginesy<h2>
i<p>
nie będą się sumować, ale wślizgną się w siebie (zwiną się). To samo dzieje się z elementem<p>
i<ul>
.Niestety, dzięki nowoczesnym wzorom ten pomysł może cię ugryźć, gdy wyraźnie potrzebujesz pojemnika. Nazywa się to nowym kontekstem formatowania bloku w mowie CSS.
overflow
Lub margines trik daje to.źródło
<h2>
,<p>
,<ul>
nie dostaniesz dziwne braki lub marginesy „double” w ten sposób.margin: 5px 10px;
id, spodziewaj się 2 div 5 pikseli od góry i 20 pikseli między nimi, a nie 5 pikseli od góry i 10 pikseli między nimi. gdybym chciał między nimi 10 pikseli, podałemmargin: 5px 5px;
. Szczerze, żałuję, że nie istniała podstawowa zasada, która powstrzymałaby wszystkie marże. Nienawidzę tego, że muszę podwoić rozmiar marginesów na papierze, aby faktycznie zrobili to, co do cholery chcę na ekranie. i ta najważniejsza rzecz ... co za katastrofaJest to normalne zachowanie (przynajmniej wśród implementacji przeglądarki). Margines nie wpływa na pozycję dziecka w stosunku do jego rodzica, chyba że rodzic ma wypełnienie, w którym to przypadku większość przeglądarek doda margines dziecka do wypełnienia rodzica.
Aby uzyskać pożądane zachowanie, potrzebujesz:
źródło
.parent {border: solid 1px;}
Chociaż wszystkie odpowiedzi rozwiązują ten problem, pochodzą one jednak z kompromisami / korektami / kompromisami
floats
Ty masz się unosić elementyborder-top
, Spycha to element nadrzędny co najmniej 1px w dół, co należy następnie wyregulować, wprowadzając-1px
margines do samego elementu nadrzędnego. Może to powodować problemy, gdy rodzic ma jużmargin-top
jednostki względne.padding-top
, taki sam efekt jak przy użyciuborder-top
overflow: hidden
Nie można używać, gdy rodzic powinien wyświetlać przepełnione treści, takie jak menu rozwijaneoverflow: auto
, Wprowadza paski przewijania dla elementu nadrzędnego, który ma (celowo) przepełnioną zawartość (jak cienie lub trójkąt etykietki)Problem można rozwiązać za pomocą pseudoelementów CSS3 w następujący sposób
https://jsfiddle.net/hLgbyax5/1/
źródło
margin-top: -1px
wydaje się niepotrzebne. Ale podoba mi się to.margin-top: -1px
iheight: 0
wydaje się zbędne. Testowane w Chrome. Ale najlepsze rozwiązanie..parent:after...
dodaj styl
display:inline-block
do elementu potomnegoźródło
element nadrzędny nie musi być pusty przynajmniej
przed elementem podrzędnym.źródło
To działało dla mnie
http://jsfiddle.net/97fzwuxh/
źródło
Okazuje się, że wewnątrz twojego pliku .css> jeśli ustawisz właściwość display elementu div na blok wbudowany, rozwiąże to problem. i margines będzie działał zgodnie z oczekiwaniami.
źródło
Zgrabne rozwiązanie tylko dla CSS
Użyj poniższego kodu, aby dołączyć bez zawartości pierwsze dziecko do niezamierzonego ruchu div:
Zaletą tej metody jest to, że nie trzeba zmieniać CSS żadnego istniejącego elementu, a zatem ma minimalny wpływ na projekt. Obok tego dodawany jest pseudoelement, którego nie ma w drzewie DOM.
Obsługa pseudo-elementów jest szeroko rozpowszechniona: Firefox 3+, Safari 3+, Chrome 3+, Opera 10+ i IE 8+. Będzie to działać w dowolnej nowoczesnej przeglądarce (uważaj na nowszą
::before
, która nie jest obsługiwana w IE8).Kontekst
Jeśli pierwsze dziecko elementu ma
margin-top
, rodzic dostosuje swoją pozycję jako sposób zwijania zbędnych marginesów. Dlaczego? Po prostu tak jest.Biorąc pod uwagę następujący problem:
Możesz to naprawić, dodając dziecko z zawartością, na przykład prostą spacją. Ale wszyscy nienawidzimy dodawać spacji dla tego, co jest kwestią wyłącznie projektową. Dlatego użyj tej
white-space
właściwości do sfałszowania treści.Gdzie
position: relative;
zapewnia prawidłowe ustawienie poprawki. Iwhite-space: pre;
sprawia, że nie musisz dodawać żadnych poprawek - takich jak białe znaki. Iheight: 0px;width: 0px;overflow: hidden;
upewnia się, że nigdy nie zobaczysz poprawki.W starożytnych przeglądarkach IE może być konieczne dodanie
line-height: 0px;
lubmax-height: 0px;
upewnienie się, że wysokość jest równa zero (nie jestem pewien). I opcjonalnie możesz dodać<!--dummy-->
do niego w starych przeglądarkach IE, jeśli to nie działa.Krótko mówiąc, możesz to wszystko zrobić tylko za pomocą CSS (co eliminuje potrzebę dodawania rzeczywistego potomka do drzewa DOM HTML):
źródło
overflow: hidden;
dla rodzica.Aby zapobiec „Div rodzic” użyj marginesu „div dziecko”:
W rodzicu użyj tych css:
źródło
Zawarte
margin
w nim elementy.child
się zapadają.W tym przykładzie
p
odbieramargin
z domyślnych stylów przeglądarki. Domyślna przeglądarkafont-size
to zwykle 16 pikseli. Mającmargin-top
ponad 16px#child
, zaczynasz zauważać, że zmienia się pozycja.źródło
Miałem też ten problem, ale wolałem zapobiegać włamaniom do marży ujemnej, więc umieściłem
<div class="supercontainer"></div>
wokół tego wszystkiego, co ma wypełnienia zamiast marginesów. Oczywiście oznacza to więcej divitis, ale jest to prawdopodobnie najczystszy sposób, aby zrobić to poprawnie.
źródło
co ciekawe, moje ulubione rozwiązanie tego problemu nie zostało jeszcze wspomniane: używanie pływaków.
HTML:
css:
zobacz tutaj: http://codepen.io/anon/pen/Iphol
zwróć uwagę, że jeśli potrzebujesz dynamicznej wysokości nadrzędnej, musi ona także unosić się, więc po prostu zamień
height:100px;
nafloat:left;
źródło
Alternatywnym rozwiązaniem, które znalazłem, zanim poznałem prawidłową odpowiedź, było dodanie przezroczystej ramki do elementu nadrzędnego.
Twoje pudełko będzie jednak używać dodatkowych pikseli ...
źródło
Zastosowanie
top
zamiastmargin-top
jest innym możliwym rozwiązaniem, jeśli to właściwe.źródło