Sei que esse é um problema antigo, já o encontrei muitas vezes. O problema é que todas as correções aqui são hacks que potencialmente teriam conseqüências não intencionais.
Primeiro, há uma explicação fácil para o problema raiz. Devido ao modo como o colapso da margem funciona, se o primeiro elemento dentro de um contêiner tiver uma margem superior, essa margem superior será efetivamente aplicada ao próprio contêiner pai. Você pode testar isso sozinho, fazendo o seguinte:
<div>
<h1>Test</h1>
</div>
Em um depurador, abra isso e passe o mouse pela div. Você notará que o div em si é realmente colocado onde a margem superior do elemento H1 para . Esse comportamento é pretendido pelo navegador.
Portanto, existe uma solução fácil para isso sem ter que recorrer a hacks estranhos, como a maioria das postagens aqui faz (sem insultos, é apenas a verdade) - basta voltar à explicação original - ...if the first element inside a container has a top margin...
- Depois disso, você precisará o primeiro elemento em um contêiner a NÃO ter uma margem superior. Ok, mas como você faz isso sem adicionar elementos que não interferem semanticamente no seu documento?
Fácil! Pseudo-elementos! Você pode fazer isso por meio de uma classe ou um mixin predefinido. Adicione um :before
pseudoelemento:
CSS por meio de uma classe:
.top-margin-fix:before {
content: ' ';
display: block;
width: 100%;
height: .0000001em;
}
Com isso, seguindo o exemplo de marcação acima, você modificaria sua div assim:
<div class="top-margin-fix">
<h1>Test</h1>
</div>
Por que isso funciona?
O primeiro elemento em um contêiner, se não tiver margem superior, define a posição do início da margem superior do próximo elemento. Ao adicionar um :before
pseudoelemento, o navegador realmente adiciona um elemento não-semântico (em outras palavras, bom para SEO) ao contêiner pai antes do seu primeiro elemento.
Q. Por que a altura: .0000001em?
R. É necessária uma altura para o navegador empurrar o elemento de margem para baixo. Essa altura é efetivamente zero, mas ainda permitirá adicionar preenchimento ao próprio contêiner pai. Como é efetivamente zero, também não afetará o layout do contêiner. Lindo.
Agora você pode adicionar uma classe (ou melhor, em SASS / LESS, um mixin!) Para corrigir esse problema, em vez de adicionar estilos de exibição estranhos que causarão consequências inesperadas quando você quiser fazer outras coisas com seus elementos, eliminando propositadamente as margens dos elementos. e / ou substituí-lo por preenchimento ou estilos estranhos de posição / flutuação que realmente não pretendem resolver esse problema.
overflow:hidden
é melhor para 90% dos casos.