Próbuję dodać wartości marginesów do div wewnątrz innego div. Wszystko działa dobrze, z wyjątkiem najwyższej wartości, wydaje się być ignorowane. Ale dlaczego?
Czego się spodziewałem:
Co dostaję:
Kod:
#outer {
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto 0 auto;
display: block;
}
#inner {
background: #FFCC33;
margin: 50px 50px 50px 50px;
padding: 10px;
display: block;
}
<div id="outer">
<div id="inner">
Hello world!
</div>
</div>
W3Schools nie ma wyjaśnienia, dlaczego margines zachowuje się w ten sposób.
float:left;
temu działa ... ale dlaczego jest to potrzebne. Nie chcę, żeby się unosiło. I dlaczego działa margines dla lewej / prawej?Odpowiedzi:
Rzeczywiście widzisz, jak górny margines
#inner
elementu zapada się w górną krawędź#outer
elementu, pozostawiając tylko#outer
margines nienaruszony (choć nie pokazano go na zdjęciach). Górne krawędzie obu pól są zrównane ze sobą, ponieważ ich marginesy są równe.Oto odpowiednie punkty ze specyfikacji W3C:
Możesz wykonać dowolną z następujących czynności, aby zapobiec zwijaniu się marginesu:
Powyższe opcje zapobiegają zwinięciu marginesu, ponieważ:
Lewy i prawy margines zachowują się zgodnie z oczekiwaniami, ponieważ:
źródło
Spróbuj użyć
display: inline-block;
na wewnętrznej div.źródło
display:inline-block;
. Cofnij się również, gdy używasz,display:inline-block;
ponieważ tracisz szerokość 100% na div.display:inline-block
pracował dla mnie. Dziękuję bardzo.To, o czym wspominał @BoltClock, jest dość solidne. A tutaj chcę tylko dodać kilka innych rozwiązań tego problemu. sprawdź ten margines w3c_collapsing . Zielone części są potencjalną myślą, jak rozwiązać ten problem.
Rozwiązanie 1
Oznacza to, że można dodać
float:left
do jednej#outer
lub#inner
demo1 .zauważ również,
float
że unieważniłoby toauto
margines.Rozwiązanie 2
inne niż
visible
, umieścić Chodźmyoverflow: hidden
do#outer
. I ten sposób wydaje się dość prosty i przyzwoity. Lubię to.Rozwiązanie 3
lub
te dwie metody spowodują przerwanie normalnego przepływu
div
Rozwiązanie 4
jest taki sam jak @enderskill
Rozwiązanie 5
Nie ma to wiele wspólnego z tym pytaniem, ponieważ jest to zawalający się margines między rodzeństwem. ogólnie oznacza to, że ma górne pudełko
margin-bottom: 30px
i ma rodzeństwomargin-top: 10px
. Całkowity margines między nimi jest30px
zamiast40px
.Rozwiązanie 6
To bardzo interesujące i mogę po prostu dodać jedną górną linię graniczną
A także
<div>
domyślnie jest na poziomie bloku, więc nie musisz celowo go deklarować. Przepraszam, że nie mogłem opublikować więcej niż 2 linków i zdjęć z powodu mojej reputacji początkującego. Przynajmniej wiesz, skąd pochodzi problem, kiedy następnym razem zobaczysz coś podobnego.źródło
Nie wiesz, dlaczego to, co masz, nie działa, ale możesz dodać
overflow: auto;
do zewnętrznej div.
źródło
Jeśli dodasz padding
#outer
, działa.Próbny
źródło
Nie jestem pewien, dlaczego, ale zmieniając wewnętrzny CSS na
wydaje się działać;
źródło
Nie odpowiada na „dlaczego” (musi to być coś z zawalającym się marginesem), ale wydaje się, że najłatwiejszym / najbardziej logicznym sposobem na zrobienie tego, co próbujesz zrobić, byłoby dodanie
padding-top
do zewnętrznego div :http://jsfiddle.net/hpU5d/1/
Drobna uwaga - ustawianie div nie powinno być konieczne,
display:block;
chyba że w twoim kodzie jest coś innego, co mówi, żeby nie blokować.źródło
Spróbuj tego:
http://jsfiddle.net/7AXTf/
Powodzenia
źródło
Wydaje mi się, że ustawienie właściwości position #inner div na relative może również pomóc osiągnąć ten efekt. Ale w każdym razie próbowałem oryginalnego kodu wklejonego w pytaniu na IE9 i najnowszej przeglądarce Google Chrome i już dają pożądany efekt bez żadnych modyfikacji.
źródło
Użyj
padding-top:50px
dla zewnętrznego div. Coś takiego:Uwaga: wypełnienie zwiększy rozmiar div. W tym przypadku, jeśli rozmiar twojego div jest ważny, mam na myśli, czy musi on mieć określoną wysokość. zmniejsz wysokość o 50px .:
źródło
Próbowałeś! Ważne przede wszystkim, to wymusi wszystko:
źródło
Dla szybkiej naprawy spróbuj owinąć elementy potomne w
div
element taki jak ten -Margines
inner
div nie spadnie z powodu wypełnienia1px
międzyouter
iinner
div. Więc logicznie będziesz miał1px
dodatkowe miejsce wraz z istniejącym margineseminner
div.źródło