Ujemne marginesy są ważne w CSS, a zrozumienie ich (zgodnego) zachowania opiera się głównie na modelu pudełkowym i zwijaniu marginesów. Chociaż niektóre scenariusze są bardziej złożone, po przestudiowaniu specyfikacji można uniknąć wielu typowych błędów.
Na przykład, renderowanie twojego przykładowego kodu jest oparte na specyfikacji CSS, jak opisano przy obliczaniu wysokości i marginesów dla absolutnie pozycjonowanych niezastępowanych elementów .
Gdybym miał zrobić graficzną reprezentację, prawdopodobnie wybrałbym coś takiego (nie skalując):
Pole marginesu utracone 8px
na górze, jednak nie wpływa to na zawartość i pola wypełniające . Ponieważ element jest pozycjonowany absolutnie, przesunięcie elementu o 8 pikseli w górę nie powoduje żadnych dalszych zakłóceń w układzie; ze statyczną zawartością w przepływie nie zawsze tak jest.
Premia:
Nadal trzeba przekonywać, że czytanie specyfikacji jest droga (w przeciwieństwie do artykułów takich jak ten )? Widzę, że próbujesz wyśrodkować element w pionie, więc dlaczego musisz ustawić, a nie ?margin-top:-8px;
margin-top:-50%;
Cóż, centrowanie w pionie w CSS jest trudniejsze niż powinno . W przypadku ustawiania nawet górnego lub dolnego marginesu w%, wartość jest obliczana jako procent zawsze w stosunku do szerokości bloku zawierającego . Jest to raczej powszechna pułapka, a dziwactwo jest rzadko opisywane poza dokumentami w3
onset
ioffset
. To prawda, że tak wiele osób zawsze używa słowaoffset
( negatywne ), kiedy ma na myślionset
( pozytywne ). Ta wiadomość ulegnie samozniszczeniu, jeśli zaktualizujesz swoją odpowiedź. Twoje zdrowie!margin-bottom: -8px;
? Dlaczegomargin-bottom:-8px
nie jest taki sam jakmargin-top:-8px
?Górny margines równy -8 pikseli oznacza, że będzie on o 8 pikseli wyższy niż w przypadku marginesu 0.
Dno marginesu wynoszące 8 pikseli oznacza, że element pod nim będzie o 8 pikseli niżej niż gdyby miał margines 0.
źródło
margin-bottom: -8px;
? Dlaczegomargin-bottom:-8px
nie jest taki sam jakmargin-top:-8px
?dobre uwagi już tutaj przedstawione, ale chociaż istnieje wiele informacji o tym, jak renderowanie marginesów jest wykonywane przez przeglądarkę, dlaczego nie ma jeszcze pełnej odpowiedzi:
moglibyśmy również zapytać:
więc widzimy, że istnieje różnica w renderowaniu marginesów w zależności od strony, po której są one stosowane - marginesy górne (i lewe) różnią się od marginesów dolnych (i prawych).
rzeczy stają się jaśniejsze, gdy przyjrzymy się (uproszczonemu), jak style są stosowane przez przeglądarkę: elementy są renderowane z góry na dół w rzutni, zaczynając od lewego górnego rogu (na razie trzymajmy się renderowania pionowego, pamiętając, że poziomy traktuje się tak samo).
rozważ następujący html:
Analogicznie do ich pozycji w kodzie, te trzy pola pojawiają się w przeglądarce w stosie „od góry do dołu” ( mówiąc prostym, nie będziemy tutaj rozważać
order
właściwości modułu css3 „flex-box” ). tak więc za każdym razem, gdy style są stosowane do pola 3, pozycje poprzedzającego elementu (dla pola 1 i 2) zostały już określone i nie powinny być już zmieniane ze względu na szybkość renderowania.teraz wyobraź sobie górny margines -10 pikseli dla ramki 3. zamiast przesuwać wszystkie poprzednie elementy w górę, aby zebrać trochę miejsca, przeglądarka po prostu przesunie pole 3 w górę, więc jest renderowane na górze (lub pod spodem, w zależności od indeksu Z ) wszelkie poprzednie elementy. nawet jeśli wydajność nie była problemem, przesunięcie wszystkich elementów w górę mogłoby oznaczać przesunięcie ich poza obszar wyświetlania, a zatem bieżąca pozycja przewijania musiałaby zostać zmieniona, aby wszystko było ponownie widoczne.
to samo dotyczy dolnego marginesu dla pola 3, zarówno negatywnego, jak i pozytywnego: zamiast wpływać na już ocenione elementy, określa się tylko nowy „punkt wyjścia” dla kolejnych elementów. w ten sposób ustawienie dodatniego dolnego marginesu spycha w dół następujące elementy; negatywny spowoduje ich wzrost.
źródło
Ponieważ użyłeś pozycjonowania bezwzględnego i określiłeś górną wartość procentową, tylko margines górny wpłynie na lokalizację twojego obiektu. Jeśli zamiast tego umieścisz go za pomocą bottom: 50%, potrzebujesz margin-bottom -8px, aby go wyśrodkować, a margin-top nie przyniesie żadnego efektu.
Margines wpływa na granice elementu pod względem pozycjonowania go, absolutnie jak w twoim przypadku lub względem sąsiednich elementów. Wyobraź sobie, że margines jest podstawą Twojego elementu, na którym się znajduje. Zwykle mają ten sam rozmiar, ale można je powiększyć lub zmniejszyć na dowolnej lub wszystkich czterech krawędziach.
Twój CSS mówi przeglądarce, aby umieściła górę elementu na marginesie w punkcie 50% w dół strony. Jednak ponieważ wszystkie elementy nie są pojedynczym pikselem, przeglądarka musi wiedzieć, która jego część zajmuje 50% długości strony. Aby wyrównać górę elementu, używa górnego marginesu. Domyślnie jest to zgodne z górną częścią elementu, ale możesz to zmienić za pomocą CSS.
W Twoim przypadku górne 50% spowodowałoby, że górna część elementu zaczynałaby się na środku strony. Stosując ujemny górny margines, przeglądarka używa punktu 8px w elemencie od góry (tj. Linii przechodzącej przez jego środek) jako miejsca do pozycjonowania na 50%.
Jeśli zastosujesz dodatni margines na dole, wydłuża to linię, której przeglądarka używa do umieszczenia dna z dala od samego elementu, tworząc odstęp między nim a dowolnym sąsiednim elementem poniżej lub wpływając na to, gdzie jest on umieszczony bezwzględnie, jeśli pozycjonowanie oparte jest na dół.
źródło
Zastanawiam się, czy dobrze odpowiedziano na to pytanie: jak działają marginesy css i dlaczego tak się dzieje margin-top: -5; to nie to samo co margin-bottom: 5 ;?
Margines to odległość od otoczenia elementu. margin-top mówi „… odległość od otoczenia mierzona od górnej strony„ pudełka ”elementu, a margin-bottom to odległość od dolnej„ strony ”„ pudełka ”. Następnie margin-top: 5; dotyczy obwodu „górnej strony”, w tym przypadku -5; wszystko, co zbliża się z „boku” z góry, może nachodzić na „bok” elementu o 5 i margin-bottom: 5; oznacza, że odległość pomiędzy dolną stroną elementu a otoczeniem wynosi 5.
Zasadniczo to, ale wpływa na elementy pływające i tym podobne: http://www.w3.org/TR/CSS2/box.html#margin-properties .
http://coding.smashingmagazine.com/2009/07/27/the-definitive-guide-to-using-negative-margins/
Chcę zostać poprawiony.
źródło