So che questo è un vecchio problema, l'ho riscontrato molte volte. Il problema è che tutte le correzioni qui sono hack che potrebbero avere conseguenze indesiderate.
Prima di tutto, c'è una semplice spiegazione per il problema alla radice. A causa del modo in cui funziona il collasso dei margini, se il primo elemento all'interno di un contenitore ha un margine superiore, quel margine superiore viene effettivamente applicato al contenitore padre stesso. Puoi testarlo da solo procedendo come segue:
<div>
<h1>Test</h1>
</div>
In un debugger, aprilo e passa il mouse sul div. Noterai che il div stesso è effettivamente posizionato dove si ferma il margine superiore dell'elemento H1 . Questo comportamento è inteso dal browser.
Quindi c'è una soluzione semplice a questo senza dover ricorrere a strani hack, come fanno la maggior parte dei post qui (nessun insulto previsto, è solo la verità) - semplicemente tornare alla spiegazione originale - ...if the first element inside a container has a top margin...
- A seguito di ciò, avresti quindi bisogno il primo elemento in un contenitore su NOT ha un margine superiore. Va bene, ma come si fa senza aggiungere elementi che non interferiscono semanticamente con il documento?
Facile! Gli pseudo-elementi! Puoi farlo tramite una classe o un mixin predefinito. Aggiungi uno :before
pseudo-elemento:
CSS tramite una classe:
.top-margin-fix:before {
content: ' ';
display: block;
width: 100%;
height: .0000001em;
}
Con questo, seguendo l'esempio di markup sopra riportato, modificheresti il div in quanto tale:
<div class="top-margin-fix">
<h1>Test</h1>
</div>
Perché funziona?
Il primo elemento in un contenitore, se non ha margine superiore, imposta la posizione dell'inizio del margine superiore dell'elemento successivo. Aggiungendo uno :before
pseudo-elemento, il browser aggiunge effettivamente un elemento non semantico (in altre parole, buono per SEO) nel contenitore principale prima del primo elemento.
D. Perché l'altezza: .0000001em?
A. È necessaria un'altezza per consentire al browser di spingere verso il basso l'elemento del margine. Questa altezza è effettivamente zero, ma ti consentirà comunque di aggiungere imbottitura al contenitore padre stesso. Dato che è effettivamente zero, non avrà alcun effetto sul layout del contenitore. Bellissimo.
Ora puoi aggiungere una classe (o meglio, in SASS / LESS, un mixin!) Per risolvere questo problema invece di aggiungere strani stili di visualizzazione che causeranno conseguenze inattese quando vuoi fare altre cose con i tuoi elementi, eliminando deliberatamente i margini sugli elementi e / o sostituendolo con un'imbottitura o strani stili di posizione / float che in realtà non sono destinati a risolvere questo problema.
overflow:hidden
è migliore per il 90% dei casi.