Mam element div nagłówka jako pierwszy element mojego elementu div wrapper, ale kiedy dodam górny margines do h1 wewnątrz elementu div nagłówka, przesuwa cały element div nagłówka w dół. Zdaję sobie sprawę, że dzieje się tak za każdym razem, gdy nakładam górny margines na pierwszy widoczny element na stronie.
Oto przykładowy fragment kodu. Dzięki!
div#header{
width: 100%;
background-color: #eee;
position: relative;
}
div#header h1{
text-align: center;
width: 375px;
height: 50px;
margin: 50px auto;
font-size: 220%;
background: url('../../images/name_logo.png') no-repeat;
}
<div id="header">
<h1>Title</h1>
<ul id="navbar"></ul>
</div>
overflow:hidden
jest lepsza w 90% przypadków.overflow: hidden
luboverflow: auto
może powodować niepożądane skutki uboczne, z których niektórych możesz nie zauważyć na pierwszy rzut oka. Przekonałem się, że zmianamargin
napadding
załatwia sprawę, jak sugeruje odpowiedź poniżej. Nadal nie rozumiem jednak, dlaczego tak się dzieje.Nie mam solidne wyjaśnienie, dlaczego tak się dzieje, ale Naprawiłem to zmieniając
top-margin
siętop-padding
, czy dodaniedisplay: inline-block
do stylu elementu.EDYCJA: To moja teoria
Mam wrażenie, że ma to coś wspólnego z tym, jak marginesy są zwijane (łączone).
z W3C Collapsing Margins :
Moja teoria mówi, że ponieważ twój pierwszy element znajduje się obok ciała, dwa marginesy łączą się i są nakładane na ciało: zmusza to zawartość ciała do rozpoczęcia poniżej zastosowanego zwiniętego marginesu zgodnie z modelem pudełkowym .
Istnieją sytuacje, w których marginesy nie zapadają się, co może być warte zabawy (z Collapsing Margins ):
źródło
Oto niektóre sposoby uniknięcia zwijania marginesów między elementami rodzic-dziecko. Użyj tego, który lepiej pasuje do reszty Twojej stylizacji:
display
inny niżblock
.float
inny niżnone
.padding
. Na przykład, jeśli takmargin-top: 10px
, zamień napadding-top: 10px;
.position
(absolute
lubrelative
) z atrybutamitop
,bottom
itd Na przykład jeśli miałmargin-top: 10px
, zastąpićposition: relative; top: 10px;
.padding
lub aborder
po stronie, w której marginesy są zwijane, do elementu nadrzędnego . Obramowanie może mieć rozmiar 1 piksela i być przezroczyste.overflow
na wartość inną niżvisible
do dominującego elementu.źródło
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:
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ę:
W ten sposób, postępując zgodnie z powyższym przykładem znaczników, zmodyfikowałbyś swój div jako taki:
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.
źródło
display: flex
zadziała w tym przypadku. Podaj element nadrzędny,display: flex;
a następnie podaj margines zgodnie z wymaganiamih1
tagu.źródło
Zajrzyj do tego problemu już dziś.
overflow: hidden
nie działało zgodnie z oczekiwaniami, gdy śledzono więcej elementów.Więc spróbowałem zmienić właściwość wyświetlania nadrzędnego div i
display: flex
zadziałałem !!!Mam nadzieję, że to może komuś pomóc. :)
źródło
Dodanie odrobiny wypełnienia do górnej części elementu nadrzędnego może rozwiązać ten problem.
Jest to przydatne, jeśli chcesz, aby element wewnątrz elementu nadrzędnego był widoczny poza elementem nadrzędnym, na przykład w przypadku tworzenia efektu nakładania się.
źródło
Dzieje się tak z powodu załamania marginesu. Kiedy element potomny dotknie granicy elementu rodzica i którykolwiek z nich zostanie zastosowany z marginesami, to:
Wygra marża, która jest największa (zastosowana).
jeśli którykolwiek z nich ma margines, obaj będą mieli taki sam margines.
Rozwiązania
źródło