Механизм переходов в fullPage.js построен вокруг управления
прокруткой и трансформациями контейнеров секций. Каждая секция
(section) и слайд (slide) перемещаются либо с
помощью CSS-трансформаций (translate3d), либо через
стандартную прокрутку браузера (в режиме scrollBar: true).
Основной контроль осуществляется через внутренний движок, который
отслеживает текущую активную секцию, направление движения и состояние
анимации.
Ключевые параметры, влияющие на поведение переходов:
scrollingSpeed — скорость анимации (в
миллисекундах)easing и easingcss3 — функции
сглаживанияcss3 — использование CSS3-трансформацийautoScrolling — автоматическое управление
прокруткойfitToSection — принудительное выравнивание секции по
экрануПример базовой конфигурации:
new fullpage('#fullpage', {
autoScrolling: true,
scrollingSpeed: 1000,
easing: 'easeInOutCubic',
css3: true
});
Для создания сложных переходов стандартных функций часто недостаточно. Использование пользовательских easing-функций позволяет добиться уникальной динамики движения.
Через CSS:
.fp-section {
transition-timing-function: cubic-bezier(0.77, 0, 0.175, 1);
}
Через JavaScript (если отключён css3):
new fullpage('#fullpage', {
css3: false,
easing: 'easeInOutExpo'
});
Подключение сторонних библиотек, таких как jQuery Easing, расширяет набор доступных функций.
fullPage.js предоставляет систему событий (callbacks), позволяющую вмешиваться в процесс перехода:
onLeave — перед уходом с секцииafterLoad — после загрузки секцииafterRender — после инициализацииafterSlideLoad — при загрузке слайдаПример сложной логики:
new fullpage('#fullpage', {
onLeave: function(origin, destination, direction) {
if (direction === 'down') {
origin.item.classList.add('fade-out');
}
},
afterLoad: function(origin, destination) {
destination.item.classList.add('fade-in');
}
});
Для создания визуально сложных эффектов используется сочетание встроенных переходов fullPage.js и CSS-анимаций.
Пример:
.fade-in {
animation: fadeIn 1s forwards;
}
.fade-out {
animation: fadeOut 0.5s forwards;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(50px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes fadeOut {
from { opacity: 1; }
to { opacity: 0; }
}
Важно учитывать синхронизацию: длительность CSS-анимаций должна
совпадать или согласовываться с scrollingSpeed.
Для создания глубины интерфейса применяется параллакс — смещение элементов с разной скоростью.
Реализация через опцию parallax (в расширенной
версии):
new fullpage('#fullpage', {
parallax: true,
parallaxOptions: {
type: 'reveal',
percentage: 62,
property: 'translate'
}
});
Альтернативный подход — ручная реализация:
onLeave: function(origin, destination, direction) {
const elements = destination.item.querySelectorAll('.parallax');
elements.forEach(el => {
el.style.transform = `translateY(${destination.index * 50}px)`;
});
}
Сложные переходы часто требуют независимой анимации элементов внутри секций.
Подход через data-атрибуты:
<div class="section">
<h1 data-animate="fadeInUp">Заголовок</h1>
</div>
Jav * aScript:
afterLoad: function(origin, destination) {
const animated = destination.item.querySelectorAll('[data-animate]');
animated.forEach(el => {
const animation = el.dataset.animate;
el.classList.add(animation);
});
}
Для более сложных сценариев применяется библиотека GSAP.
Пример интеграции:
onLeave: function(origin, destination, direction) {
const tl = gsap.timeline();
tl.to(origin.item, {
opacity: 0,
y: -100,
duration: 0.5
});
tl.fromTo(destination.item,
{ opacity: 0, y: 100 },
{ opacity: 1, y: 0, duration: 0.5 }
);
}
Преимущества:
fullPage.js поддерживает горизонтальные слайды внутри секций, что позволяет создавать комбинированные переходы.
Пример структуры:
<div class="section">
<div class="slide">Слайд 1</div>
<div class="slide">Слайд 2</div>
</div>
Настройка:
new fullpage('#fullpage', {
controlArrows: true,
slidesNavigation: true
});
Добавление анимации:
afterSlideLoad: function(section, origin, destination) {
destination.item.classList.add('slide-active');
}
Один из сложных визуальных приёмов — разделение секции на части с независимой анимацией.
CSS:
.split {
display: flex;
}
.split .left,
.split .right {
width: 50%;
transition: transform 0.8s ease;
}
.split.animate .left {
transform: translateX(-100%);
}
.split.animate .right {
transform: translateX(100%);
}
JS:
afterLoad: function(origin, destination) {
const split = destination.item.querySelector('.split');
if (split) {
split.classList.add('animate');
}
}
Для сложных переходов важно управлять задержками появления элементов.
Пример:
afterLoad: function(origin, destination) {
const items = destination.item.querySelectorAll('.item');
items.forEach((el, index) => {
setTimeout(() => {
el.classList.add('visible');
}, index * 200);
});
}
Сложные переходы могут сильно нагружать систему. Основные рекомендации:
transform и opacity вместо
top/leftreflow)will-change для оптимизации:.animated {
will-change: transform, opacity;
}
Для полной кастомизации иногда отключают стандартную прокрутку:
new fullpage('#fullpage', {
autoScrolling: false,
scrollBar: true
});
После этого реализуется собственная логика переходов, используя события прокрутки:
window.addEventListener('scroll', () => {
const scrollY = window.scrollY;
document.querySelectorAll('.section').forEach((section, index) => {
section.style.transform = `translateY(${scrollY * 0.2 * index}px)`;
});
});
Для максимально сложных переходов используются WebGL (например, через Three.js).
Пример концепции:
onLeave запускается shader-анимацияonLeave: function(origin, destination, direction) {
startWebGLTransition(() => {
fullpage_api.moveTo(destination.index + 1);
});
return false; // блокировка стандартного перехода
}
При сложных сценариях важно управлять состояниями:
let isAnimating = false;
new fullpage('#fullpage', {
onLeave: function(origin, destination) {
if (isAnimating) return false;
isAnimating = true;
setTimeout(() => {
isAnimating = false;
}, 1000);
}
});
Это предотвращает наложение анимаций при быстром скролле.
Сложные переходы строятся на сочетании:
Пример комплексного подхода:
onLeave: function(origin, destination) {
const tl = gsap.timeline();
tl.to(origin.item, { scale: 0.8, opacity: 0, duration: 0.5 })
.fromTo(destination.item,
{ scale: 1.2, opacity: 0 },
{ scale: 1, opacity: 1, duration: 0.5 }
);
}
Такой подход позволяет создавать кинематографические переходы, приближенные к уровню современных лендингов и интерактивных презентаций.