Чому translateY (-50%) потрібен для центрування елемента, що знаходиться зверху: 50%?


83

Я бачу, що цей код працює для вирівнювання div по вертикалі в межах його батьківського елемента:

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

Питання в тому, чому? Моя перша думка полягала в тому, що батьківський елемент охоплює більше, ніж область перегляду. Я зробив висоту мого батьківського вікна перегляду рівною 100vhі шириною 100%. Це не спрацювало. Мені все ще потрібен переклад або компенсація від’ємного поля. Навіщо мені негативне зміщення, коли для батьківського елемента встановлено значення margin: 0;? Це через обчислену маржу, яку я не беру до уваги?


top відносно батьківського, перетворення відносно самого себе.
порахуй

Відповіді:


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>


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(за умови, що зовнішній елемент розміщений сам)?
Бергі

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%);

2
Чудова більш загальна відповідь щодо позиціонування. Можливо, це був би чудовий спосіб покращити документацію позиціонування CSS. Перевірте редагування stackoverflow.com/documentation/css/935 / ...
JonSG

@zzzzBov Якщо взяти свій вміст та інвертувати його, представляючи спочатку найбільш релевантний вміст, а потім поступово розширюючи / пояснюючи його до більш загального, це було б набагато мотивуючим, оскільки кожен читач міг би зупинитися рано і все-таки краще зрозуміти контекст питання.
jpaugh

@jpaugh, так, тут ще потрібно трохи вдосконалення, не в останню чергу - зменшити приклади, щоб вони були меншими, менш повторюваними, з кращою інтерактивністю. Дякуємо за ваш відгук, і я побачу, що я можу зробити, щоб включити його до свого наступного проекту.
zzzzBov

Чудово, дякую! Я вважаю, що, як і у випадку з кодом, письмо віддає перевагу читачеві чи письменнику --- але не обом. На здоров’я!
jpaugh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.