В чем разница между значениями `absolute` и `relative` для CSS-свойства `position`?

Ответ

Свойство position в CSS определяет метод позиционирования элемента. Значения relative и absolute кардинально меняют поведение элемента в потоке документа.

position: relative;

  • Элемент остается в нормальном потоке документа.
  • Свойства top, right, bottom, left сдвигают элемент относительно его исходного положения.
  • Место, которое элемент занимал изначально, остается зарезервированным — другие элементы его не занимают.

position: absolute;

  • Элемент извлекается из нормального потока. Его исходное место занимают другие элементы.
  • Он позиционируется относительно ближайшего предка с position, отличного от static (чаще всего relative). Если такого нет — относительно окна браузера (viewport).
  • Свойства top, right, bottom, left задают отступы от границ этого контейнера-предка.

Практический пример:

<div class="container">
  <div class="box relative">Relative Box</div>
  <div class="box absolute">Absolute Box</div>
  <div class="box static">Static Box (следующий в потоке)</div>
</div>
.container {
  position: relative; /* Контекст позиционирования для .absolute */
  border: 2px solid blue;
  padding: 20px;
}

.box {
  height: 50px;
  border: 2px solid black;
  margin: 5px;
}

.relative {
  position: relative;
  top: 10px;  /* Сдвинется вниз, но его место останется пустым */
  left: 20px; /* Сдвинется вправо */
  background: lightgreen;
}

.absolute {
  position: absolute;
  top: 10px;  /* Прилипнет к верху .container */
  right: 10px; /* Прилипнет к правому краю .container */
  background: lightcoral;
  width: 150px;
}

.static {
  /* position: static (по умолчанию) */
  background: lightblue;
}

В этом примере:

  1. Зеленый (relative) блок сдвинут, но синий блок (static) начинается там, где relative был изначально.
  2. Красный (absolute) блок "висит" в правом верхнем углу синего контейнера, а синий блок поднялся на его место.

Ответ 18+ 🔞

Э, слушай, давай разберём эту дичь с position, а то народ путается, как последние идиоты. Представь, что элементы на странице — это люди в очереди за колбасой.

position: relative; — это как если ты встал в очередь, а потом отошёл нахуй на пару шагов посмотреть ценник. Твоё место в очереди за тобой остаётся, все тебя видят, но ты стоишь чуть в стороне. Свойства top, left — это и есть те шаги, на которые ты отошёл. Твоё первоначальное место никто не занимает, оно свято, блядь.

position: absolute; — это уже полный пиздец. Ты из очереди выходишь совсем. Ты больше не в строю. Ты ищешь ближайшего родственника с властью (элемент-предок с position не static) и прилипаешь к нему, как банный лист. Если такого родственника нет — летишь на хуй прямо к окну браузера. А твоё место в очереди моментально занимает следующий алкаш. Ты вне потока, чувак. Вне.

Смотри, как это выглядит на практике, ёпта:

<div class="container">
  <div class="box relative">Relative Box</div>
  <div class="box absolute">Absolute Box</div>
  <div class="box static">Static Box (следующий в потоке)</div>
</div>
.container {
  position: relative; /* Вот этот папаша теперь точка отсчёта для absolute-выблядка */
  border: 2px solid blue;
  padding: 20px;
}

.box {
  height: 50px;
  border: 2px solid black;
  margin: 5px;
}

.relative {
  position: relative;
  top: 10px;  /* Отошёл на 10px вниз от своего места, но место его ждёт! */
  left: 20px; /* И вбок на 20px */
  background: lightgreen;
}

.absolute {
  position: absolute;
  top: 10px;  /* Прижмётся к верху папаши-контейнера */
  right: 10px; /* И к правому его краю */
  background: lightcoral;
  width: 150px;
}

.static {
  /* Он по умолчанию static, обычный честный член очереди */
  background: lightblue;
}

Что тут происходит, блядь?

  1. Зелёный урод (relative) пошевелился, но синий блок (static) встал на то самое место, где зелёный стоял изначально. Очередь не сломалась.
  2. Красный мудак (absolute) вообще вышел из строя и теперь висит в правом верхнем углу синей обводки контейнера. А синий блок, не долго думая, занял его вакантное место в очереди. Вот и вся магия, ебать её в сраку.