Урок 18. Примеры: Позиционирование: static, relative, absolute, fixed, sticky

📁 Раздел: Блочная модель и позиционирование ⏱️ Время изучения: ~50 мин 🎯 Сложность: Начальная
#position #top #inset #z-index

⚡ Кратко

Смотри на «Результат» рядом с кодом. Затем измени одно значение (top, left или само position) и предскажи, куда уедет элемент.

Рабочие примеры

Сверху каждого примера — живой результат, рядом код. Идём от простого к сложному.

1. relative — сдвиг от исходного места

Жёлтый блок сдвинут на top: 16px; left: 24px, но его «место» в потоке сохранилось — третий блок не подвинулся вверх.

Блок 1 (static)
Блок 2 (relative, сдвинут)
Блок 3 (место Блока 2 осталось занятым)
.block-2 {
  position: relative;
  top: 16px;
  left: 24px;   /* сдвиг от исходного места */
}
/* поток не меняется: Блок 3 остаётся на месте */

2. absolute — привязка к relative-родителю

Бейдж прибит к правому верхнему углу карточки. Родителю задан position: relative — иначе бейдж уехал бы в угол всей страницы.

NEW Карточка товара
Бейдж «NEW» закреплён в углу карточки.
.card {
  position: relative;   /* контекст для бейджа */
  padding: 24px;
}
.badge {
  position: absolute;   /* выпал из потока */
  top: 8px;
  right: 8px;
}

3. absolute — оверлей поверх содержимого

absolute-элемент можно растянуть на весь родитель через inset: 0 (= top/right/bottom/left: 0). Удобно для затемнений и подписей поверх картинок.

Подпись поверх «изображения»
.photo { position: relative; }
.caption {
  position: absolute;
  inset: 0;             /* top/right/bottom/left: 0 */
  display: flex;
  align-items: flex-end;
}

4. fixed — плавающая кнопка «Наверх»

Настоящий position: fixed привязал бы кнопку к окну браузера и вырвал бы её из карточки-превью. Поэтому здесь поведение имитируется внутри рамки: кнопка прижата к нижнему правому углу контейнера, как была бы прижата к углу экрана.

Это «окно браузера». Кнопка остаётся в углу при прокрутке страницы.

/* в реальном коде — относительно окна браузера */
.to-top {
  position: fixed;
  right: 16px;
  bottom: 16px;
}

5. sticky — липкая шапка при прокрутке

Прокрути список внутри рамки: заголовок «прилипает» к верху контейнера и остаётся видимым.

Липкий заголовок (sticky, top: 0)
Строка 1
Строка 2
Строка 3
Строка 4
Строка 5 — прокрути вверх и вниз
Строка 6
Строка 7
.section-title {
  position: sticky;
  top: 0;               /* порог прилипания обязателен */
  background: #0f766e;
  color: #fff;
}
Эксперимент: открой пример 2 в DevTools, убери у .card свойство position: relative — бейдж уедет в угол всей страницы. Так видно, зачем нужен контекст позиционирования.