Warum wird translateY (-50%) benötigt, um ein Element zu zentrieren, das oben liegt: 50%?

82

Ich kann sehen, dass dieser Code funktioniert, um ein Div vertikal innerhalb seines übergeordneten Elements auszurichten:

.element {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

Die Frage ist warum? Mein erster Gedanke war, dass das übergeordnete Element mehr als das Ansichtsfenster umfasste. Ich habe die Höhe 100vhund Breite meines übergeordneten Ansichtsfensters gleich gemacht 100%. Das hat nicht funktioniert. Ich brauchte noch die Übersetzung oder einen negativen Randversatz. Warum brauche ich einen negativen Offset, wenn das übergeordnete Element auf gesetzt ist margin: 0;? Liegt es an einer berechneten Marge, die ich nicht berücksichtige?

ltrainpr
quelle
top ist relativ zum übergeordneten Element, transform ist relativ zu sich selbst.
Rechnen

Antworten:

156

oben: 0 (Standard)

Standardmäßig befindet sich Ihr Element oben auf der Seite und oben im Element bei 0:

--------Top of Page--------
{element}


------Middle of  Page------



------Bottom of  Page------

oben: 50%

Wenn Sie es um 50% nach unten verschieben (50% der gesamten Seite), befindet sich der obere Rand des Elements an der 50% -Marke, dh das Element beginnt bei 50% und ist nicht zentriert.

--------Top of Page--------



------Middle of  Page------
{element}


------Bottom of  Page------

oben: 50%; transformieren: translateY (-50%);

Wenn sich die Oberseite des Elements auf halber Strecke befindet, können wir das Element um die Hälfte seiner eigenen Höhe nach oben verschieben, um es mit der gesamten Seite zu zentrieren. Genau das transform:translateY(-50%);macht:

--------Top of Page--------



{element}-Middle of Page---



------Bottom of  Page------

Aber warum können wir nicht einfach so etwas sagen top: 25%? Ich habe einen kurzen Ausschnitt gemacht, um Ihnen den Unterschied zu dieser Implementierung zu zeigen:

body {
  margin: 0;
}
.row {
  display: flex;
  justify-content: space-between;
}
.container {
  display: inline-block;
  margin: 5px;
  width: 200px;
  height: 200px;
  background: tomato;
}
.inner {
  position: relative;
  margin: 0 auto;
  height: 50%;
  width: 50%;
  background: #FFC4BA;
}
.inner.small {
  width: 25%;
  height: 25%;
}
.inner.big {
  width: 75%;
  height: 75%;
}
.percent {
  top: 25%
}
.transform {
  top: 50%;
  transform: translateY(-50%);
}
<b>First row </b>looks alright, but that's because the gap works well with the 25%
<div class="row">
  <div class="container">
    <div class="inner percent"></div>
  </div>
  <div class="container">
    <div class="inner transform"></div>
  </div>
</div>
<b>Second row </b>made the center square a bit smaller, and the 25% now is too high as we'd expect the bottom of the element to reach 75%
<div class="row">
  <div class="container">
    <div class="small inner percent"></div>
  </div>
  <div class="container">
    <div class="small inner transform"></div>
  </div>
</div>
<b>Third row </b>now I've made the center box big and it ends lower than 75% making 25% start too late
<div class="row">
  <div class="container">
    <div class="big inner percent"></div>
  </div>
  <div class="container">
    <div class="big inner transform"></div>
  </div>
</div>

Andrew Bone
quelle
Ich verstehe teilweise, was Sie sagen. Ich habe Folgefragen, die ich in den Kommentaren von @Quentin Antwort hinzugefügt habe.
ltrainpr
Ich mag die visuelle Darstellung dessen, was passiert. Vielen Dank.
ltrainpr
2
TL; DR topgilt 50% ab Seiten- / Containerhöhe, transform: translateY-50% ab Eigenelementhöhe.
aldo.roman.nurena
73

Während andere die Antwort gegeben haben, dass der -50 das innere Element wieder um die Hälfte seiner eigenen Höhe nach oben bewegt, dachte ich, dass diese kleine Animation, die die Bewegung top: 50%;zuerst zeigt, gefolgt von transform: translateY(-50%);zweit, helfen könnte.

@keyframes centerMe {
  0% { top: 0%; transform: translateY(0%); }
  50% { top: 50%; transform: translateY(0%); }
  100% { top: 50%; transform: translateY(-50%); }
}

.outer {
  position: relative;
  border: solid 1px;
  height: 200px;
  width: 200px;
}

.inner {
  position: relative;
  background-color: red;
  height: 50px; width: 50px;
  margin: auto;
  animation: centerMe 5s;
  animation-fill-mode: forwards;
}

/* rules for example */
.hline,.vline{background:#000;position:absolute}.vline{height:100%;width:1px;left:calc(50% - .5px);top:0}.hline{width:100%;height:1px;top:calc(50% - .5px)}
<div class="outer">
  <div class="hline"></div>
  <div class="vline"></div>
  <div class="inner"></div>  
</div>

JonSG
quelle
2
Schießen! Dies ist eine großartige visuelle Animation. Deshalb mag ich Frontend mehr als Backend-Programmierung. Vielen Dank.
ltrainpr
1
@Itrainpr Es gibt immer ein Kopfgeld! :-)
wizzwizz4
29
position: relative;
top: 50%;

… Bewegt das Element um eine Strecke nach unten, die der halben Höhe des übergeordneten Elements entspricht.

Da in der Standardposition die Oberseite des inneren Elements oben auf dem äußeren Element liegt, wird die Oberseite des inneren Elements in der Mitte des äußeren Elements platziert.

transform: translateY(-50%);

Dies bewegt das Innenelement wieder nach oben einen Abstand von der Hälfte der Höhe des inneren Elements.

Wenn Sie sie kombinieren, wird die Mitte des inneren Elements in die Mitte des übergeordneten Elements verschoben.

QUentin
quelle
Wenn ich verstehe, was Sie sagen, wird die Oberseite des untergeordneten Elements unter die Mitte des übergeordneten Elements verschoben. Dann verschieben wir das untergeordnete Element um den halben Abstand des untergeordneten Elements zurück, was 25% des übergeordneten Elements entspricht. Ist das korrekt? Wenn ja, warum nicht einfach nach unten bewegen top: 25%? Wenn nicht, wie unterscheidet top: 25%sich diese Umgehung?
ltrainpr
3
"Dann verschieben wir das untergeordnete Element um den halben Abstand des untergeordneten Elements zurück, was 25% des übergeordneten Elements entspricht. Ist das richtig?" - Es wäre richtig, wenn (und nur wenn) das untergeordnete Element height: 50%(oder ein gleichwertiges Element ) hätte, aber nichts im Code in der Frage deutet darauf hin, dass die Größe des untergeordneten Elements bekannt ist.
Quentin
@ltrainpr macht das Sinn, verstehst du, warum du jetzt nicht einfach 25% sagen kannst?
Andrew Bone
1
@ AndrewBone Ja, ich verstehe es jetzt. Vielen Dank, dass Sie sich die Zeit genommen haben, es zu erklären.
ltrainpr
Ist die Standardpositionierung nicht nur am oberen Rand des äußeren Elements, wenn es das erste (platzraubende) Kind ist, oder wenn position: absolute(unter der Annahme, dass das äußere Element selbst positioniert ist)?
Bergi
11

Warum benötigen Top 50% einen Übersetzungsoffset von -50%?

Anstatt diese Frage direkt zu beantworten, werde ich die allgemeinere Frage beantworten:

Wie funktioniert die Positionsverankerung in CSS?

Wenn Sie die Frage allgemein beantworten, werden Sie hoffentlich die Teile verstehen, die für Ihren speziellen Fall gelten.


Was meinst du mit "Positionsverankerung"?

Positionsverankerung ist, wenn ein DOM-Knoten so positioniert ist, dass er in einer bestimmten Dimension an seinem übergeordneten Knoten "verankert" ist. Wenn die obere linke Ecke des Knotens oben links von seinem übergeordneten Knoten verankert ist, bleiben die Knoten an ihrer oberen linken Ecke ausgerichtet, unabhängig von der Größe der beiden Elemente.

Wie sieht die Positionsverankerung aus?

Ich werde für alle weiteren Beispiele eine Vorlage verwenden, daher ist es wichtig, das Basisbeispiel zu verstehen.

.container {
  background-image: -webkit-linear-gradient(left, darkred 0, darkred 50%, goldenrod 50%, goldenrod 100%), -webkit-linear-gradient(left, darkgreen 0, darkgreen 50%, darkblue 50%, darkblue 100%);
  background-image: linear-gradient(to right, darkred 0, darkred 50%, goldenrod 50%, goldenrod 100%), linear-gradient(to right, darkgreen 0, darkgreen 50%, darkblue 50%, darkblue 100%);
  background-position: top, bottom;
  background-repeat: no-repeat;
  background-size: 100% 50.1%, 100% 50.1%;
  height: 70vh;
  margin: 15vh 15vw;
  position: relative;
  width: 70vw;
}
.box {
  background-image: -webkit-linear-gradient(left, red 0, red 50%, yellow 50%, yellow 100%), -webkit-linear-gradient(left, green 0, green 50%, blue 50%, blue 100%);
  background-image: linear-gradient(to right, red 0, red 50%, yellow 50%, yellow 100%), linear-gradient(to right, green 0, green 50%, blue 50%, blue 100%);
  background-position: top, bottom;
  background-repeat: no-repeat;
  background-size: 100% 50.1%, 100% 50.1%;
  height: 50vmin;
  position: absolute;
  width: 50vmin;
}
<div class="container">
  <div class="box"></div>
</div>

Dieses Beispiel zeigt ein übergeordnetes .containerElement mit dunkelroten, dunkelgelben, dunkelgrünen und dunkelblauen Quadranten, um die Ausrichtung einfach anzuzeigen. Im Inneren befindet sich ein .boxroter, gelber, grüner und blauer Quadrant, um den Kontrast für die Ausrichtung anzuzeigen.

In allen weiteren Beispielen wird diese Kesselplatte minimiert, um den relevanten Code besser hervorzuheben.

Beachten Sie, dass standardmäßig oben links im untergeordneten Element oben links im übergeordneten Element verankert ist.

Elternverankerung

Übergeordnetes Verankerung kann durch Verwendung der eingestellt werden top, bottom, leftund rightEigenschaften auf dem Kind - Elemente.

oben

Durch die Verwendung der topEigenschaft wird die Oberkante des untergeordneten Elements an der Oberkante des übergeordneten Elements verankert.

Angenommen, bottomnicht festgelegt, top: 0wird nicht anders als die Standardeinstellung von angezeigttop: auto

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  top: 0;
}
<div class="container">
  <div class="box"></div>
</div>

Wenn Sie einen Prozentsatz verwenden, wird die Oberkante des Kindes am angegebenen Prozentsatz von der Oberseite des Elternteils ausgerichtet.

top: 50% ist die Mitte des Elternteils:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  top: 50%;
}
<div class="container">
  <div class="box"></div>
</div>

top: 100% ist die Unterseite des Elternteils:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  top: 100%;
}
<div class="container">
  <div class="box"></div>
</div>

Bodenverankerung

Durch die untere Verankerung wird die Unterkante des Kindes an der Unterkante des Elternteils verankert:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  bottom: 0;
}
<div class="container">
  <div class="box"></div>
</div>

bottom: 50%ist die Mitte des Elternteils, wobei das Kind gegenüber von ausgerichtet ist top: 50%:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  bottom: 50%;
}
<div class="container">
  <div class="box"></div>
</div>

bottom: 100% ist die Spitze des Elternteils:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  bottom: 100%;
}
<div class="container">
  <div class="box"></div>
</div>

Linke Verankerung

Die leftEigenschaft verankert den linken Rand des untergeordneten Elements am linken Rand des übergeordneten Elements.

Angenommen, rightnicht festgelegt, left: 0wird nicht anders als die Standardeinstellung von angezeigt left: auto.

left: 50% ist die Mitte des Elternteils:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  left: 50%;
}
<div class="container">
  <div class="box"></div>
</div>

left: 100% lässt das Kind an der rechten Seite des Elternteils hängen.

Richtige Verankerung

Die rightEigenschaft verankert den rechten Rand des untergeordneten Elements am rechten Rand des übergeordneten Elements:

right: 50%ist die Mitte des Elternteils, wobei das Kind gegenüber von ausgerichtet ist left: 50%:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  right: 50%;
}
<div class="container">
  <div class="box"></div>
</div>

right: 100% Das Kind hängt an der linken Seite des Elternteils.

Kinderverankerung

Die untergeordnete Verankerung kann unabhängig von der übergeordneten Verankerung angepasst werden, indem die transformEigenschaft verwendet wird. Insbesondere die translate, translateXund translateYwerden Funktionen verwendet werden , um das Kind Feld zu stoßen eine andere Ausrichtung zu verwenden.

Der Grund , dies funktioniert , ist , weil Prozentsatz in dem translateWert des relativen sind Kind , während Prozentsatz in den top, bottom, left, und rightEigenschaften der relativen sind Eltern .

Vertikale Ausrichtung

Mit transform: translateY()kann die Ausrichtung des Kindes nach oben oder unten gestoßen werden.

transform: translateY(0) wird das Kind dort lassen, wo es ist, und ist im Allgemeinen nicht sehr nützlich.

Wenn das Kind oben am Elternteil verankert ist, transform: translateY(-50%)richtet es das Kind in seiner Mitte aus:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  top: 0;
  transform: translateY(-50%);
}
<div class="container">
  <div class="box"></div>
</div>

Wenn das Kind am unteren Rand des Elternteils verankert ist, transform: translate(50%)richtet es das Kind ebenfalls in der Mitte aus:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  bottom: 0;
  transform: translateY(50%);
}
<div class="container">
  <div class="box"></div>
</div>

Dies bedeutet auch, dass dies top: 100%entspricht bottom: 0; transform: translateY(100%):

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  bottom: 0;
  transform: translateY(100%);
}
<div class="container">
  <div class="box"></div>
</div>

Horizontale Ausrichtung

Mit transform: translateX()kann die Ausrichtung des Kindes nach links oder rechts gestoßen werden.

transform: translateX(0) Lässt das Kind dort, wo es standardmäßig ist.

Wenn das Kind links vom Elternteil verankert ist, transform: translateX(-50%)richtet es das Kind in seiner Mitte aus:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  transform: translateX(-50%);
}
<div class="container">
  <div class="box"></div>
</div>

Wenn das Kind rechts vom Elternteil verankert ist, transform: translateX(50%)richtet es das Kind ebenfalls in der Mitte aus:

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  right: 0;
  transform: translateX(50%);
}
<div class="container">
  <div class="box"></div>
</div>

left: 100%ist äquivalent zu right: 0; transform: translateX(100%).

Mittelverankerung

Beim Zentrieren muss das Kind nur auf die Mitte des Elternteils ausgerichtet und dann der Ursprung des Kindes an seinen Platz gebracht werden.

.container{background-image:-webkit-linear-gradient(left,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),-webkit-linear-gradient(left,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-image:linear-gradient(to right,darkred 0,darkred 50%,goldenrod 50%,goldenrod 100%),linear-gradient(to right,darkgreen 0,darkgreen 50%,darkblue 50%,darkblue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:70vh;margin:15vh 15vw;position:relative;width:70vw;}.box{background-image:-webkit-linear-gradient(left,red 0,red 50%,yellow 50%,yellow 100%),-webkit-linear-gradient(left,green 0,green 50%,blue 50%,blue 100%);background-image:linear-gradient(to right,red 0,red 50%,yellow 50%,yellow 100%),linear-gradient(to right,green 0,green 50%,blue 50%,blue 100%);background-position:top,bottom;background-repeat:no-repeat;background-size:100% 50.1%,100% 50.1%;height:50vmin;position:absolute;width:50vmin;}

.box {
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}
<div class="container">
  <div class="box"></div>
</div>

Aufgrund der Symmetrie können Sie auch Folgendes verwenden:

bottom: 50%;
right: 50%;
transform: translate(50%, 50%);
zzzzBov
quelle
2
Tolle allgemeinere Antwort zur Positionierung. Vielleicht wäre dies eine großartige Möglichkeit, die CSS-Positionsdokumentation zu verbessern. Überprüfen Sie die Bearbeitung von stackoverflow.com/documentation/css/935/…
JonSG
@zzzzBov Wenn Sie Ihren Inhalt nehmen und invertieren, indem Sie zuerst den relevantesten Inhalt präsentieren und ihn dann schrittweise erweitern / allgemein erklären, wäre dies weitaus motivierender, da jeder Leser frühzeitig aufhören und dennoch ein besseres Verständnis im Kontext haben könnte der Frage.
Jpaugh
@jpaugh, ja, hier ist noch einiges zu verbessern, nicht zuletzt, um die Beispiele auf weniger, weniger repetitiv und mit besserer Interaktivität zu reduzieren. Vielen Dank für Ihr Feedback, und ich werde sehen, was ich tun kann, um es in meinen nächsten Entwurf aufzunehmen.
zzzzBov
Super, danke! Ich finde, wie beim Code bevorzugt das Schreiben entweder den Leser oder den Schreiber - aber nicht beide. Prost!
Jpaugh