Позиционирование и слои

Выводим элемент из потока, привязываем к углу родителя и управляем тем, что лежит поверх.

absolute вырывает элемент из обычного потока и позиционирует относительно ближайшего relative-родителя.

relative и absolute в паре

Главный приём: на родителя вешаем relative, на ребёнка — absolute и координаты. Тогда ребёнок отсчитывает позицию от родителя, а не от всей страницы.

<div class="relative">
  <img src="product.jpg" alt="">
  <span class="absolute top-2 right-2 bg-red-500 text-white px-2 rounded">
    -30%
  </span>
</div>

Красная плашка со скидкой «прилипнет» к правому верхнему углу картинки. Без relative на родителе она бы привязалась к углу всего окна.

Координаты: top, right, bottom, left и inset

Положение задают top-*, right-*, bottom-*, left-* (значения из шкалы интервалов). inset-0 — сокращение «все четыре по нулю», то есть растянуть элемент на весь родитель:

<div class="relative">
  <div class="absolute inset-0 bg-black/40">Затемнение поверх</div>
</div>

Полупрозрачная чёрная подложка накроет весь родительский блок целиком — типичный приём для затемнения картинки под текстом.

z-index — порядок наложения

Когда элементы перекрываются, z-* решает, кто выше. Чем больше число, тем ближе к зрителю: z-0, z-10, z-20, z-50.

<header class="sticky top-0 z-50 bg-white">Шапка поверх всего</header>

Высокий z-50 гарантирует, что прилипающая шапка останется над прокручиваемым контентом и не «уедет» под него.

sticky и fixed

Помимо absolute полезны ещё два режима: fixed закрепляет элемент относительно окна (он не двигается при прокрутке — годится для кнопок-FAB), а sticky приклеивает элемент к краю при прокрутке (как «липкая» шапка выше). Обычно sticky top-0 — это всё, что нужно для прилипающего хедера.

Итог

  • Пара relative (родитель) + absolute (ребёнок) привязывает элемент к углу родителя.
  • top/right/bottom/left-* задают координаты, inset-0 растягивает на весь родитель.
  • z-* управляет наложением; sticky top-0 z-50 — рецепт липкой шапки поверх контента.
Проверьте себя
1. Что нужно повесить на родителя, чтобы absolute-ребёнок позиционировался относительно него?
Ahidden
Brelative
Cflex
Dz-10
2. Что делает класс inset-0 у absolute-элемента?
AСдвигает его на 0 пикселей вправо
BРастягивает на весь родительский блок (top/right/bottom/left = 0)
CСкрывает элемент
DЗадаёт отступ внутри
3. Зачем липкой шапке класс z-50?
AЧтобы задать высоту 50px
BЧтобы она оставалась поверх прокручиваемого контента, а не уходила под него
CЧтобы добавить тень
DЧтобы скрыть её на мобильных
Поддержать проект