Индикатор чтения, управляемый прокруткой, на чистом CSS
Давайте заглянем в будущее и познакомимся с экспериментальной технологией, которая позволяет делать анимации, привязанные к скроллу, на чистом CSS.
Демонстрацию лучше смотреть в браузере Chrome.
Мы будем делать индикатор прочтения статьи, который будет заполняться по мере чтения (то есть по мере прокрутки страницы). Сначала добавим в разметку элемент .progress
.
Зададим индикатору размеры и фоновый цвет.
Чтобы индикатор всегда был виден на экране, зададим ему фиксированное позиционирование и привяжем к верху вьюпорта. В реальных проектах можно указать z-index
, чтобы полоса точно была видна, но для демонстрации это не потребуется.
Чтобы удостовериться, что полоса видна прокрутите страницу вниз.
Индикатор прогресса чтения должен заполняться слева направо, а для этого ширина элемента .progress
должна изменяться с 0
старте чтения до 100%
в конце статьи.
Размером индикатора будем управлять с помощью CSS-трансформации scaleX
, зашитой внутрь CSS-анимации grow-progress
:
Применим к индикатору анимацию grow-progress
с линейной скоростью проигрывания.
Свойству animation-duration
нужно задать значение auto
, так анимация будет привязана не ко времени, а к состоянию скролла. Для этого нужно создать таймлайн или временную шкалу прокрутки.
Создадим временную шкалу прокрутки с помощью свойства scroll-timeline
.
Зададим ей имя --page-scroll
. Оно обязано начинаться с --
. Значение block
означает, что шкала привязана к вертикальной оси прокрутки.
Временная шкала задана для html
, так как мы хотим отслеживать прокрутку всей страницы.
А теперь свяжем временную шкалу анимации с временной шкалой прокрутки.
Для этого укажем в свойстве animation-timeline
название временной шкалы прокрутки, то есть --page-scroll
.
Покрутите страницу, чтобы убедиться, что анимация работает. Лучше использовать браузер Chrome
Изменим значение transform-origin
у индикатора, чтобы начало трансформации было привязано к левому краю блока.
Теперь можно уменьшить высоту индикатора, чтобы шкала прогресса не отвлекала от чтения текста.
Демонстрация завершена.