Как создать контекст позиционирования

Ответ

Контекст позиционирования создается с помощью свойства position со значением relative, absolute, fixed или sticky. Элемент с таким позиционированием становится контекстом для своих дочерних элементов с position: absolute или fixed.

Пример:

<div class="parent">
  <div class="child"></div>
</div>
.parent {
  position: relative; /* Создаем контекст позиционирования */
  width: 300px;
  height: 200px;
  background: #eee;
}

.child {
  position: absolute;
  top: 20px;
  left: 30px;
  width: 100px;
  height: 50px;
  background: #f00;
}

Важно:

  • По умолчанию контекстом является viewport
  • position: static не создает контекст
  • transform, filter и will-change также могут создавать новый контекст

Ответ 18+ 🔞

О, слушай, вот это тема, про которую все вроде бы знают, а потом на ровном месте ебутся как кошки в мешке. Контекст позиционирования, блядь! Это когда ты берешь свой div и говоришь ему: «Стой тут, сука, и будь точкой отсчета для моих вырвиглазных экспериментов».

Вот смотри, есть у тебя элемент. Пока у него position: static (это по умолчанию), он нихуя не референс, он просто часть потока, как все. Но стоит ему получить relative, absolute, fixed или sticky — всё, он стал папой. Теперь все его детишки с position: absolute будут смотреть не куда-то в космос (вьюпорт), а на него, на этого нового папочку. Они будут отмерять свои top и left от его границ, а не от края окна браузера.

Вот тебе живой пример, чтобы не быть голословным пиздаболом:

<div class="parent">
  <div class="child"></div>
</div>
.parent {
  position: relative; /* Вот тут-то всё и начинается, ёпта! */
  width: 300px;
  height: 200px;
  background: #eee; /* Серенький такой, скучный фон */
}

.child {
  position: absolute; /* А этот шалопай теперь привязан к родителю */
  top: 20px;
  left: 30px;
  width: 100px;
  height: 50px;
  background: #f00; /* И гордо краснеет в указанном месте */
}

Важные нюансы, которые все хуярят:

  • По умолчанию контекстом является viewport — окно браузера. То есть если у child нет папочки с правильным position, он улетит в самые дебри документа, ищи потом свищи.
  • position: static — это как быть беспаспортным бомжом, контекст не создает, нихуя.
  • А вот это, блядь, самое интересное! Такие штуки как transform, filter и will-change тоже могут неожиданно создать новый контекст! Представь: ты поставил родителю какую-нибудь transform: translate(0), просто чтобы хардвера ускорить, а твой absolute-ребенок вдруг съехал куда-то в пизду! Вот оно почему! Он теперь считает от этого родителя с трансформом. Ёперный театр, да?

Короче, запомни: хочешь привязать один хуй к другому — сначала сделай из второго референсную точку. Иначе будет волнение ебать, где этот пиксель сбежал.