Як працює position: sticky і чому він часто не «прилипає»
position: sticky
— це одна з найцікавіших та найкорисніших можливостей CSS для створення інтерфейсів, що адаптивно реагують на скролінг. Але попри свою простоту, цей тип позиціювання часто викликає плутанину у веб-розробників: чому елемент не прилипає, як очікується?
У цій статті ми розберемося:
-
як працює
position: sticky
, -
які типові помилки заважають йому працювати,
-
та як зробити все правильно.
Що таке position: sticky
?
position: sticky
— це гібридна модель позиціювання, яка поєднує властивості relative
та fixed
.
Коли елемент має position: sticky
, він поводиться як відносно позиційований (relative
), доки не дійде до заданого значення top
, left
, bottom
або right
. Після цього він «прилипає» до цієї позиції, поки не скінчиться його батьківський блок.
Простий приклад:
.sticky-header {
position: sticky;
top: 0;
background: white;
z-index: 1000;
}
Цей код зробить елемент «липким» до верхньої межі при прокручуванні.
Як працює position: sticky
— крок за кроком
-
Початково елемент поводиться як
relative
— займає своє місце у потоці документа. -
Коли прокручування доходить до точки, заданої властивістю
top
/left
/right
/bottom
, елемент «прилипає» до цієї точки. -
Елемент залишається у «прилиплому» стані, доки його батьківський контейнер не вийде за межі області перегляду.
-
Коли контейнер закінчується, елемент повертається в нормальний потік.
Чому position: sticky
не працює?
Попри те, що синтаксис здається простим, у реальності є кілька тонкощів, які можуть зламати липку поведінку.
1. Батьківський елемент має overflow: hidden | scroll | auto
Це найпоширеніша помилка. Якщо один із батьків елемента має overflow
, відмінний від visible
, sticky перестає працювати:
.container {
overflow: hidden; /* ❌ sticky всередині не буде працювати */
}
💡 Рішення: змінити або прибрати overflow
.
2. Елемент не має чітко заданої координати
Для sticky
потрібно вказати хоча б одну з координат: top
, left
, right
, bottom
. Без цього браузер не знає, куди “прилипати”.
.sticky-element {
position: sticky;
/* Немає top, нічого не буде */
}
💡 Рішення: вкажіть top
, наприклад: top: 0;
3. Недостатньо місця для «прилипання»
Sticky працює лише всередині батьківського елементу. Якщо його висота замала — елемент просто не має куди прилипнути.
💡 Рішення: Переконайтесь, що батьківський блок має достатню висоту.
4. Sticky не працює всередині таблиць у Safari
У старіших версіях Safari position: sticky
не працює у <table>
, <thead>
, <tr>
.
💡 Рішення: перевіряйте кросбраузерну підтримку, або використовуйте обхідні рішення (наприклад, CSS Grid чи фіксовані блоки поза таблицею).
Поради для надійної реалізації sticky
-
Завжди задавайте
top
, навіть якщо вам здається, що не потрібно. -
Використовуйте
z-index
, щоб ваш елемент не був перекритий іншими блоками. -
Тестуйте у різних браузерах: Firefox, Chrome, Safari.
-
Не загортайте sticky-елемент у блок із
overflow: hidden
.
Приклад: Липкий заголовок секції
<section>
<h2 class="sticky-title">Розділ 1</h2>
<p>...</p>
</section>
.sticky-title {
position: sticky;
top: 0;
background: #fff;
z-index: 10;
}
Цей приклад робить заголовок секції завжди видимим при прокрутці контенту — ідеально для довгих статей.
Альтернативи position: sticky
У складних випадках замість sticky
можна використати:
-
JavaScript-реалізацію sticky (через IntersectionObserver)
-
position: fixed
із додатковою логікою появи -
CSS Grid Layout для складної фіксації панелей
Висновки
position: sticky
— це зручний інструмент для покращення UX, якщо розуміти його поведінку. Основні проблеми зазвичай пов’язані з неправильним CSS оточенням: батьківські блоки з overflow
, відсутні координати або недостатня висота.
Уникаючи цих помилок, ви зможете використовувати sticky-навігацію, фіксовані заголовки таблиць або інші елементи інтерфейсу без JavaScript.