Як працює 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 — крок за кроком

  1. Початково елемент поводиться як relative — займає своє місце у потоці документа.

  2. Коли прокручування доходить до точки, заданої властивістю top/left/right/bottom, елемент «прилипає» до цієї точки.

  3. Елемент залишається у «прилиплому» стані, доки його батьківський контейнер не вийде за межі області перегляду.

  4. Коли контейнер закінчується, елемент повертається в нормальний потік.

Чому 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.