Eu tenho um div
( pai ) que contém outro div
( filho ). Pai é o primeiro elemento body
sem um estilo CSS específico. Quando eu definir
.child
{
margin-top: 10px;
}
O resultado final é que a parte superior do meu filho ainda está alinhada com a mãe. Em vez de o filho ser deslocado para 10 px para baixo, meu pai move 10 px para baixo.
Meu DOCTYPE
está definido como XHTML Transitional
.
O que estou perdendo aqui?
editar 1
Meu pai precisa ter dimensões estritamente definidas porque possui um plano de fundo que deve ser exibido abaixo, de cima para baixo (pixel perfeito). Portanto, definir margens verticais não é possível .
editar 2
Esse comportamento é o mesmo no FF, IE e CR.
Respostas:
Encontrou uma alternativa em Elementos filho com margens nas DIVs. Você também pode adicionar:
ou:
Isso evita o colapso das margens . Borda e preenchimento fazem o mesmo. Portanto, você também pode usar o seguinte para evitar um colapso na margem superior:
Atualização por solicitação popular: todo o objetivo de reduzir as margens é lidar com o conteúdo textual. Por exemplo:
Como o navegador reduz as margens, o texto aparecerá como o esperado e as
<div>
tags do invólucro não influenciam as margens. Cada elemento garante espaçamento ao redor, mas o espaçamento não será dobrado. As margens do<h2>
e<p>
não serão adicionadas, mas deslizarão uma para a outra (elas entrarão em colapso). O mesmo acontece para o elemento<p>
e<ul>
.Infelizmente, com designs modernos, essa idéia pode morder você quando você deseja explicitamente um contêiner. Isso é chamado de novo contexto de formatação de bloco no CSS speak. O
overflow
truque ou margem lhe dará isso.fonte
<h2>
,<p>
,<ul>
não vai conseguir lacunas estranhas ou margens "duplo" desta forma.margin: 5px 10px;
id esperar 2 divs 5 px do topo e 20 px entre eles e não 5 px do topo e 10 px entre eles. se eu quisesse 10 px entre eles, o id foi especificadomargin: 5px 5px;
. Eu sinceramente gostaria que houvesse uma regra raiz que eu pudesse colocar que parasse todas as margens em colapso. Eu odeio que eu tenho que dobrar o tamanho das margens no papel para fazê-los realmente fazer o que diabos eu quero na tela. e esta coisa topo ... o que é um desastreEsse é um comportamento normal (pelo menos entre as implementações do navegador). A margem não afeta a posição da criança em relação aos pais, a menos que os pais tenham preenchimento. Nesse caso, a maioria dos navegadores adicionará a margem da criança ao preenchimento dos pais.
Para obter o comportamento desejado, você precisa:
fonte
.parent {border: solid 1px;}
Embora todas as respostas resolvam o problema, elas vêm com trocas / ajustes / compromissos como
floats
, Você tem a flutuar elementosborder-top
, Isso empurra o pai pelo menos 1 px para baixo, que deve ser ajustado com a introdução de-1px
margem no próprio elemento pai. Isso pode criar problemas quando o pai já possuimargin-top
unidades relativas.padding-top
, mesmo efeito que usarborder-top
overflow: hidden
, Não pode ser usado quando o pai deve exibir conteúdo excedente, como um menu suspensooverflow: auto
, Introduz barras de rolagem para o elemento pai que possui conteúdo intencionalmente excedente (como sombras ou triângulo da dica de ferramenta)O problema pode ser resolvido usando pseudoelementos CSS3 da seguinte maneira
https://jsfiddle.net/hLgbyax5/1/
fonte
margin-top: -1px
parece ser desnecessário. Mas eu gosto disso.margin-top: -1px
eheight: 0
parece desnecessário. Testado no Chrome. Mas a melhor solução..parent:after...
adicionar estilo
display:inline-block
ao elemento filhofonte
o elemento pai não deve estar vazio pelo menos
antes do elemento filho.fonte
Isto é o que funcionou para mim
http://jsfiddle.net/97fzwuxh/
fonte
Descobri que, dentro do seu .css>, se você definir a propriedade display de um elemento div para bloquear em linha, isso resolverá o problema. e margem funcionará conforme o esperado.
fonte
Solução pura de CSS
Use o código a seguir para anexar um primeiro filho sem conteúdo à div que se move sem querer:
A vantagem desse método é que você não precisa alterar o CSS de nenhum elemento existente e, portanto, tem um impacto mínimo no design. Além disso, o elemento adicionado é um pseudo-elemento, que não está na árvore DOM.
O suporte a pseudo-elementos é amplo: Firefox 3+, Safari 3+, Chrome 3+, Opera 10+ e IE 8+. Isso funcionará em qualquer navegador moderno (tenha cuidado com o mais novo
::before
, que não é suportado no IE8).Contexto
Se o primeiro filho de um elemento tiver um
margin-top
, o pai ajustará sua posição como uma forma de recolher margens redundantes. Por quê? É assim mesmo.Dado o seguinte problema:
Você pode corrigi-lo adicionando um filho com conteúdo, como um espaço simples. Mas todos nós odiamos adicionar espaços para o que é um problema apenas de design. Portanto, use a
white-space
propriedade para falsificar conteúdo.Onde
position: relative;
garante o posicionamento correto da correção. Ewhite-space: pre;
faz com que você não precise adicionar nenhum conteúdo - como um espaço em branco - à correção. Eheight: 0px;width: 0px;overflow: hidden;
garante que você nunca verá a correção.Pode ser necessário adicionar
line-height: 0px;
oumax-height: 0px;
garantir que a altura seja realmente zero nos navegadores IE antigos (não tenho certeza). E, opcionalmente, você pode adicioná<!--dummy-->
-lo em navegadores antigos do IE, se não funcionar.Em resumo, você pode fazer tudo isso apenas com CSS (o que elimina a necessidade de adicionar um filho real à árvore DOM HTML):
fonte
overflow: hidden;
para o pai.Para impedir "Div parent", use a margem de "div child":
No parent use estes css:
fonte
Os
margin
elementos contidos.child
estão em colapso.Neste exemplo,
p
está recebendo ummargin
dos estilos padrão do navegador. O padrão do navegadorfont-size
é normalmente 16 px. Ao ter um valormargin-top
superior a 16px,#child
você começa a perceber o movimento da posição.fonte
Eu também tive esse problema, mas preferi evitar hacks de margens negativas, então coloquei um
<div class="supercontainer"></div>
ao redor de tudo que tem estofados em vez de margens. Claro que isso significa mais divite, mas é provavelmente a maneira mais limpa de fazer isso corretamente.
fonte
Curiosamente, minha solução favorita para esse problema ainda não foi mencionada aqui: usando carros alegóricos.
html:
css:
veja aqui: http://codepen.io/anon/pen/Iphol
observe que, caso você precise de altura dinâmica no pai, ele também precisará flutuar; basta substituir
height:100px;
porfloat:left;
fonte
Uma solução alternativa que encontrei antes de saber a resposta correta era adicionar uma borda transparente ao elemento pai.
Sua caixa usará pixels extras ...
fonte
Usar em
top
vez demargin-top
é outra solução possível, se apropriado.fonte