fullPage.js управляет прокруткой на уровне секций и слайдов, перехватывая нативный scroll и заменяя его на контролируемую навигацию. Это означает, что любые сторонние анимации должны синхронизироваться не с прокруткой страницы, а с событиями, генерируемыми библиотекой.
Ключевые точки интеграции:
Жизненный цикл секции:
afterLoadonLeaveЖизненный цикл слайда:
afterSlideLoadonSlideLeaveЭти события служат триггерами для запуска или остановки анимаций.
GSAP (GreenSock Animation Platform) — один из наиболее мощных инструментов для анимации. Его использование с fullPage.js позволяет создавать сложные последовательности с высокой производительностью.
new fullpage('#fullpage', {
afterLoad: function(origin, destination, direction) {
if (destination.index === 1) {
gsap.from('.box', { opacity: 0, y: 100, duration: 1 });
}
},
onLeave: function(origin, destination, direction) {
if (origin.index === 1) {
gsap.to('.box', { opacity: 0, y: -100, duration: 0.5 });
}
}
});
Для сложных сцен используется gsap.timeline():
let tl = gsap.timeline({ paused: true });
tl.from('.title', { y: 50, opacity: 0 })
.from('.subtitle', { y: 50, opacity: 0 }, "-=0.3")
.from('.image', { scale: 0.8, opacity: 0 }, "-=0.5");
new fullpage('#fullpage', {
afterLoad: function(origin, destination) {
if (destination.index === 2) {
tl.play();
}
},
onLeave: function(origin) {
if (origin.index === 2) {
tl.reverse();
}
}
});
GSAP ScrollTrigger не работает напрямую с fullPage.js, так как последний отключает нативный scroll. Возможные решения:
scrollOverflow: true для внутреннего
скроллаScrollTrigger.update()anime.js удобен для декларативных анимаций и последовательностей.
new fullpage('#fullpage', {
afterLoad: function(origin, destination) {
if (destination.index === 0) {
anime({
targets: '.circle',
scale: [0, 1],
opacity: [0, 1],
duration: 800,
easing: 'easeOutBack'
});
}
}
});
const animation = anime({
targets: '.item',
translateX: 250,
autoplay: false
});
new fullpage('#fullpage', {
afterLoad: (origin, destination) => {
if (destination.index === 3) animation.play();
},
onLeave: (origin) => {
if (origin.index === 3) animation.pause();
}
});
AOS ориентирован на события прокрутки, поэтому требует адаптации.
AOS.init({
disable: true
});
new fullpage('#fullpage', {
afterLoad: function() {
AOS.refreshHard();
}
});
Lottie позволяет использовать JSON-анимации, экспортированные из After Effects.
const anim = lottie.loadAnimation({
container: document.getElementById('lottie'),
renderer: 'svg',
loop: false,
autoplay: false,
path: 'animation.json'
});
new fullpage('#fullpage', {
afterLoad: function(origin, destination) {
if (destination.index === 1) {
anim.goToAndPlay(0, true);
}
},
onLeave: function(origin) {
if (origin.index === 1) {
anim.stop();
}
}
});
fullPage.js активно использует классы:
activefp-completelyЭто позволяет запускать CSS-анимации без JavaScript.
.section .fade-in {
opacity: 0;
transform: translateY(30px);
transition: all 0.6s ease;
}
.section.active .fade-in {
opacity: 1;
transform: translateY(0);
}
.section.active .item:nth-child(1) { transition-delay: 0.2s; }
.section.active .item:nth-child(2) { transition-delay: 0.4s; }
.section.active .item:nth-child(3) { transition-delay: 0.6s; }
При использовании нескольких библиотек важно избегать рассинхронизации:
Анимации должны:
Использовать флаги:
let played = false;
afterLoad: function(origin, destination) {
if (destination.index === 2 && !played) {
startAnimation();
played = true;
}
}
Одновременное использование нескольких библиотек может привести к:
will-changeonLeavefullPage.js не ожидает завершения анимаций. Для контроля:
onLeave: function(origin, destination, direction) {
return new Promise(resolve => {
gsap.to('.box', {
opacity: 0,
duration: 1,
onComplete: resolve
});
});
}
Важно учитывать, что не все версии fullPage.js поддерживают
асинхронные возвраты — иногда требуется блокировка вручную через
setAllowScrolling(false).
Пример одновременного использования GSAP и Lottie:
afterLoad: function(origin, destination) {
if (destination.index === 4) {
gsap.from('.text', { y: 50, opacity: 0 });
lottieAnim.play();
}
}
Анимации не запускаются
Резкие переходы
Дублирование анимаций
Конфликты transform
transform одного
элементаfunction initSection1() {
return gsap.timeline({ paused: true });
}
const sectionAnimations = {
0: initSection1(),
1: initSection2()
};
afterLoad: function(origin, destination) {
sectionAnimations[destination.index]?.play();
}
const state = {
animations: {},
initialized: {}
};
Внутри секций с прокруткой (scrollOverflow: true) можно
использовать Intersection Observer:
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
animate(entry.target);
}
});
});
Проверка:
Использование:
console.log в событиях fullPage.jsВременное отключение анимаций для изоляции проблем
С помощью GSAP:
afterLoad: function(origin, destination) {
gsap.to('.bg', {
y: -100,
scrollTrigger: false
});
}
Комбинация событий мыши и fullPage.js:
document.addEventListener('mousemove', e => {
gsap.to('.cursor', {
x: e.clientX,
y: e.clientY
});
});
При динамической подгрузке секций:
fullpage_api.reBuild();
Анимации должны инициализироваться повторно.