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 оставляет исходное место за элементом. Соседи раскладываются так, будто он не двигался; смещается только его отрисовка.
.item {
position: relative;
top: 28px;
left: 32px;
}В тренажёре по умолчанию выбрано static: смещения заданы, но не действуют. Переключите режим и сравните.
.item { position: static; top: 28px; left: 32px;}Без `relative` браузер игнорирует `top` и `left`. С ним квадрат перемещается, а пунктир показывает занятое им место в потоке.
Часто relative нужен не для сдвига, а чтобы задать точку отсчёта для дочернего absolute.
absolute: привязать к предку
Абсолютный элемент не занимает места в обычном потоке. Для начала считайте ориентиром ближайшего предка, у которого position не равен static, например relative. Если такого предка нет, ориентиром становится начальный containing block страницы.
<article class="card">
<img src="headphones.jpg" alt="Наушники" />
<span class="badge">−20%</span>
</article>.card {
position: relative;
}
.badge {
position: absolute;
top: 8px;
right: 8px;
}Включите и выключите position: relative у карточки, затем переключайте ширину и высоту макета. С relative метка следует за карточкой. Без него она привязывается к рамке макета – ближайшему позиционированному предку в этой демонстрации – и отрывается от карточки при изменении её размера и положения.
Размер макета: 320 × 520px
Метка привязана к карточке и остаётся в её углу.
Наушники
Беспроводные, до 32 часов работы
4 890 ₽
Кнопки меняют размер макета внутри виджета, а не окно браузера. Проверьте оба режима на каждом размере.
Для absolute нужен позиционированный предок, если элемент должен держаться относительно карточки. В примере это .card { position: relative; }. Размеры в тренажёре имитируют разные viewport браузера; они не меняют окно сайта.
Смещения: стороны и inset
top, right, bottom, left задают расстояние от соответствующей стороны ориентирующего блока. inset – сокращённая запись для этих четырёх сторон:
.badge {
inset: 8px 12px 16px 20px;
}inset повторяет порядок margin: сверху по часовой стрелке – верх, право, низ, лево.
| Сколько значений | Что задаётся | Пример порядка сторон |
|---|---|---|
| 1 | Все стороны | верх = право = низ = лево |
| 2 | Вертикаль, затем горизонталь | верх = низ; право = лево |
| 3 | Верх, горизонталь, низ | верх; право = лево; низ |
| 4 | Каждая сторона отдельно | верх, право, низ, лево |
Запись с тремя значениями встречается редко: последнее значение относится к низу, а левое расстояние незаметно повторяет правое. Чаще понятнее написать два или четыре значения.
Поменяйте число значений – виджет покажет итоговые отступы и размер абсолютного элемента:
position: absolute;
inset: 16px;Например, inset: 0 прижимает элемент ко всем четырём сторонам. Если ширина и высота оставлены auto, он растягивается на доступную область.
Смещение не меняет исходный размер и место relative-элемента в потоке. У absolute оно размещает элемент относительно найденного ориентира.
z-index: кто сверху
Когда позиционированные элементы перекрываются, z-index задаёт порядок слоёв внутри одного контекста наложения: большее число обычно рисуется выше меньшего.
.menu {
position: relative;
z-index: 2;
}
.dialog-backdrop {
position: fixed;
z-index: 1;
}z-index не исправляет любой порядок наложения: предки могут создавать отдельные контексты наложения. Поэтому сравнивайте слои, начиная с ближайших общих предков.
fixed и sticky
fixed подходит для постоянно закреплённой кнопки или панели. Обычно её координаты считаются от окна браузера, и она не прокручивается вместе с документом.
Переключите режим и прокрутите область. Тренажёр показывает окно браузера отдельной рамкой.
Кнопка находится в документе: прокрутите область, чтобы она уехала.
.help {
position: static;
}Окно просмотра
Рамка изолирует мини-окно. На странице `fixed` обычно привязан к окну браузера.
sticky сохраняет место в потоке. При прокрутке элемент движется как обычно, пока не достигнет заданной границы, например top: 0:
.section-title {
position: sticky;
top: 0;
}Раздел 1 / position: sticky; top: 0
Раздел 2 / position: sticky; top: 0
Раздел 3 / position: sticky; top: 0
Для прилипания обязательно задайте хотя бы одно смещение (top, right, bottom или left). Оно действует в пределах прокручиваемого предка; overflow у предков может изменить ожидаемую область прокрутки.
Как выбрать
- Обычное содержимое –
static. - Небольшой сдвиг с сохранением места –
relative. - Метка или значок внутри карточки – родителю
relative, меткеabsolute. - Постоянная кнопка у края окна –
fixed. - Заголовок, который прилипает при прокрутке секции –
sticky.
Сначала стройте обычный поток и Flexbox/Grid. position используйте для наложения и точечных смещений, а не вместо раскладки. Дальше – Flexbox.