518 Stimmen

Rand am untergeordneten Element verschiebt übergeordnetes Element

Ich habe eine div ( Elternteil ), die eine andere div ( Kind ). Parent ist das erste Element in body ohne besonderen CSS-Stil. Wenn ich setze

.child
{
    margin-top: 10px;
}

Das Endergebnis ist, dass der obere Teil meines Kindes immer noch auf die Eltern ausgerichtet ist. Anstatt Kind für 10px nach unten verschoben wird, bewegt sich mein Elternteil 10px nach unten.

Meine DOCTYPE wird eingestellt auf XHTML Transitional .

Was übersehe ich hier?

bearbeiten 1
Mein übergeordnetes Element muss streng definierte Abmessungen haben, da es einen Hintergrund hat, der von oben bis unten (pixelgenau) darunter angezeigt werden muss. Daher ist das Festlegen von vertikalen Rändern für ihn geht nicht .

bearbeiten 2
Dieses Verhalten ist sowohl bei FF, IE als auch bei CR gleich.

0 Stimmen

Auf mehreren Browsern oder nur auf einem bestimmten?

253 Stimmen

Dieses Verhalten macht überhaupt keinen Sinn. Der Rand soll innerhalb des Elternteils bleiben. Er darf das Elternteil nicht verschieben. Wer schreibt diese Regeln.

21 Stimmen

+2 für letzten Kommentar. ernsthaft diese Regel nervt mich. "In 60 % der Fälle funktioniert es jedes Mal" - das ist eine Marge.

599voto

vdboor Punkte 20756

Eine Alternative finden Sie unter Untergeordnete Elemente mit Rändern innerhalb von DIVs Sie können auch hinzufügen:

.parent { overflow: auto; }

oder:

.parent { overflow: hidden; }

Dies verhindert, dass die Ränder zu zusammenbrechen . Umrandung und Auffüllung tun dasselbe. Daher können Sie auch Folgendes verwenden, um einen Zusammenbruch des oberen Randes zu verhindern:

.parent {
    padding-top: 1px;
    margin-top: -1px;
}

2021 Update: wenn Sie bereit sind Verzicht auf IE11-Unterstützung können Sie auch das neue CSS-Konstrukt verwenden display: flow-root . Siehe MDN-Webdokumente für alle Einzelheiten zu den Kontexten der Blockformatierung.


Update auf vielfachen Wunsch: Der Sinn des Kollabierens von Rändern ist der Umgang mit Textinhalten. Zum Beispiel:

h1, h2, p, ul {
  margin-top: 1em;
  margin-bottom: 1em;
  outline: 1px dashed blue;
}

div { outline: 1px solid red; }

<h1>Title!</h1>
<div class="text">
  <h2>Title!</h2>
  <p>Paragraph</p>
</div>
<div class="text">
  <h2>Title!</h2>
  <p>Paragraph</p>
  <ul>
    <li>list item</li>
  </ul>
</div>

Da der Browser die Ränder kollabiert, würde der Text so erscheinen, wie Sie es erwarten würden, und die <div> Wrapper-Tags haben keinen Einfluss auf die Ränder. Jedes Element hat einen Abstand um sich herum, aber die Abstände werden nicht verdoppelt. Die Ränder der <h2> y <p> addieren sich nicht, sondern gleiten ineinander (sie fallen in sich zusammen). Das Gleiche gilt für die <p> y <ul> Element.

Leider kann diese Idee bei modernen Entwürfen ins Auge gehen, wenn man ausdrücklich einen Container will. Dies wird als neue Blockformatierungskontext in CSS-Sprache. Die overflow oder Margen-Trick wird Ihnen das geben.

0 Stimmen

@Tom Fitton: Ohne sie würden viele Websites nicht funktionieren. Dies ist ein wirklich wesentlicher Eckpfeiler des CSS-Standards, also können Sie erwarten, dass er funktioniert.

55 Stimmen

Ich möchte wissen, warum das passiert und was das für einen Nutzen hat. Welche Situation diese "Funktion" sein sollte.

4 Stimmen

@MuhammadUmer, das hat mit dem Textinhalt zu tun. Zum Beispiel, eine Reihe von <h2> , <p> , <ul> Auf diese Weise entstehen keine seltsamen Lücken oder "doppelte" Ränder.

66voto

Ben James Punkte 113987

Dies ist ein normales Verhalten (zumindest bei Browser-Implementierungen). Der Rand hat keinen Einfluss auf die Position des untergeordneten Elements im Verhältnis zu seinem übergeordneten Element, es sei denn, das übergeordnete Element verfügt über ein Padding, in diesem Fall fügen die meisten Browser den Rand des untergeordneten Elements zum Padding des übergeordneten Elements hinzu.

Um das gewünschte Verhalten zu erreichen, müssen Sie:

.child {
    margin-top: 0;
}

.parent {
    padding-top: 10px;
}

4 Stimmen

Das Hinzufügen eines Rahmens zum Elternteil wirkt sich auch auf den Rand des Kinds aus. .parent {border: solid 1px;}

2 Stimmen

Der Rand wird nicht zur Auffüllung addiert... er gilt separat. Der visuelle Effekt ist jedoch derselbe.

2 Stimmen

Was ist, wenn Sie eine hohe Gewinnspanne wollen ? Nicht wirklich eine Lösung.

30voto

Ejaz Punkte 8518

Alle Antworten beheben das Problem, aber sie bringen Kompromisse/Anpassungen/Kompromisse mit sich, wie

  • floats , Sie haben zu schwebenden Elementen
  • border-top Dadurch wird das übergeordnete Element um mindestens 1 px nach unten verschoben, was dann mit dem Einfügen von angepasst werden sollte. -1px Rand zum übergeordneten Element selbst. Dies kann zu Problemen führen, wenn das übergeordnete Element bereits über margin-top in relativen Einheiten.
  • padding-top , gleiche Wirkung wie bei der Verwendung von border-top
  • overflow: hidden Kann nicht verwendet werden, wenn ein übergeordnetes Element überlaufenden Inhalt anzeigen soll, wie z. B. ein Dropdown-Menü.
  • overflow: auto Führt Bildlaufleisten für übergeordnete Elemente ein, die (absichtlich) ausufernden Inhalt haben (wie Schatten oder das Dreieck eines Tooltips)

Das Problem kann durch die Verwendung von CSS3-Pseudoelementen wie folgt behoben werden

.parent::before {
  clear: both;
  content: "";
  display: table;
  margin-top: -1px;
  height: 0;
}

https://jsfiddle.net/hLgbyax5/1/

1 Stimmen

margin-top: -1px scheint unnötig zu sein. Aber ich mag das.

4 Stimmen

Eigentlich sind beide margin-top: -1px y height: 0 erscheint unnötig. Getestet in Chrome. Aber beste Lösung.

0 Stimmen

Diese Methode funktioniert meistens, berücksichtigt aber nicht den unteren Rand für das letzte Element innerhalb des Containers. Es ist keine gleichwertige Lösung zu overflow: hidden; zum Beispiel.

25voto

Stil hinzufügen display:inline-block zum untergeordneten Element

15voto

George SEDRA Punkte 707

Das übergeordnete Element darf nicht leer sein, zumindest muss es &nbsp; vor dem untergeordneten Element.

4 Stimmen

Ja, manchmal kann nur das helfen... oder besser gesagt, etwas wie das: <div style='width:0;height:0'> </div>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X