Eu tento adicionar valores de margem em uma div dentro de outra div. Tudo funciona bem, exceto o valor máximo, parece ser ignorado. Mas por que?
O que eu esperava:
O que eu ganho:
Código:
#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>
O W3Schools não tem explicação para o porquê da margem se comportar dessa maneira.
float:left;
isso funciona ... mas por que isso é necessário. Eu não quero que flutue. E por que a margem para esquerda / direita funciona?Respostas:
Você está vendo a margem superior do
#inner
elemento colapsar na borda superior do elemento#outer
elemento, deixando apenas a#outer
margem intacta (embora não seja mostrada em suas imagens). As bordas superiores de ambas as caixas estão alinhadas uma com a outra porque suas margens são iguais.Aqui estão os pontos relevantes da especificação do W3C:
Você pode executar um dos seguintes procedimentos para impedir que a margem entre em colapso:
O motivo pelas quais as opções acima impedem o colapso da margem é:
As margens esquerda e direita se comportam conforme o esperado, porque:
fonte
Tente usar
display: inline-block;
na div interna.fonte
display:inline-block;
. Também recuado ao usardisplay:inline-block;
é que você perde a largura de 100% na div.display:inline-block
trabalhou para mim. Muito obrigado.O que o @BoltClock mencionado é bastante sólido. E aqui eu só quero adicionar várias outras soluções para esse problema. verifique esta margem w3c_collapsing . As partes verdes são o pensamento potencial de como esse problema pode ser resolvido.
Solução 1
isso significa que posso adicionar
float:left
a#outer
ou#inner
demo1 .Observe também que
float
isso invalidaria aauto
margem de entrada.Solução 2
outro que não seja
visible
, put Vamosoverflow: hidden
em#outer
. E esse caminho parece bem simples e decente. Eu gosto disso.Solução 3
ou
esses dois métodos interromperão o fluxo normal de
div
Solução 4
é o mesmo que @enderskill
Solução 5
Isso não tem muito trabalho a ver com a questão, pois é a margem em colapso entre os irmãos. geralmente significa se uma caixa superior possui
margin-bottom: 30px
e uma caixa irmão possuimargin-top: 10px
. A margem total entre eles é em30px
vez de40px
.Solução 6
Isso é muito interessante e posso apenas adicionar uma linha de borda superior
E também
<div>
é o nível de bloco no padrão, assim você não precisa declarar isso de propósito. Desculpe por não poder postar mais de 2 links e imagens devido à minha reputação de iniciante. Pelo menos você sabe de onde vem o problema da próxima vez que vir algo semelhante.fonte
Não sei por que o que você tem não funciona, mas você pode adicionar
overflow: auto;
para a div externa
fonte
Se você adicionar algum preenchimento
#outer
, ele funcionará.Demo
fonte
Não sei exatamente por que, mas alterar o CSS interno para
parece funcionar;
fonte
Não responde o "porquê" (deve ser algo com margem em colapso), mas parece que a maneira mais fácil / lógica de fazer o que você está tentando fazer é apenas adicionar
padding-top
à div externa :http://jsfiddle.net/hpU5d/1/
Nota secundária - não deve ser necessário definir uma div, a
display:block;
menos que haja algo mais no seu código que diga para não ser bloqueado.fonte
tente isto:
http://jsfiddle.net/7AXTf/
Boa sorte
fonte
Eu acho que definir a propriedade position da div #inner para relativa também pode ajudar a alcançar o efeito. De qualquer forma, tentei o código original colado na pergunta no IE9 e no Google Chrome mais recente e eles já dão o efeito desejável sem nenhuma modificação.
fonte
Use
padding-top:50px
para div externo. Algo assim:Nota: o preenchimento aumentará o tamanho da sua div. Nesse caso, se o tamanho da sua div for importante, quero dizer se ela deve ter uma altura específica. diminua a altura em 50px .:
fonte
Você já tentou! Importante antes de tudo, forçará tudo:
fonte
Apenas para uma solução rápida, tente agrupar os elementos filhos em um
div
elemento como este -A margem de
inner
div não entrará em colapso devido ao preenchimento1px
entreouter
einner
div. Então, logicamente, você terá1px
espaço extra junto com a margem existente deinner
div.fonte