Українська

Вичерпний посібник з часових шкал прокручування CSS — нової потужної техніки вебанімації, що пов'язує анімацію безпосередньо з позицією прокрутки.

Часова шкала прокручування CSS: Анімація на основі позиції прокрутки

Анімації, керовані прокручуванням, революціонізують вебдизайн, пропонуючи захопливий та інтерактивний користувацький досвід, що виходить за рамки традиційних статичних макетів. Часові шкали прокручування CSS (CSS Scroll Timelines) надають нативне браузерне рішення для створення таких анімацій, безпосередньо пов'язуючи прогрес анімації з позицією прокручування елемента. Це відкриває світ творчих можливостей для підвищення залученості користувачів та розповіді історій в Інтернеті.

Що таке часові шкали прокручування CSS?

Часові шкали прокручування CSS дозволяють вам керувати прогресом CSS-анімації або переходу на основі позиції прокручування вказаного контейнера прокрутки. Замість того, щоб покладатися на традиційні анімації, засновані на часі, де тривалість анімації є фіксованою, прогрес анімації безпосередньо пов'язаний з тим, наскільки далеко прокрутив користувач. Це означає, що анімація буде зупинятися, відтворюватися, перемотуватися назад або вперед у прямій відповіді на поведінку користувача під час прокрутки, створюючи більш природний та інтерактивний досвід. Уявіть собі індикатор прогресу, який заповнюється, коли ви прокручуєте сторінку вниз, або елементи, що плавно з'являються та зникають, коли потрапляють у область перегляду – це ті ефекти, яких легко досягти за допомогою часових шкал прокручування CSS.

Навіщо використовувати часові шкали прокручування CSS?

Ключові концепції та властивості

Розуміння основних концепцій та властивостей CSS є вирішальним для ефективного використання часових шкал прокручування:

1. Часова шкала прокручування (Scroll Timeline)

Властивість scroll-timeline визначає контейнер прокрутки, який буде використовуватися як часова шкала для анімації. Ви можете вказати іменовану часову шкалу (наприклад, --my-scroll-timeline) або використовувати попередньо визначені значення, такі як auto (найближчий батьківський контейнер прокрутки), none (без часової шкали прокрутки) або root (область перегляду документа).

/* Визначення іменованої часової шкали прокручування */
.scroll-container {
  scroll-timeline: --my-scroll-timeline;
}

/* Використання іменованої часової шкали в анімації */
.animated-element {
  animation-timeline: --my-scroll-timeline;
}

2. Часова шкала анімації (Animation Timeline)

Властивість animation-timeline призначає часову шкалу прокручування для анімації. Ця властивість пов'язує прогрес анімації з позицією прокрутки вказаного контейнера. Ви також можете використовувати функцію view(), яка створює часову шкалу на основі перетину елемента з областю перегляду.

/* Прив'язка анімації до часової шкали прокручування */
.animated-element {
  animation-timeline: --my-scroll-timeline;
}

/* Використання view() для анімацій на основі області перегляду */
.animated-element {
  animation-timeline: view();
}

3. Зсуви прокрутки (Scroll Offsets)

Зсуви прокрутки визначають початкову та кінцеву точки часової шкали прокручування, які відповідають початку та кінцю анімації. Ці зсуви дозволяють вам точно контролювати, коли анімація починається та закінчується на основі позиції прокрутки. Ви можете використовувати ключові слова, такі як cover, contain, entry, exit, та числові значення (наприклад, 100px, 50%) для визначення цих зсувів.

/* Анімація, коли елемент повністю видимий */
.animated-element {
  scroll-timeline-axis: block;
  animation-timeline: view(block);
  animation-range: entry 0% cover 100%;
}

/* Початок анімації на 100px від верху, кінець, коли низ знаходиться на 200px від низу області перегляду */
.animated-element {
  scroll-timeline-axis: block;
  animation-timeline: view(block);
  animation-range: 100px exit 200px;
}

4. Вісь часової шкали прокручування (Scroll Timeline Axis)

Властивість scroll-timeline-axis вказує вісь, вздовж якої прогресує часова шкала прокручування. Її можна встановити як block (вертикальна прокрутка), inline (горизонтальна прокрутка), both (обидві осі) або auto (визначається браузером). При використанні `view()` рекомендується явно вказувати вісь.

/* Визначення осі часової шкали прокручування */
.scroll-container {
  scroll-timeline-axis: y;
}

/* З view */
.animated-element {
  scroll-timeline-axis: block;
}

5. Діапазон анімації (Animation Range)

Властивість `animation-range` визначає зсуви прокрутки (початкову та кінцеву точки), які відповідають початку (0%) та кінцю (100%) анімації. Це дозволяє вам зіставити конкретні позиції прокрутки з прогресом анімації.

/* Зіставлення всього діапазону прокрутки з анімацією */
.animated-element {
  animation-range: entry 0% cover 100%;
}

/* Початок анімації на половині діапазону прокрутки */
.animated-element {
  animation-range: 50% 100%;
}

/* Використання значень у пікселях */
.animated-element {
  animation-range: 100px 500px;
}

Практичні приклади та випадки використання

Давайте розглянемо деякі практичні приклади того, як використовувати часові шкали прокручування CSS для створення захопливих анімацій:

1. Індикатор прогресу

Класичним випадком використання анімацій, керованих прокручуванням, є індикатор прогресу, який заповнюється, коли користувач прокручує сторінку вниз. Це надає візуальний зворотний зв'язок про те, наскільки далеко користувач просунувся по контенту.

/* CSS */
.progress-container {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 5px;
  background-color: #eee;
  z-index: 1000;
}

.progress-bar {
  height: 5px;
  background-color: #4CAF50;
  width: 0%;
  animation: fillProgressBar linear;
  animation-timeline: view();
  animation-range: entry 0% cover 100%;
  transform-origin: 0%;
  animation-fill-mode: forwards;
}

@keyframes fillProgressBar {
  to {
    width: 100%;
  }
}

/* HTML */
<div class="progress-container">
  <div class="progress-bar"></div>
</div>
<div class="content">
  <p>... ваш контент тут ...</p>
</div>

Цей код створює фіксований індикатор прогресу у верхній частині сторінки. Анімація fillProgressBar поступово збільшує ширину індикатора прогресу з 0% до 100%, коли користувач прокручує сторінку вниз. animation-timeline: view() пов'язує анімацію з прогресом прокрутки області перегляду, а `animation-range` прив'язує прокрутку до візуального прогресу.

2. Плавна поява зображення

Ви можете використовувати часові шкали прокручування для створення ефекту плавної появи зображень, коли вони потрапляють в область перегляду, покращуючи візуальну привабливість вашого контенту.

/* CSS */
.fade-in-image {
  opacity: 0;
  transform: translateY(20px);
  animation: fadeIn linear;
  animation-timeline: view();
  animation-range: entry 25% cover 75%;
  animation-fill-mode: both;
}

@keyframes fadeIn {
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

/* HTML */
<img src="image.jpg" class="fade-in-image" alt="Image">

Цей код спочатку приховує зображення та позиціонує його трохи нижче кінцевого положення. Коли зображення прокручується в область перегляду, анімація fadeIn поступово збільшує прозорість і переміщує зображення в його початкове положення, створюючи плавний ефект появи. `animation-range` вказує, що анімація починається, коли верхній край зображення знаходиться на 25% в області перегляду, і завершується, коли нижній край знаходиться на 75% в області перегляду.

3. Липкі елементи

Досягайте «липких» ефектів – коли елементи прилипають до верху області перегляду під час прокрутки – але з покращеним контролем та переходами. Уявіть навігаційну панель, яка плавно перетворюється на стиснуту версію, коли користувач прокручує сторінку вниз.

/*CSS*/
.sticky-container {
  height: 200px; /* Налаштуйте під свої потреби */
  position: relative;
}

.sticky-element {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  background-color: #f0f0f0;
  padding: 20px;
  box-sizing: border-box;
  animation: stickyAnimation linear;
  animation-timeline: view();
  animation-range: entry 0% cover 20%; /* Налаштуйте діапазон за потреби */
  animation-fill-mode: both;
  z-index: 10;
}

@keyframes stickyAnimation {
  0% {
    position: absolute;
    top: 0;
  }
  100% {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    background-color: #ddd; /* Змініть колір для позначення прилипання */
  }
}

/* HTML */
<div class="sticky-container">
  <div class="sticky-element">Мій липкий елемент</div>
</div>

У цьому прикладі елемент переходить від `position: absolute` до `position: fixed`, коли він входить у верхні 20% області перегляду, створюючи плавний ефект «прилипання». Налаштуйте `animation-range` та властивості CSS у ключових кадрах, щоб налаштувати поведінку.

4. Ефект паралакс-прокрутки

Створюйте ефект паралакс-прокрутки, де різні шари контенту рухаються з різною швидкістю, коли користувач прокручує сторінку, додаючи глибину та візуальний інтерес.

/* CSS */
.parallax-container {
  position: relative;
  height: 500px; /* Налаштуйте під свої потреби */
  overflow: hidden;
}

.parallax-layer {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-size: cover;
  background-position: center;
}

.parallax-layer--bg {
  background-image: url("background.jpg");
  animation: parallaxBg linear;
  animation-timeline: view();
  animation-range: entry 0% cover 100%;
  transform-origin: 50% 0%;
  animation-fill-mode: both;
}

.parallax-layer--fg {
 background-image: url("foreground.png");
  animation: parallaxFg linear;
  animation-timeline: view();
  animation-range: entry 0% cover 100%;
  transform-origin: 50% 0%;
  animation-fill-mode: both;
}

@keyframes parallaxBg {
 to {
    transform: translateY(50px); /* Налаштуйте для швидкості паралакса */
 }
}

@keyframes parallaxFg {
 to {
   transform: translateY(100px); /* Налаштуйте для швидкості паралакса */
 }
}

/* HTML */
<div class="parallax-container">
  <div class="parallax-layer parallax-layer--bg"></div>
  <div class="parallax-layer parallax-layer--fg"></div>
</div>

Цей приклад створює два шари з різними фоновими зображеннями. Анімації `parallaxBg` та `parallaxFg` переміщують шари з різною швидкістю, створюючи ефект паралакса. Налаштуйте значення `translateY` у ключових кадрах, щоб контролювати швидкість кожного шару.

5. Анімація появи тексту

Розкривайте текст символ за символом, коли користувач прокручує певну точку, привертаючи увагу та посилюючи розповідний аспект контенту.

/* CSS */
.text-reveal-container {
  position: relative;
  overflow: hidden;
}

.text-reveal {
  display: inline-block;
  white-space: nowrap;
  overflow: hidden;
  animation: textRevealAnimation steps(1) forwards;
  animation-timeline: view();
  animation-range: entry 25% cover 75%;
  animation-fill-mode: both;
  width: 0;
}

@keyframes textRevealAnimation {
  to {
    width: 100%;
  }
}

/* HTML */
<div class="text-reveal-container">
  <span class="text-reveal">Цей текст буде розкриватися під час прокрутки.</span>
</div>

Цей приклад використовує функцію часу `steps(1)` для розкриття тексту символ за символом. `width: 0` спочатку приховує текст, а анімація `textRevealAnimation` поступово збільшує ширину, щоб розкрити весь текст. Налаштуйте `animation-range`, щоб контролювати, коли анімація розкриття тексту починається та закінчується.

Сумісність з браузерами та поліфіли

Часові шкали прокручування CSS є відносно новою технологією, і підтримка браузерами все ще розвивається. Станом на кінець 2023 року основні браузери, такі як Chrome та Edge, пропонують хорошу підтримку. Firefox та Safari активно працюють над впровадженням цієї функції. Важливо перевіряти поточну сумісність з браузерами перед впровадженням часових шкал прокручування у виробництво. Ви можете використовувати ресурси, такі як Can I use, для перевірки статусу підтримки.

Для браузерів, які не підтримують часові шкали прокручування нативно, ви можете використовувати поліфіли для забезпечення аналогічної функціональності. Поліфіл – це фрагмент коду JavaScript, який реалізує відсутню функцію за допомогою JavaScript. Існує кілька поліфілів для часових шкал прокручування CSS, що дозволяє вам використовувати цю функцію навіть у старих браузерах.

Аспекти доступності

Хоча анімації, керовані прокручуванням, можуть покращити досвід користувача, важливо враховувати доступність, щоб ваш вебсайт був доступним для всіх, включаючи користувачів з обмеженими можливостями.

Найкращі практики та поради

Ось деякі найкращі практики та поради для ефективного використання часових шкал прокручування CSS:

Глобальні аспекти дизайну анімації

При розробці анімацій для глобальної аудиторії пам'ятайте про наступні моменти:

Висновок

Часові шкали прокручування CSS пропонують потужний та ефективний спосіб створення захопливих та інтерактивних вебанімацій. Пов'язуючи прогрес анімації з позицією прокрутки, ви можете створювати досвід, який є більш динамічним, чутливим та зручним для користувача. Хоча підтримка браузерами все ще розвивається, переваги використання часових шкал прокручування CSS – покращена продуктивність, декларативний підхід та покращений досвід користувача – роблять їх цінним інструментом для сучасних веб розробників. Експериментуючи з часовими шкалами прокручування, не забувайте надавати пріоритет доступності та враховувати глобальний контекст вашої аудиторії для створення справді інклюзивного та захопливого вебдосвіду.

Прийміть цю захоплюючу нову технологію та відкрийте світ творчих можливостей для своїх вебпроєктів. Майбутнє вебанімації вже тут, і воно керується прокруткою!