Existe uma maneira de desativar completamente o colapso de margem? As únicas soluções que encontrei (com o nome "uncollapsing") envolvem o uso de uma borda de 1px ou preenchimento de 1px. Acho isso inaceitável: o pixel estranho complica os cálculos sem uma boa razão. Existe uma maneira mais razoável de desativar esse colapso de margem?
202
margin-bottom
mas deixemargin-top
como 0. #Respostas:
Existem dois tipos principais de colapso de margem:
O uso de um preenchimento ou borda impedirá o colapso apenas no último caso. Além disso, qualquer valor
overflow
diferente do padrão (visible
) aplicado ao pai evitará o colapso. Assim, ambosoverflow: auto
eoverflow: hidden
terão o mesmo efeito. Talvez a única diferença ao usarhidden
seja a consequência não intencional de ocultar o conteúdo se o pai tiver uma altura fixa.Outras propriedades que, uma vez aplicadas ao pai, podem ajudar a corrigir esse comportamento são:
float: left / right
position: absolute
display: inline-block / flex
Você pode testar todos eles aqui: http://jsfiddle.net/XB9wX/1/ .
Devo acrescentar que, como sempre, o Internet Explorer é a exceção. Mais especificamente, no IE 7, as margens não diminuem quando algum tipo de layout é especificado para o elemento pai, como
width
.Fontes: artigo do Sitepoint Collapsing Margins
fonte
overflow: auto
pode fazer com que as barras de rolagem apareçam no elemento pai, em vez de permitir que o conteúdo excedente exceda o limite conformeoverflow: visible
.flex
diferente de seu padrão também irá desativar colapso margemVocê também pode usar o bom e velho micro clearfix para isso.
Consulte o violino atualizado: http://jsfiddle.net/XB9wX/97/
fonte
:before
e:after
elementos. Eu já adicionou esta regra ao meu estilo:div:before, div:after{content: ' '; display: table;}
. Fantástico. De repente, as coisas começam a se comportar como esperado.Um truque interessante para desativar o colapso da margem que não tem impacto visual, tanto quanto eu sei, é definir o preenchimento do pai como
0.05px
:O preenchimento não é mais 0, portanto o colapso não ocorrerá mais, mas ao mesmo tempo o preenchimento é pequeno o suficiente para que visualmente seja arredondado para 0.
Se desejar algum outro preenchimento, aplique-o somente à "direção" na qual não é desejado o colapso da margem, por exemplo
padding-top: 0.05px;
.Exemplo de trabalho:
Editar: alterou o valor de
0.1
para0.05
. Como Chris Morgan mencionou em um comentário abaixo, e deste pequeno teste , parece que o Firefox leva0.1px
em consideração o preenchimento. Embora,0.05px
parece fazer o truque.fonte
*{padding-top:0.1px}
. Temos certeza de que funciona em todos os navegadores?0.05px
ainda parece uma escolha específica, não um número de truque aleatório do navegador, eu preferiria0.01px
.overflow:hidden
evita o colapso das margens, mas não está livre de efeitos colaterais - ou seja, ... oculta o excesso.Além de formar isso e o que você mencionou, basta aprender a viver com ele e aprender para este dia em que eles forem realmente úteis (vem a cada 3 a 5 anos).
fonte
overflow: auto
é bom usar para impedir o estouro oculto e ainda evitar o colapso das margens.overflow:auto;
fiz minha área de conteúdo ganhar uma barra de rolagem em algumas páginas.Na verdade, existe um que funciona perfeitamente:
exibição: flex; direção flexível: coluna;
fonte
<div>
dentro do.container
, caso contrário,.container
ele controlará o modelo de caixa de seus filhos. Por exemplo, elementos embutidos se tornarão elementos de bloco de largura total; se tiverem margens, elas também serão reduzidas.Todo navegador baseado em webkit deve suportar as propriedades
-webkit-margin-collapse
. Também existem subpropriedades para configurá-lo apenas para a margem superior ou inferior. Você pode fornecer os valores recolhidos (padrão), descartar (define a margem como 0 se houver uma margem vizinha) e separar (impede o recolhimento da margem).Eu testei que isso funciona nas versões de 2014 do Chrome e Safari. Infelizmente, acho que isso não seria suportado no IE porque não é baseado no webkit.
Leia a Referência CSS do Safari da Apple para obter uma explicação completa.
Se você verificar a página de extensões do webkit CSS da Mozilla , elas listam essas propriedades como proprietárias e recomendam não usá-las. Isso ocorre porque é provável que eles não entrem no CSS padrão tão cedo e apenas os navegadores baseados em webkit os darão suporte.
fonte
Eu sei que esta é uma postagem muito antiga, mas só queria dizer que o uso do flexbox em um elemento pai desabilitaria o colapso da margem para seus elementos filhos.
fonte
Eu tive um problema semelhante com o colapso da margem por causa do pai ter
position
definido como relativo. Aqui está uma lista de comandos que você pode usar para desativar o recolhimento de margem.AQUI ESTÁ PLAYGROUND PARA TESTAR
Apenas tente atribuir qualquer
parent-fix*
classe aodiv.container
elemento ou qualquer classechildren-fix*
aodiv.margin
. Escolha aquele que melhor se adapte às suas necessidades.Quando
div.absolute
com fundo vermelho vai ser posicionado no topo da página.div.absolute
em colapso será posicionado na mesma coordenada Y comodiv.margin
Aqui está o jsFiddle com o exemplo que você pode editar
fonte
No navegador mais recente (excluindo o IE11), uma solução simples para evitar o colapso da margem pai-filho é usar
display: flow-root
. No entanto, você ainda precisaria de outras técnicas para evitar o colapso do elemento adjacente.DEMO (antes)
DEMO (depois)
fonte
Para sua informação, você pode usar a grade, mas com efeitos colaterais :)
fonte