Механизм прокрутки в Velocity.js основан на анимации числовых свойств
scrollTop и scrollLeft, а также на
специализированной команде scroll, которая абстрагирует
работу с DOM-контейнерами и окном браузера. В отличие от стандартного
window.scrollTo, библиотека добавляет поддержку очередей
анимаций, плавных кривых ускорения и синхронизации с другими
эффектами.
Прокрутка рассматривается как обычная анимация CSS-подобного свойства, где целевое значение задаётся числом, а текущее состояние интерполируется во времени.
Основной способ управления вертикальной прокруткой заключается в
изменении свойства scrollTop у элементов-контейнеров:
$("html, body").velocity({ scrollTop: 500 }, 800);
В данной модели:
html, body — универсальная связка для обеспечения
кроссбраузерной совместимостиscrollTop: 500 — целевая позиция прокрутки в
пикселях800 — длительность анимации в миллисекундахVelocity автоматически распределяет управление между элементами документа в зависимости от браузера.
Для горизонтального скролла используется свойство
scrollLeft:
$("#container").velocity({ scrollLeft: 300 }, 600);
Особенность горизонтальной прокрутки заключается в том, что она чаще
применяется к ограниченным контейнерам с
overflow-x: scroll, а не к глобальному окну документа.
Velocity.js включает специализированный режим scroll,
который упрощает работу с прокруткой и автоматически вычисляет
направление движения.
$("#section3").velocity("scroll", 1000);
При таком вызове элемент прокручивается в видимую область окна
браузера. Библиотека самостоятельно вычисляет необходимое значение
scrollTop.
Расширенная форма:
$("#section3").velocity("scroll", {
duration: 1200,
offset: -50
});
Свойство offset позволяет корректировать конечную
позицию прокрутки относительно элемента:
$("#header").velocity("scroll", {
duration: 700,
offset: -100
});
Логика применения:
При динамических интерфейсах offset часто задаётся
функцией:
$("#block").velocity("scroll", {
offset: function() {
return -$(".navbar").outerHeight();
}
});
Окно браузера и документ рассматриваются как единый scroll-контейнер. На практике применяется связка:
$("html, body").velocity({ scrollTop: 0 }, 1000);
или переход к элементу:
$("html, body").velocity("scroll", {
duration: 900
});
Поведение зависит от того, какой элемент в конкретном браузере отвечает за прокрутку страницы.
Свойство duration определяет время выполнения анимации и
может быть задано несколькими способами:
$("#box").velocity({ scrollTop: 1000 }, 500);
или объектной формой:
$("#box").velocity("scroll", {
duration: 1200
});
Допускается использование функций:
$("#box").velocity("scroll", {
duration: function() {
return Math.min(2000, Math.abs($(this).offset().top) / 2);
}
});
Такой подход позволяет адаптировать скорость прокрутки к расстоянию.
Кривая ускорения определяет характер движения скролла. Velocity поддерживает встроенные easing-функции:
$("#section").velocity("scroll", {
duration: 1000,
easing: "easeInOutQuart"
});
Типичные варианты:
linear — равномерное движениеeaseIn — ускорение в началеeaseOut — замедление в концеeaseInOut — комбинированная криваяПри прокрутке easing влияет на восприятие интерфейса сильнее, чем при обычных трансформациях, так как задействует глобальное перемещение viewport.
Velocity.js поддерживает скролл внутри ограниченных блоков с
overflow:
$("#scrollable").velocity({
scrollTop: 200
}, {
duration: 600
});
Ключевой особенностью является отсутствие необходимости обращаться к
html или body. Контейнер становится автономной
областью анимации.
При работе с вложенными контейнерами важно учитывать:
Прокрутка может выполняться в составе цепочек Velocity:
$("#panel")
.velocity({ opacity: 1 }, 300)
.velocity("scroll", { duration: 800 })
.velocity({ scale: 1.1 }, 200);
В таких сценариях scroll рассматривается как полноценный этап анимационной последовательности.
Очередь гарантирует последовательное выполнение без пересечений кадров анимации.
Velocity предоставляет события жизненного цикла анимации:
$("#page").velocity("scroll", {
duration: 1000,
begin: function() {
console.log("start");
},
progress: function(elements, complete) {
console.log(complete);
},
complete: function() {
console.log("done");
}
});
Используемые этапы:
begin — момент стартаprogress — обновление состоянияcomplete — завершениеprogress особенно важен для синхронизации интерфейсных
эффектов с движением прокрутки.
Любая активная анимация прокрутки может быть остановлена:
$("#container").velocity("stop");
или с очисткой очереди:
$("#container").velocity("stop", true);
Поведение:
true — очистка всей очередиЭто критично при динамических интерфейсах, где пользователь инициирует новые переходы до завершения старых.
При прокрутке окна:
html, bodyНа мобильных устройствах добавляется влияние нативного скролла, поэтому иногда применяется ограничение аппаратного ускорения:
$("html, body").velocity("scroll", {
duration: 800,
mobileHA: false
});
Прокрутка относится к операциям, влияющим на layout и compositing. Оптимизация достигается за счёт:
requestAnimationFrame внутри
VelocityРекомендуется избегать одновременного изменения
scrollTop и тяжёлых CSS-свойств на одном элементе.
Хотя прокрутка не является CSS transform, она часто комбинируется с другими анимациями:
$("#item").velocity({
opacity: 1,
translateY: 0
}, 500);
$("#item").velocity("scroll", {
duration: 800
});
Комбинация позволяет создавать эффект плавного появления контента при движении страницы.
Целевое значение может быть вычислено на основе состояния DOM:
$("html, body").velocity({
scrollTop: $("#target").offset().top
}, 900);
При сложных интерфейсах учитываются дополнительные параметры:
При последовательных вызовах:
$("html, body")
.velocity({ scrollTop: 300 }, 400)
.velocity({ scrollTop: 800 }, 400);
формируется очередь, где каждое значение выполняется строго после завершения предыдущего.
При отключении очереди:
$("html, body").velocity({ scrollTop: 800 }, { queue: false });
анимация выполняется параллельно с другими эффектами, что может приводить к конкуренции за управление scroll-свойством.
Прокрутка в Velocity.js рассматривается не как изолированная операция, а как компонент общей системы анимаций интерфейса, где важны:
Такой подход позволяет использовать scroll как инструмент построения сцены интерфейса, а не просто механическое перемещение страницы.