Ich weiß, dass dies ein altes Problem ist, ich bin oft darauf gestoßen. Das Problem ist, dass alle Korrekturen hier Hacks sind, die möglicherweise unbeabsichtigte Konsequenzen haben würden.
Zunächst gibt es eine einfache Erklärung für das Grundproblem. Aufgrund der Art und Weise, wie das Reduzieren von Rändern funktioniert, wird dieser obere Rand effektiv auf den übergeordneten Container selbst angewendet, wenn das erste Element in einem Container einen oberen Rand hat. Sie können dies selbst testen, indem Sie Folgendes tun:
<div>
<h1>Test</h1>
</div>
Öffnen Sie dies in einem Debugger und bewegen Sie den Mauszeiger über das Div. Sie werden feststellen, dass das div selbst tatsächlich dort platziert ist, wo der obere Rand des H1-Elements stoppt . Dieses Verhalten wird vom Browser beabsichtigt.
Es gibt also eine einfache Lösung, ohne auf seltsame Hacks zurückgreifen zu müssen, wie es die meisten Posts hier tun (keine Beleidigungen beabsichtigt, es ist nur die Wahrheit) - kehren Sie einfach zur ursprünglichen Erklärung zurück - ...if the first element inside a container has a top margin...
- Danach würden Sie daher brauchen Das erste Element in einem Container, das KEINEN oberen Rand hat. Okay, aber wie machen Sie das, ohne Elemente hinzuzufügen, die Ihr Dokument nicht semantisch stören?
Einfach! Pseudoelemente! Sie können dies über eine Klasse oder ein vordefiniertes Mixin tun. Fügen Sie ein :before
Pseudoelement hinzu:
CSS über eine Klasse:
.top-margin-fix:before {
content: ' ';
display: block;
width: 100%;
height: .0000001em;
}
Wenn Sie dem obigen Markup-Beispiel folgen, würden Sie Ihr div als solches ändern:
<div class="top-margin-fix">
<h1>Test</h1>
</div>
Warum funktioniert das?
Das erste Element in einem Container legt, wenn es keinen oberen Rand hat, die Position des Beginns des oberen Randes des nächsten Elements fest. Durch Hinzufügen eines :before
Pseudoelements fügt der Browser dem übergeordneten Container vor Ihrem ersten Element tatsächlich ein nicht-semantisches (mit anderen Worten gut für SEO) Element hinzu.
Q. Warum die Höhe: .0000001em?
A. Der Browser benötigt eine Höhe, um das Randelement nach unten zu drücken. Diese Höhe ist praktisch Null, aber Sie können trotzdem dem übergeordneten Container selbst Polster hinzufügen. Da es praktisch Null ist, hat es auch keine Auswirkungen auf das Layout des Containers. Wunderschönen.
Jetzt können Sie eine Klasse (oder besser in SASS / LESS ein Mixin!) Hinzufügen, um dieses Problem zu beheben, anstatt seltsame Anzeigestile hinzuzufügen, die unerwartete Konsequenzen haben, wenn Sie andere Dinge mit Ihren Elementen tun möchten, und die Ränder von Elementen gezielt eliminieren und / oder es durch Auffüllen oder seltsame Positions- / Float-Stile zu ersetzen, die dieses Problem wirklich nicht lösen sollen.
overflow:hidden
ist in 90% der Fälle besser.