Existem dois tipos principais de colapso de margem:
- Recolhendo margens entre elementos adjacentes
- Recolhendo margens entre elementos pai e filho
O uso de um preenchimento ou borda impedirá o colapso apenas no último caso. Além disso, qualquer valor overflowdiferente do padrão ( visible) aplicado ao pai evitará o colapso. Assim, ambos overflow: autoe overflow: hiddenterão o mesmo efeito. Talvez a única diferença ao usar hiddenseja 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