Warum befinden sich meine absolut/fest positionierten Elemente nicht dort, wo ich sie erwarte?

Lesezeit: 8 Minuten

Warum befinden sich meine absolutfest positionierten Elemente nicht dort wo
MontyX

Ich lerne gerade die Positionierung in CSS. Basierend auf dem Artikel, den ich nützlich fand, hatte ich angefangen, herumzuspielen.

Mit dem folgenden Code kann ich nicht verstehen, warum das absolute Grey-Box-Div außerhalb seines relativen Elternteils liegt. Ich habe erwartet, dass sich das graue Kästchen in der oberen linken Ecke des Containers befindet.

.container {
  background: lightblue;
  position: relative;
}

.box-orange {
  background: orange;
  height: 100px;
  width: 100px;
  position: relative;
  top: 100px;
  left: 100px;
  z-index: 2;
}

.box-blue {
  background: lightskyblue;
  height: 100px;
  width: 100px;
  /*position: static;*/
}

.box-green {
  background: lightgreen;
  height: 100px;
  width: 100px;
  position: relative;
  top: -105px;
  left: 105px;
  z-index: 2;
}

.box-grey {
  background: grey;
  height: 100px;
  width: 100px;
  position: absolute;
}
<div class="container">
  <div class="box-orange"></div>
  <div class="box-blue"></div>
  <div class="box-green"></div>
  <div class="box-grey"></div>
</div>

Kann im folgenden Fall auch nicht verstehen, warum das graue Kästchen nicht in der oberen linken Ecke, sondern nach dem leeren Raum verschoben wurde, den das orange Kästchen dort hinterlassen hat. Ich habe gerade das graue Kästchen an die zweite Stelle innerhalb des Containers div verschoben.

.container {
  background: lightblue;
  position: relative;
}

.box-orange {
  background: orange;
  height: 100px;
  width: 100px;
  position: relative;
  top: 100px;
  left: 100px;
  z-index: 2;
}

.box-blue {
  background: lightskyblue;
  height: 100px;
  width: 100px;
  /*position: static;*/
}

.box-green {
  background: lightgreen;
  height: 100px;
  width: 100px;
  position: relative;
  top: -105px;
  left: 105px;
  z-index: 2;
}

.box-grey {
  background: grey;
  height: 100px;
  width: 100px;
  position: absolute;
}
<div class="container">
  <div class="box-orange"></div>
  <div class="box-grey"></div>
  <div class="box-blue"></div>
  <div class="box-green"></div>
</div>

Alle ausführlichen Dokumentationen (z. B. MDN) und Tutorials, die ich gefunden habe, demonstrieren nur sehr einfache Beispiele mit 2-3 Boxen.

  • Sie haben kein Oben/Links eingestellt .. Setzen Sie Oben/Links, um die Position zu steuern, oder es wird basierend darauf positioniert statisch Ort. Da Sie noch lernen, müssen Sie sich nicht über diese Standardposition verwirren lassen

    – Temani Afif

    19. Februar 2019 um 20:43 Uhr


Warum befinden sich meine absolutfest positionierten Elemente nicht dort wo
Temani Afif

Um dies richtig zu verstehen, müssen Sie sich auf die beziehen offizielle Spezifikation wo Sie die Gleichung das Element finden Muss erfüllen:

'top' + 'margin-top' + 'border-top-width' + 'padding-top' + 'height' + 'padding-bottom' + 'border-bottom-width' + 'margin-bottom' + 'bottom' = height of containing block

Wir haben keinen Rand und keine Polsterung, also wird es in Ihrem Fall einfach sein:

'top' + 'margin-top' + 'height' + 'margin-bottom' + 'bottom' = height of containing block

Und wenn Sie unten lesen, finden Sie Folgendes:

  1. ‘top’ und ‘bottom’ sind ‘auto’ und ‘height’ ist nicht ‘auto’, dann setze ‘top’ auf die statische Positionsetze die ‘auto’-Werte für ‘margin-top’ und ‘margin-bottom’ auf 0 und löse nach ‘bottom’ auf.

In Ihrem Fall haben Sie also eine Höhe festgelegt und beibehalten top/bottom auf auto wird also top gesetzt statische Stellung

.. Genauer gesagt ist die statische Position für ‘top’ der Abstand von der oberen Kante des umgebenden Blocks zur oberen Randkante einer hypothetischen Box, die die erste Box des Elements gewesen wäre, wenn ihr angegebener ‘position’-Wert gewesen wäre war ‘statisch’..

Um es einfach zu machen, es ist die Position des Elements, wenn Sie es nicht festgelegt haben position:absolute.

Hier ist eine einfache Illustration zum besseren Verständnis

.container {
  background: lightblue;
  position: relative;
  padding:40px 20px;
  display:inline-block;
  vertical-align:top;
  width: 250px;
}


.box-grey {
  background: grey;
  height: 100px;
  width: 100px;
  position: absolute;
}

.box-green {
  height:20px;
  background:green;
}
<div class="container">
  <div class="box-green"></div>
  <div class="box-grey" style="position:static;">I am static</div>
</div>

<div class="container">
  <div class="box-green"></div>
  <div class="box-grey">I am absolute</div>
</div>

Beachten Sie die statische Position des ersten Elements, das beibehalten wird, wenn wir hinzufügen position:absolute. Wir haben keinen Top-Wert angegeben, daher verwendet der Browser einen Standardwert, der der von ist position:static (Standardposition) des Elements.

Wenn Sie das nicht möchten, stellen Sie einfach den oberen Wert ein und Sie fallen in diese Regel:

  1. ‘bottom’ ist ‘auto’, ‘top’ und ‘height’ sind nicht ‘auto’, dann setze die ‘auto’-Werte für ‘margin-top’ und ‘margin-bottom’ auf 0 und löse nach ‘bottom’ auf
.container {
  background: lightblue;
  position: relative;
  padding:40px 20px;
  display:inline-block;
  vertical-align:top;
  width: 250px;
}


.box-grey {
  background: grey;
  height: 100px;
  width: 100px;
  position: absolute;
  top:0;
}

.box-green {
  height:20px;
  background:green;
}
<div class="container">
  <div class="box-green"></div>
  <div class="box-grey" style="position:static;">I am static</div>
</div>

<div class="container">
  <div class="box-green"></div>
  <div class="box-grey"></div>
</div>

Dieselbe Logik gilt für das linke Eigentum


Sie können auch die Verwendung des Wortes bemerken Block enthält was hier sehr wichtig ist und in der erklärt wird gleiche Spezifikation

Die Position und Größe der Kästchen eines Elements werden manchmal relativ zu einem bestimmten Rechteck berechnet, das als umschließender Block des Elements bezeichnet wird. Der enthaltende Block eines Elements ist wie folgt definiert:

  1. Wenn das Element ‘Position: absolut’ hat, wird der umgebende Block durch den nächsten Vorfahren mit einer ‘Position’ von ‘absolut’, ‘relativ’ oder ‘fixed’ auf folgende Weise festgelegt:

Und das reicht nicht aus, da es noch andere Eigenschaften (unten aufgeführt) gibt, die ebenfalls einen umschließenden Block einrichten, sodass Sie ein Element relativ zu einem nicht positionierten Vorfahren positionieren können!

Verwandte: Warum bricht das Anwenden eines CSS-Filters auf das übergeordnete Element die Positionierung des untergeordneten Elements?

1646263928 79 Warum befinden sich meine absolutfest positionierten Elemente nicht dort wo
Ted Fitzpatrick

Sie müssen immer eingestellt werden top:0; left:0; auf absolut positionierte Elemente (oder beliebige Werte für oben, rechts, unten, links).

  • muss immer –> es ist kein Muss, es wird einfach einfacher

    – Temani Afif

    19. Februar 2019 um 20:45 Uhr

  • Von der MDN >> Das Element wird aus dem normalen Dokumentenfluss entfernt und es wird kein Platz für das Element im Seitenlayout geschaffen. Es wird relativ zu seinem am nächsten positionierten Vorfahren positioniert, falls vorhanden; andernfalls wird er relativ zum anfänglichen umgebenden Block platziert. Seine endgültige Position wird durch die Werte von oben, rechts, unten und links bestimmt. Das ist, was ich nicht verstehen kann, warum ich die Offsets verwenden muss

    – MontyX

    19. Februar 2019 um 22:07 Uhr


1646263928 783 Warum befinden sich meine absolutfest positionierten Elemente nicht dort wo
Alejandro Granados

Zunächst wird das Element relativ zu seinem ersten positionierten (nicht statischen) Vorgängerelement positioniert.

In diesem Fall funktioniert die absolute Position mit dem Geschwister, nicht mit dem Vorfahren.

Über die Vorfahren und Geschwister gibt es eine gute Dokumentation darüber: Vorfahren und Geschwister

.container {
  background: lightblue;
  position: relative;
}

.box-orange {
  background: orange;
  height: 100px;
  width: 100px;
  position: relative;
  top: 100px;
  left: 100px;
  z-index: 2;
}

.box-blue {
  background: lightskyblue;
  height: 100px;
  width: 100px;
  /*position: static;*/
}

.box-green {
  background: lightgreen;
  height: 100px;
  width: 100px;
  position: relative;
  top: -105px;
  left: 105px;
  z-index: 2;
}

.box-grey {
  background: grey;
  height: 100px;
  width: 100px;
  position: absolute;
}
<div class="container">
  <div class="box-grey"></div>
  <div class="box-orange"></div>
  <div class="box-blue"></div>
  <div class="box-green"></div>
</div>

Wenn ich das Element nach dem div-Container setze, funktioniert alles ohne Probleme

Dokumentation der Stellung

Im zweiten Teil erscheint dieses Kästchen dort, weil das Kästchen-Gery oben und rechts vom Kästchen-Grün keine Rolle spielt, verstanden? Ich nenne ein Beispiel:

.container {
  background: lightblue;
  position: relative;
}

.box-orange2 {
  background: orange;
  height: 100px;
  width: 100px;
  position: relative;
  z-index: 2;
}

.box-orange {
  background: orange;
  height: 100px;
  width: 100px;
  position: relative;
  top: 100px;
  left: 100px;
  z-index: 2;
}

.box-blue {
  background: lightskyblue;
  height: 100px;
  width: 100px;
  /*position: static;*/
}

.box-green {
  background: lightgreen;
  height: 100px;
  width: 100px;
  position: relative;
  top: -105px;
  left: 105px;
  z-index: 2;
}

.box-grey {
  background: grey;
  height: 100px;
  width: 100px;
  position: absolute;
}

.box-yellow {
  background: yellow;
  height: 100px;
  width: 100px;
  position: absolute;
}
<div class="container">
  <div class="box-orange2"></div>
  <div class="box-grey"></div>
  <div class="box-orange"></div>
  <div class="box-yellow"></div>
</div>

Sie können sehen, dass die grauen und gelben Kästchen das Verhalten nicht ändern, selbst wenn sich oben und rechts im Geschwister befinden oder nicht.

  • Vielen Dank Alejandro. Ich möchte Sie bezüglich des ersten Teils fragen, den Sie erwähnt haben, wie er in jeder Dokumentation geschrieben wurde: Das Element wird relativ zu seinem ersten positionierten (nicht statischen) Vorfahrenelement positioniert. Dies bedeutet für mich, dass der Container ist in diesem Fall der erste positionierte Vorfahre. Warum ist die Grey-Box nicht auf ihrer Position? Warum befindet es sich nicht in der oberen linken Ecke des Containers?

    – MontyX

    19. Februar 2019 um 21:18 Uhr


  • Hallo, der Vorfahre von Box-Grey ist kein Container, es ist Box-Green. box-green ist oben positioniert: -105px; und links: 105px;, wenn Sie diese Eigenschaften entfernen, werden Sie sehen, dass das Kästchengrau knapp unter dem Kästchengrün ist. Das liegt daran, dass der Vorfahre das Element ist, das direkt vor Regards steht

    – Alejandro Granados

    19. Februar 2019 um 21:35 Uhr


  • Aber was Sie sagen, ist falsch, Box-Green ist kein Vorfahr von Box-Grey, es ist ein Geschwisterelement. Der Vorfahre ist nicht der Vor Element

    – Temani Afif

    19. Februar 2019 um 21:43 Uhr


  • Das stimmt, srry. Aber die Eigenschaftsposition funktioniert gut mit den Geschwistern, also nahm ich an, dass der Vorfahr oben war.

    – Alejandro Granados

    19. Februar 2019 um 21:50 Uhr

  • @MontyX nein! er hat nicht recht. Es ist falsch. wie ich schon sagte, musst du einstellen top/left Eigenschaften, um das gewünschte Ergebnis anzuzeigen (top:0;left:0) .. und der Vorfahre ist nicht das vorherige Element

    – Temani Afif

    19. Februar 2019 um 21:54 Uhr

917270cookie-checkWarum befinden sich meine absolut/fest positionierten Elemente nicht dort, wo ich sie erwarte?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy