Почему translateY (-50%) необходим для центрирования элемента, который находится вверху: 50%?

83

Я вижу, что этот код работает для выравнивания div по вертикали внутри его родительского элемента:

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

Вопрос в том, почему? Моя первая мысль заключалась в том, что родительский элемент охватывает не только область просмотра. Я сделал высоту родительского окна просмотра равной 100vhширине 100%. Это не сработало. Мне все еще требовался перевод или отрицательное смещение поля. Зачем мне нужно отрицательное смещение, если для родительского элемента установлено значение margin: 0;? Это из-за расчетной маржи, которую я не принимаю во внимание?

ltrainpr
источник
top относится к родителю, преобразование относится к самому себе. посчитайте, и вы увидите, как это приведет к центрированию элемента
njzk2

Ответы:

157

вверху: 0 (по умолчанию)

По умолчанию ваш элемент находится вверху страницы, а верх элемента находится в 0:

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


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



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

верх: 50%

Когда вы перемещаете его вниз на 50% высоты (50% всей страницы), верх элемента оказывается на отметке 50%, то есть элемент начинается с 50% и не центрируется.

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



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


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

верх: 50%; преобразовать: translateY (-50%);

Когда верх элемента находится на полпути, мы можем переместить элемент вверх на половину его собственной высоты, чтобы центрировать его по всей странице. Это именно то, что transform:translateY(-50%);делает:

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



{element}-Middle of Page---



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

Но почему мы не можем просто сказать top: 25%или что-то в этом роде? Я сделал небольшой фрагмент, чтобы показать вам разницу с этой реализацией:

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>

Эндрю Боун
источник
Я частично понимаю, о чем вы говорите. У меня есть дополнительные вопросы, которые я добавил в комментариях к ответу @Quentin.
ltrainpr
Мне нравится визуальное представление происходящего. Спасибо.
ltrainpr
2
TL; DR topприменяет 50% от высоты страницы / контейнера, transform: translateYприменяет -50% от высоты собственного элемента.
aldo.roman.nurena
73

В то время как другие дали ответ, что -50 перемещает внутренний элемент обратно на половину его собственной высоты, я подумал, что эта небольшая анимация, показывающая движение top: 50%;сначала, а затем transform: translateY(-50%);второго, может помочь.

@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
источник
2
Стреляй! Это потрясающая визуальная анимация. Вот почему мне нравится интерфейсная часть больше, чем программирование серверной части. Спасибо.
ltrainpr
1
@Itrainpr Всегда есть награда! :-)
wizzwizz4
29
position: relative;
top: 50%;

… Перемещает элемент вниз на расстояние, равное половине высоты родительского элемента.

Поскольку позиция по умолчанию ставит верх внутреннего элемента в верхней части внешнего элемента, это ставит топ внутреннего элемента в середине наружного элемента.

transform: translateY(-50%);

Это перемещает внутренний элемент назад на расстояние, равное половине высоты внутреннего элемента.

Объединение их ставит середину внутреннего элемента в середину родительского элемента.

Квентин
источник
Если я понимаю, о чем вы говорите, верхняя часть дочернего элемента перемещается ниже середины родительского. Затем мы перемещаем дочерний элемент назад на половину расстояния от дочернего элемента, что составляет 25% от родительского элемента. Это правильно? Если да, то почему бы просто не понизить его, делая top: 25%? Если нет, то чем top: 25%отличается от этой работы?
ltrainpr
3
«Затем мы перемещаем дочерний элемент назад на половину расстояния от дочернего элемента, что составляет 25% от родительского элемента. Это правильно?» - Было бы правильно, если бы (и только если бы) дочерний элемент имел height: 50%(или эквивалент), но ничто в коде вопроса не предполагает, что высота дочернего элемента известна.
Квентин
@ltrainpr имеет ли это смысл, понимаете, почему вы не можете просто сказать 25% сейчас?
Эндрю Боун
1
@AndrewBone Ага, теперь я понял. Спасибо, что нашли время объяснить это.
ltrainpr
Разве по умолчанию не позиционируется наверху внешнего элемента только тогда, когда он является первым (занимающим пространство) дочерним position: absoluteэлементом , или при использовании (при условии, что внешний элемент позиционируется сам)?
Bergi
11

Почему верхние 50% нуждаются в смещении смещения на 50%?

Вместо того, чтобы напрямую отвечать на этот вопрос, я собираюсь ответить на более общий вопрос:

Как работает привязка позиции в CSS?

Надеюсь, отвечая на вопрос в целом, вы поймете, что относится к вашему конкретному случаю.


Что вы подразумеваете под «привязкой позиции»?

Привязка позиции - это когда узел DOM позиционируется таким образом, что он «привязан» к своему родительскому элементу в данном измерении. Если верхний левый угол узла привязан к верхнему левому углу его родителя, узлы будут оставаться выровненными по своему верхнему левому углу, независимо от размера любого элемента.

Как выглядит привязка позиции?

Я собираюсь использовать шаблон для всех дальнейших примеров, поэтому важно понимать базовый пример.

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

В этом примере показан родительский элемент .containerс темно-красным, темно-желтым, темно-зеленым и темно-синим квадрантами для облегчения просмотра выравнивания. Внутри он содержит .boxкрасный, желтый, зеленый и синий квадранты, чтобы показать контраст для выравнивания.

Во всех дальнейших примерах этот шаблон будет уменьшен, чтобы соответствующий код выделялся больше.

Обратите внимание, что по умолчанию левый верхний угол дочернего элемента привязан к левому верхнему углу родительского элемента.

Родительская привязка

Родитель анкеровки можно регулировать с помощью top, bottom, leftи rightсвойства на дочерний элемент.

верхний

Использование topсвойства привяжет верхний край дочернего элемента к верхнему краю родителя.

Предполагая, bottomчто не установлено, top: 0не будет отображаться иначе, чем значение по умолчаниюtop: 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>

Использование процента выравнивает верхний край дочернего элемента на заданный процент от верха родительского элемента.

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 {
  top: 50%;
}
<div class="container">
  <div class="box"></div>
</div>

top: 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 {
  top: 100%;
}
<div class="container">
  <div class="box"></div>
</div>

Нижнее крепление

Нижняя привязка привяжет нижний край дочернего элемента к нижнему краю родительского элемента:

.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%это середина родителя, а потомок выровнен напротив 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% является вершиной родителя:

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

Левый якорь

leftСвойство будет закрепить левый край ребенка к левому краю родителя.

Предполагая, rightчто не установлено, left: 0не будет отображаться иначе, чем значение по умолчанию left: auto.

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 {
  left: 50%;
}
<div class="container">
  <div class="box"></div>
</div>

left: 100% оставляет ребенка свисающим с правой стороны от родителя.

Правое крепление

rightСвойство будет закрепить правый край ребенка до правого края родителя:

right: 50%это середина родителя, а потомок выровнен напротив 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% оставляет ребенка свисающим с левой стороны от родителя.

Детское закрепление

Дочернюю привязку можно настроить независимо от родительской привязки, используя transformсвойство. В частности translate, функции translateX, и translateYбудут использоваться для изменения дочернего блока, чтобы использовать другое выравнивание.

Причина это работает, потому что проценты в translateстоимости по сравнению с ребенком , в то время как проценты в top, bottom, leftи rightсвойства являются по отношению к родителю .

Вертикальное выравнивание

Используя transform: translateY(), выравнивание ребенка может быть неровным вверх или вниз.

transform: translateY(0) оставит ребенка там, где он есть, и, как правило, не очень полезен.

Когда дочерний элемент привязан к верхней части родительского элемента, transform: translateY(-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 {
  top: 0;
  transform: translateY(-50%);
}
<div class="container">
  <div class="box"></div>
</div>

Точно так же, когда дочерний элемент привязан к нижней части родителя, transform: translate(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: 0;
  transform: translateY(50%);
}
<div class="container">
  <div class="box"></div>
</div>

Это также означает, что top: 100%это эквивалентно 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>

Горизонтальное выравнивание

Используя transform: translateX(), выравнивание ребенка может быть сдвинуто влево или вправо.

transform: translateX(0) оставит ребенка там, где он находится по умолчанию.

Когда дочерний элемент закреплен слева от родителя, transform: translateX(-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 {
  transform: translateX(-50%);
}
<div class="container">
  <div class="box"></div>
</div>

Точно так же, когда дочерний элемент закреплен справа от родителя, transform: translateX(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: 0;
  transform: translateX(50%);
}
<div class="container">
  <div class="box"></div>
</div>

left: 100%эквивалентно right: 0; transform: translateX(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 {
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}
<div class="container">
  <div class="box"></div>
</div>

Из-за симметрии вы также можете использовать:

bottom: 50%;
right: 50%;
transform: translate(50%, 50%);
zzzzBov
источник
2
Отличный более общий ответ по позиционированию. Возможно, это будет отличный способ расширить документацию по позиционированию CSS. Проверьте редактирование stackoverflow.com/documentation/css/935/…
JonSG
@zzzzBov Если вы возьмете свой контент и перевернете его, представив сначала наиболее релевантный контент, а затем постепенно расширив / объяснив его до более общего, это будет гораздо более мотивирующим, поскольку каждый читатель может остановиться раньше и все же лучше понять контекст. вопроса.
jpaugh
@jpaugh, да, здесь все еще требуется немало улучшений, не последнее из которых состоит в том, чтобы уменьшить количество примеров, сделать их менее повторяющимися и более интерактивными. Спасибо за отзыв, и я посмотрю, что я могу сделать, чтобы включить его в свой следующий черновик.
zzzzBov
Отлично, спасибо! Я считаю, что, как и в случае с кодом, письмо предпочитает либо читателя, либо автора, но не обоих одновременно. Ура!
jpaugh