Dlaczego translateY (-50%) jest potrzebne do wyśrodkowania elementu znajdującego się na górze: 50%?


83

Widzę, że ten kod działa, aby wyrównać div pionowo w swoim elemencie nadrzędnym:

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

Pytanie brzmi: dlaczego? W pierwszej chwili pomyślałem, że element nadrzędny obejmuje więcej niż widok. Wyrównałem wysokość 100vhi szerokość mojego nadrzędnego rzutni 100%. To nie zadziałało. Nadal potrzebowałem tłumaczenia lub ujemnego przesunięcia depozytu zabezpieczającego. Dlaczego potrzebuję ujemnego przesunięcia, gdy element nadrzędny jest ustawiony na margin: 0;? Czy to z powodu obliczonej marży, której nie biorę pod uwagę?


top jest względem rodzica, transformacja jest określana względem siebie. zrób obliczenia, zobaczysz, jak to skutkuje wyśrodkowaniem elementu
njzk2

Odpowiedzi:


157

góra: 0 (domyślnie)

Domyślnie Twój element znajduje się na górze strony, a na górze elementu jest 0:

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


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



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

góra: 50%

Kiedy przesuniesz go w dół o 50% wysokości (50% całej strony), górna część elementu znajduje się na znaku 50%, co oznacza, że ​​element zaczyna się od 50% i nie jest wyśrodkowany.

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



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


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

góra: 50%; transform: translateY (-50%);

Kiedy górna część elementu znajduje się w połowie, możemy przesunąć element z powrotem o połowę jego wysokości, aby wyśrodkować go na całej stronie. Dokładnie to transform:translateY(-50%);robi:

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



{element}-Middle of Page---



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

Ale dlaczego nie możemy po prostu powiedzieć top: 25%lub coś takiego? Zrobiłem krótki fragment, aby pokazać różnicę w tej implementacji:

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>


Częściowo rozumiem, co mówisz. Mam dalsze pytania, które dodałem w komentarzach odpowiedzi @Quentin.
ltrainpr

Podoba mi się wizualna reprezentacja tego, co się dzieje. Dziękuję Ci.
ltrainpr

2
TL; DR topstosuje 50% od wysokości strony / kontenera, transform: translateYstosuje się -50% od wysokości własnego elementu.
aldo.roman.nurena

73

Podczas gdy inni odpowiedzieli, że -50 przesuwa element wewnętrzny z powrotem o połowę swojej wysokości, pomyślałem, że ta mała animacja pokazująca ruch do top: 50%;pierwszego, a następnie transform: translateY(-50%);drugiego, może pomóc.

@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>


2
Strzelać! To niesamowita animacja wizualna. Dlatego bardziej lubię front-end niż programowanie back-end. Dziękuję Ci.
ltrainpr

1
@Itrainpr Zawsze jest nagroda! :-)
wizzwizz4

29
position: relative;
top: 50%;

… Przesuwa element w dół na odległość równą połowie wysokości elementu nadrzędnego.

Ponieważ domyślna pozycja umieszcza górę elementu wewnętrznego na górze elementu zewnętrznego, to umieszcza górę elementu wewnętrznego na środku elementu zewnętrznego.

transform: translateY(-50%);

Powoduje to cofnięcie elementu wewnętrznego na odległość równą połowie wysokości elementu wewnętrznego .

Połączenie ich powoduje umieszczenie środka wewnętrznego elementu na środku elementu nadrzędnego.


Jeśli rozumiem, o czym mówisz, górna część elementu podrzędnego jest przesuwana poniżej środka elementu nadrzędnego. Następnie cofamy element podrzędny o połowę odległości elementu podrzędnego, co odpowiada 25% elementu nadrzędnego. Czy to jest poprawne? Jeśli tak, dlaczego nie przesunąć go w dół, robiąc to top: 25%? Jeśli nie, to czym top: 25%różni się od tego obejścia?
ltrainpr

3
„Następnie przesuwamy element podrzędny z powrotem o połowę odległości elementu podrzędnego, co odpowiada 25% elementu nadrzędnego. Czy to prawda?” - Byłoby poprawne, gdyby (i tylko wtedy) element potomny miał height: 50%(lub odpowiednik), ale nic w kodzie w pytaniu nie sugeruje, że wysokość dziecka jest znana.
Quentin

@ltrainpr, czy to ma sens, czy rozumiesz, dlaczego nie możesz teraz po prostu powiedzieć 25%?
Andrew Bone

1
@AndrewBone Tak, teraz rozumiem. Dziękuję za poświęcenie czasu na wyjaśnienie.
ltrainpr

Czy domyślne pozycjonowanie na górze elementu zewnętrznego nie jest tylko wtedy, gdy jest to pierwsze dziecko (zajmujące spację), czy też podczas używania position: absolute(zakładając, że element zewnętrzny jest ustawiony sam)?
Bergi

11

Dlaczego górni 50% potrzebują -50% przesunięcia tłumaczenia?

Zamiast odpowiadać bezpośrednio na to pytanie, odpowiem na bardziej ogólne pytanie:

Jak działa kotwiczenie pozycji w CSS?

Miejmy nadzieję, że odpowiadając ogólnie na pytanie, zrozumiesz części, które dotyczą twojego konkretnego przypadku.


Co rozumiesz przez „zakotwiczenie pozycji”?

Zakotwiczenie pozycji ma miejsce, gdy węzeł DOM jest ustawiony w taki sposób, że jest „zakotwiczony” do swojego rodzica w danym wymiarze. Jeśli lewy górny róg węzła jest zakotwiczony w lewym górnym rogu jego rodzica, węzły pozostaną wyrównane w lewym górnym rogu, bez względu na rozmiar któregokolwiek elementu.

Jak wygląda kotwiczenie pozycji?

Zamierzam użyć szablonu dla wszystkich dalszych przykładów, więc ważne jest, aby zrozumieć przykład podstawowy.

.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>

Ten przykład przedstawia rodzica, .containerktóry ma ciemnoczerwone, ciemnożółte, ciemnozielone i ciemnoniebieskie ćwiartki, aby łatwo zobaczyć wyrównanie. Wewnątrz zawiera .boxczerwoną, żółtą, zieloną i niebieską ćwiartkę, aby pokazać kontrast dla wyrównania.

Wszystkie dalsze przykłady będą zminimalizowane, aby odpowiedni kod bardziej się wyróżniał.

Zauważ, że domyślnie lewy górny róg dziecka jest zakotwiczony w lewym górnym rogu rodzica.

Zakotwiczenie rodzica

Kotwienie rodzic może być regulowany za pomocą top, bottom, lefti rightwłaściwości na element dziecięcej.

Top

Użycie topwłaściwości spowoduje zakotwiczenie górnej krawędzi dziecka do górnej krawędzi rodzica.

Zakładając, że bottomnie jest ustawiona, top: 0nie będzie wyświetlana inaczej niż domyślnatop: 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>

Użycie wartości procentowej wyrówna górną krawędź dziecka do podanej wartości procentowej względem górnej części rodzica.

top: 50% jest środkiem rodzica:

.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% to dół rodzica:

.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>

Kotwienie od dołu

Dolne zakotwiczenie zakotwiczy dolną krawędź dziecka do dolnej krawędzi rodzica:

.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%jest środkiem rodzica, z dzieckiem ułożonym naprzeciwko 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% jest szczytem rodzica:

.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>

Zakotwiczenie w lewo

leftNieruchomość będzie zakotwiczyć lewy brzeg dziecka do lewej krawędzi rodzica.

Zakładając, że rightnie jest ustawiona, left: 0nie będzie wyświetlana inaczej niż domyślna left: auto.

left: 50% jest środkiem rodzica:

.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% zostawia dziecko wiszące z prawej strony rodzica.

Prawe zakotwiczenie

rightNieruchomość będzie zakotwiczyć prawą krawędź dziecka do prawej krawędzi jednostki dominującej:

right: 50%jest środkiem rodzica, z dzieckiem ułożonym naprzeciwko 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% zostawia dziecko wiszące z lewej strony rodzica.

Kotwiczenie dziecka

Zakotwiczenie dziecka można dostosować niezależnie od zakotwiczenia nadrzędnego, korzystając z transformwłaściwości. W szczególności funkcje translate, translateXi translateYzostaną użyte do podbicia pola podrzędnego w celu użycia innego wyrównania.

Powodem tego jest, ponieważ działa w procentach translatewartości odnoszą się do dziecka , podczas gdy procenty w top, bottom, leftoraz rightwłaściwości są w stosunku do rodzica .

Wyrównanie w pionie

Za transform: translateY()pomocą wyrównania dziecka można uderzać w górę lub w dół.

transform: translateY(0) zostawi dziecko tam, gdzie jest i generalnie nie jest zbyt przydatne.

Kiedy dziecko jest zakotwiczone na górze rodzica, transform: translateY(-50%)wyrówna dziecko do jego środka:

.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>

Podobnie, gdy dziecko jest zakotwiczone na dole rodzica, transform: translate(50%)wyrówna dziecko do jego środka:

.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>

Oznacza to również, że top: 100%jest to równoważne z 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>

Wyrównanie w poziomie

Używając transform: translateX(), wyrównanie dziecka można uderzyć w lewo lub w prawo.

transform: translateX(0) pozostawi dziecko tam, gdzie jest domyślnie.

Kiedy dziecko jest zakotwiczone po lewej stronie rodzica, transform: translateX(-50%)wyrówna dziecko do jego środka:

.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>

Podobnie, gdy dziecko jest zakotwiczone po prawej stronie rodzica, transform: translateX(50%)wyrówna dziecko na środku:

.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%jest równoważne right: 0; transform: translateX(100%).

Kotwienie środkowe

Wyśrodkowanie to tylko kwestia ustawienia dziecka na środku rodzica, a następnie wbicia pochodzenia dziecka na miejsce.

.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>

Ze względu na symetrię możesz również użyć:

bottom: 50%;
right: 50%;
transform: translate(50%, 50%);

2
Świetna, bardziej ogólna odpowiedź na temat pozycjonowania. Może to byłby świetny sposób na ulepszenie dokumentacji pozycjonowania CSS. Zobacz edycję stackoverflow.com/documentation/css/935/ ...
JonSG

@zzzzBov Jeśli weźmiesz swoje treści i odwrócisz je, prezentując najpierw najbardziej odpowiednie treści, a następnie stopniowo je rozwijając / wyjaśniając, byłoby to znacznie bardziej motywujące, ponieważ każdy czytelnik mógłby zatrzymać się wcześniej i nadal lepiej rozumieć kontekst pytania.
jpaugh

@jpaugh, tak, nadal potrzeba tu sporo ulepszeń, z których nie najmniejszym jest zmniejszenie liczby przykładów, aby były mniej powtarzalne, z lepszą interaktywnością. Dziękuję za twoją opinię i zobaczę, co mogę zrobić, aby włączyć go do mojej następnej wersji roboczej.
zzzzBov

Wielkie dzieki! Uważam, że podobnie jak w przypadku kodu, pisanie preferuje czytelnika lub autora - ale nie jedno i drugie. Twoje zdrowie!
jpaugh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.