Ich habe ein Header-Div als erstes Element in meinem Wrapper-Div, aber wenn ich einem h1 innerhalb des Header-Div einen oberen Rand hinzufüge, wird das gesamte Header-Div nach unten gedrückt. Mir ist klar, dass dies immer dann passiert, wenn ich einen oberen Rand auf das erste sichtbare Element auf einer Seite anwende.
Hier ist ein Beispielcode-Snippet. Vielen Dank!
div#header{
width: 100%;
background-color: #eee;
position: relative;
}
div#header h1{
text-align: center;
width: 375px;
height: 50px;
margin: 50px auto;
font-size: 220%;
background: url('../../images/name_logo.png') no-repeat;
}
<div id="header">
<h1>Title</h1>
<ul id="navbar"></ul>
</div>
overflow:hidden
ist in 90% der Fälle besser.overflow: hidden
oderoverflow: auto
kann unerwünschte Nebenwirkungen verursachen, von denen einige möglicherweise nicht auf den ersten Blick sichtbar sind. Ich habe festgestellt, dass das Wechselnmargin
zupadding
den Trick macht, wie die Antwort unten nahelegt. Ich verstehe immer noch nicht, warum das ganze Problem passiert.Ich habe nicht eine solide Erklärung, warum dies geschieht, aber ich habe dieses Problem behoben , indem die
top-margin
zutop-padding
oder dem Hinzufügen vondisplay: inline-block
dem Elemente Stil.EDIT: Das ist meine Theorie
Ich habe das Gefühl, dass es etwas damit zu tun hat, wie Ränder reduziert (kombiniert) werden.
von W3C Collapsing Margins :
Meine Theorie ist, dass, da sich Ihr erstes Element neben dem Körper befindet, die beiden Ränder kombiniert und auf den Körper angewendet werden: Dies zwingt den Körperinhalt dazu, gemäß dem Box-Modell unter dem angewendeten reduzierten Rand zu beginnen .
Es gibt Situationen, in denen die Ränder nicht kollabieren, was es wert sein könnte, damit herumzuspielen (von Collapsing Margins ):
quelle
Dies sind einige der Möglichkeiten, um zu vermeiden, dass der Rand zwischen Eltern-Kind-Elementen zusammenbricht. Verwenden Sie diejenige, die besser zum Rest Ihres Stylings passt:
display
andere als einstellenblock
.float
andere als einstellennone
.padding
. Wenn Sie zum Beispiel hattenmargin-top: 10px
, ersetzen Sie durchpadding-top: 10px;
.position
(absolute
oderrelative
) mit Attributentop
,bottom
etc. Zum Beispiel , wenn Sie hattemargin-top: 10px
, ersetzenposition: relative; top: 10px;
.padding
oder einborder
an der Seite hinzu, an der die Ränder reduziert werden . Der Rand kann 1px und transparent sein.overflow
einen anderen Wert alsvisible
das übergeordnete Element setzen.quelle
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:
Ö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:
Wenn Sie dem obigen Markup-Beispiel folgen, würden Sie Ihr div als solches ändern:
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.
quelle
display: flex
wird in diesem Fall funktionieren. Gebendisplay: flex;
Sie demh1
Tag ein übergeordnetes Element und dann einen Rand gemäß Ihren Anforderungen an .quelle
Laufen Sie heute auf dieses Problem.
overflow: hidden
funktionierte nicht wie erwartet, als mir weitere Elemente folgten.Also habe ich versucht, die Anzeigeeigenschaft des übergeordneten Divs zu ändern und habe
display: flex
gearbeitet !!!Hoffe das kann jemandem helfen. :) :)
quelle
Durch Hinzufügen eines winzigen Auffüllens zum oberen Rand des übergeordneten Elements kann dieses Problem behoben werden.
Dies ist nützlich, wenn ein Element innerhalb des übergeordneten Elements außerhalb des übergeordneten Elements sichtbar sein soll, z. B. wenn Sie einen überlappenden Effekt erstellen.
quelle
Dies geschieht aufgrund eines Randkollapses. Wenn das untergeordnete Element die Grenze des übergeordneten Elements berührt und eines davon mit Rändern angewendet wird, gilt Folgendes:
Die größte Marge gewinnt (angewendet).
Wenn einer von ihnen einen Spielraum hat, teilen sich beide den gleichen.
Lösungen
quelle