Skip to content

CSS position

Как position размещает элементы: static, relative, absolute, fixed и sticky.

On this page

position меняет способ размещения элемента. Само свойство выбирает режим, а top, right, bottom, left или inset задают смещение. Без position эти смещения не работают.

Пять значений

ЗначениеЧто происходит
staticОбычный поток страницы. Значение по умолчанию; смещения не действуют.
relativeЭлемент остаётся в потоке. Его можно сдвинуть от исходного места.
absoluteЭлемент убирается из потока и размещается относительно позиционированного предка.
fixedЭлемент привязан к окну просмотра и обычно остаётся на месте при прокрутке страницы.
stickyЭлемент сначала ведёт себя обычно, а у заданной границы «прилипает» внутри прокручиваемой области.

Если position не указано, элемент ведёт себя как static.

relative: сдвинуть, сохранив место

position: relative оставляет исходное место за элементом. Соседи раскладываются так, будто он не двигался; смещается только его отрисовка.

styles.css
.item {
  position: relative;
  top: 28px;
  left: 32px;
}

В тренажёре по умолчанию выбрано static: смещения заданы, но не действуют. Переключите режим и сравните.

2
styles.css
.item {  position: static;  top: 28px;  left: 32px;}

Без `relative` браузер игнорирует `top` и `left`. С ним квадрат перемещается, а пунктир показывает занятое им место в потоке.

Часто relative нужен не для сдвига, а чтобы задать точку отсчёта для дочернего absolute.

absolute: привязать к предку

Абсолютный элемент не занимает места в обычном потоке. Для начала считайте ориентиром ближайшего предка, у которого position не равен static, например relative. Если такого предка нет, ориентиром становится начальный containing block страницы.

index.html
<article class="card">
  <img src="headphones.jpg" alt="Наушники" />
  <span class="badge">−20%</span>
</article>
styles.css
.card {
  position: relative;
}
 
.badge {
  position: absolute;
  top: 8px;
  right: 8px;
}

Включите и выключите position: relative у карточки, затем переключайте ширину и высоту макета. С relative метка следует за карточкой. Без него она привязывается к рамке макета – ближайшему позиционированному предку в этой демонстрации – и отрывается от карточки при изменении её размера и положения.

Размер макета: 320 × 520px

Метка привязана к карточке и остаётся в её углу.

изображение товара

Наушники

Беспроводные, до 32 часов работы

4 890 ₽

−20%

Кнопки меняют размер макета внутри виджета, а не окно браузера. Проверьте оба режима на каждом размере.

Для absolute нужен позиционированный предок, если элемент должен держаться относительно карточки. В примере это .card { position: relative; }. Размеры в тренажёре имитируют разные viewport браузера; они не меняют окно сайта.

Смещения: стороны и inset

top, right, bottom, left задают расстояние от соответствующей стороны ориентирующего блока. inset – сокращённая запись для этих четырёх сторон:

styles.css
.badge {
  inset: 8px 12px 16px 20px;
}

inset повторяет порядок margin: сверху по часовой стрелке – верх, право, низ, лево.

Сколько значенийЧто задаётсяПример порядка сторон
1Все стороныверх = право = низ = лево
2Вертикаль, затем горизонтальверх = низ; право = лево
3Верх, горизонталь, низверх; право = лево; низ
4Каждая сторона отдельноверх, право, низ, лево

Запись с тремя значениями встречается редко: последнее значение относится к низу, а левое расстояние незаметно повторяет правое. Чаще понятнее написать два или четыре значения.

Поменяйте число значений – виджет покажет итоговые отступы и размер абсолютного элемента:

position: absolute;
inset: 16px;
элемент
top: 16pxright: 16pxbottom: 16pxleft: 16px

Например, inset: 0 прижимает элемент ко всем четырём сторонам. Если ширина и высота оставлены auto, он растягивается на доступную область.

Смещение не меняет исходный размер и место relative-элемента в потоке. У absolute оно размещает элемент относительно найденного ориентира.

z-index: кто сверху

Когда позиционированные элементы перекрываются, z-index задаёт порядок слоёв внутри одного контекста наложения: большее число обычно рисуется выше меньшего.

styles.css
.menu {
  position: relative;
  z-index: 2;
}
 
.dialog-backdrop {
  position: fixed;
  z-index: 1;
}
z-index: 2
z-index: 1
Оба блока позиционированы. У синего z-index: 2, поэтому он лежит поверх оранжевого с z-index: 1.

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

fixed и sticky

fixed подходит для постоянно закреплённой кнопки или панели. Обычно её координаты считаются от окна браузера, и она не прокручивается вместе с документом.

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

Кнопка находится в документе: прокрутите область, чтобы она уехала.

.help {
  position: static;
}

Окно просмотра

Содержимое страницы 1
Содержимое страницы 2
Содержимое страницы 3
Содержимое страницы 4

Рамка изолирует мини-окно. На странице `fixed` обычно привязан к окну браузера.

sticky сохраняет место в потоке. При прокрутке элемент движется как обычно, пока не достигнет заданной границы, например top: 0:

styles.css
.section-title {
  position: sticky;
  top: 0;
}
Прокручиваемая область

Раздел 1 / position: sticky; top: 0

Материал 1.1
Пример 1.2
Заметка 1.3

Раздел 2 / position: sticky; top: 0

Материал 2.1
Пример 2.2
Заметка 2.3

Раздел 3 / position: sticky; top: 0

Материал 3.1
Пример 3.2
Заметка 3.3
Прокрутите область: заголовок прилипает к её верхнему краю, пока содержимое движется.

Для прилипания обязательно задайте хотя бы одно смещение (top, right, bottom или left). Оно действует в пределах прокручиваемого предка; overflow у предков может изменить ожидаемую область прокрутки.

Как выбрать

  • Обычное содержимое – static.
  • Небольшой сдвиг с сохранением места – relative.
  • Метка или значок внутри карточки – родителю relative, метке absolute.
  • Постоянная кнопка у края окна – fixed.
  • Заголовок, который прилипает при прокрутке секции – sticky.

Сначала стройте обычный поток и Flexbox/Grid. position используйте для наложения и точечных смещений, а не вместо раскладки. Дальше – Flexbox.