Wiem, że to stary problem, zetknąłem się z nim wiele razy. Problem polega na tym, że wszystkie poprawki tutaj to hacki, które potencjalnie mogą mieć niezamierzone konsekwencje.
Po pierwsze, istnieje proste wyjaśnienie problemu źródłowego. Ze względu na sposób, w jaki działa zwijanie marginesów, jeśli pierwszy element wewnątrz kontenera ma górny margines, ten górny margines jest skutecznie stosowany do samego kontenera nadrzędnego. Możesz to sprawdzić samodzielnie, wykonując następujące czynności:
<div>
<h1>Test</h1>
</div>
W debugerze otwórz to i najedź na div. Zauważysz, że sam element div jest faktycznie umieszczony w miejscu, w którym kończy się górny margines elementu H1 . Takie zachowanie jest zamierzone przez przeglądarkę.
Jest więc łatwa naprawa bez konieczności uciekania się do dziwnych hacków, jak to ma miejsce w większości postów tutaj (bez obelg, to tylko prawda) - po prostu wróć do pierwotnego wyjaśnienia - ...if the first element inside a container has a top margin...
- Po tym, będziesz potrzebować pierwszy element w kontenerze NIE ma górnego marginesu. OK, ale jak to zrobić bez dodawania elementów, które nie kolidują semantycznie z dokumentem?
Łatwo! Pseudoelementy! Możesz to zrobić za pomocą klasy lub wstępnie zdefiniowanej mieszanki. Dodaj :before
pseudoelement:
CSS poprzez klasę:
.top-margin-fix:before {
content: ' ';
display: block;
width: 100%;
height: .0000001em;
}
W ten sposób, postępując zgodnie z powyższym przykładem znaczników, zmodyfikowałbyś swój div jako taki:
<div class="top-margin-fix">
<h1>Test</h1>
</div>
Dlaczego to działa?
Pierwszy element w kontenerze, jeśli nie ma górnego marginesu, ustala położenie początku górnego marginesu następnego elementu. Dodając :before
pseudoelement, przeglądarka faktycznie dodaje element niesemantyczny (innymi słowy, dobry dla SEO) do kontenera nadrzędnego przed pierwszym elementem.
P: Dlaczego wysokość: .0000001em?
A. Aby przeglądarka przesunęła element marginesu w dół, wymagana jest wysokość. Ta wysokość jest efektywnie równa zero, ale nadal umożliwia dodanie wypełnienia do samego kontenera nadrzędnego. Ponieważ jest to praktycznie zero, nie będzie miało to również wpływu na układ kontenera. Piękny.
Teraz możesz dodać klasę (lub lepiej, w SASS / LESS, mixin!), Aby rozwiązać ten problem, zamiast dodawać dziwne style wyświetlania, które będą powodować nieoczekiwane konsekwencje, gdy chcesz robić inne rzeczy z elementami, celowo eliminując marginesy na elementach i / lub zastąpienie go dopełnieniem lub dziwnymi stylami pozycji / swobodnych, które tak naprawdę nie mają na celu rozwiązania tego problemu.
overflow:hidden
jest lepsza w 90% przypadków.