CSS свойство position определяет способ позиционирования элемента на странице:
/* Основные значения position */
.static { position: static; }
.relative { position: relative; top: 10px; }
.absolute { position: absolute; top: 0; left: 0; }
.fixed { position: fixed; top: 0; right: 0; }
.sticky { position: sticky; top: 20px; }Свойство position — это как система координат для элементов! Оно определяет, как элемент будет расположен на странице и относительно чего он будет позиционироваться. 🗺️
Элемент находится в обычном потоке документа:
.static-element {
position: static;
/* top, right, bottom, left игнорируются */
}<div class="static-element">Обычный элемент</div>Особенности:
top, right, bottom, left не работаютПозиционирование относительно своего обычного места:
.relative-element {
position: relative;
top: 20px;
left: 30px;
background: lightblue;
}<div>Элемент до</div>
<div class="relative-element">Смещённый элемент</div>
<div>Элемент после</div>Особенности:
Позиционирование относительно ближайшего позиционированного родителя:
.container {
position: relative;
width: 300px;
height: 200px;
border: 2px solid #333;
}
.absolute-element {
position: absolute;
top: 10px;
right: 10px;
width: 100px;
height: 50px;
background: coral;
}<div class="container">
<div class="absolute-element">Абсолютный</div>
</div>Особенности:
position ≠ static<html>Позиционирование относительно окна браузера:
.fixed-header {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 60px;
background: #333;
color: white;
z-index: 1000;
}
.fixed-button {
position: fixed;
bottom: 20px;
right: 20px;
width: 60px;
height: 60px;
background: #007bff;
border-radius: 50%;
}<header class="fixed-header">Фиксированная шапка</header>
<button class="fixed-button">↑</button>Особенности:
Гибридное поведение relative + fixed:
.sticky-nav {
position: sticky;
top: 0;
background: white;
border-bottom: 1px solid #ddd;
z-index: 100;
}
.sticky-sidebar {
position: sticky;
top: 20px;
height: fit-content;
}<nav class="sticky-nav">Липкая навигация</nav>
<aside class="sticky-sidebar">Боковая панель</aside>Особенности:
relative до достижения порогаfixed при прокрутке.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
z-index: 1000;
}
.modal {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: white;
padding: 20px;
border-radius: 8px;
}.tooltip-container {
position: relative;
display: inline-block;
}
.tooltip {
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
background: black;
color: white;
padding: 5px 10px;
border-radius: 4px;
opacity: 0;
transition: opacity 0.3s;
}
.tooltip-container:hover .tooltip {
opacity: 1;
}.card {
position: relative;
padding: 20px;
border: 1px solid #ddd;
border-radius: 8px;
}
.badge {
position: absolute;
top: -10px;
right: -10px;
background: red;
color: white;
border-radius: 50%;
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
}Элементы с position ≠ static создают контекст позиционирования:
.parent {
position: relative; /* Создаёт контекст */
}
.child {
position: absolute;
top: 0; /* Относительно .parent */
left: 0;
}Свойство z-index работает только с позиционированными элементами:
.layer-1 {
position: relative;
z-index: 1;
}
.layer-2 {
position: absolute;
z-index: 2; /* Выше layer-1 */
}
.layer-3 {
position: fixed;
z-index: 999; /* Самый верхний */
}| Значение | Поток документа | Относительно чего | Прокрутка |
|---|---|---|---|
static | ✅ Остаётся | — | Прокручивается |
relative | ✅ Остаётся | Своего места | Прокручивается |
absolute | ❌ Удаляется | Родителя | Прокручивается |
fixed | ❌ Удаляется | Viewport | Не прокручивается |
sticky | ✅ Остаётся* | Родителя | Условно |
❌ Неправильно:
.element {
position: static;
top: 10px; /* Не работает */
}✅ Правильно:
.element {
position: relative;
top: 10px;
}Свойство position — основа для создания сложных макетов:
Правильное использование позиционирования поможет создать интуитивные и функциональные интерфейсы! 🎨