Для начала необходимо подключить Barba.js к проекту. Библиотека распространяется через npm и CDN. Рекомендуется использовать npm для современных проектов:
npm install @barba/core
После установки можно импортировать библиотеку в Jav * aScript:
import barba from '@barba/core';
Для работы с переходами между страницами достаточно одного файла
barba.js. Если используется CDN, подключение происходит
через стандартный тег <script>:
<script src="https://unpkg.com/@barba/core"></script>
Barba.js работает на основе контейнеров
(barba-container) и областей (barba-wrapper),
которые содержат основной контент страницы. Структура HTML должна
учитывать это:
<div id="barba-wrapper">
<div class="barba-container">
<!-- Основной контент страницы -->
</div>
</div>
Базовая инициализация выполняется с помощью функции
barba.init:
barba.init({
transitions: [
{
name: 'fade',
leave(data) {
return gsap.to(data.current.container, {
opacity: 0,
duration: 0.5
});
},
enter(data) {
return gsap.from(data.next.container, {
opacity: 0,
duration: 0.5
});
}
}
]
});
Ключевые моменты:
name – уникальное имя перехода.leave – вызывается при уходе с текущей страницы.enter – вызывается при загрузке следующей
страницы.data.current.container – DOM текущего контейнера.data.next.container – DOM следующего контейнера.Для анимаций удобно использовать библиотеки вроде GSAP, однако Barba.js не требует их обязательного использования.
Barba.js предоставляет хуки для расширенного контроля жизненного цикла переходов:
before – выполняется перед началом перехода.beforeLeave – перед уходом со страницы.leave – анимация выхода.afterLeave – после ухода со страницы.beforeEnter – перед загрузкой нового контейнера.enter – анимация входа.afterEnter – после загрузки нового контейнера.after – после завершения всего перехода.Пример использования хуков:
barba.hooks.before(() => {
console.log('Начало перехода');
});
barba.hooks.after(() => {
console.log('Переход завершен');
});
Хуки позволяют запускать функции, такие как повторная инициализация скриптов, lazy-load изображений или инициализация скролла.
Barba.js поддерживает namespace — уникальные
идентификаторы страниц. Это позволяет задавать разные анимации для
разных страниц.
<div class="barba-container" data-barba-namespace="home">
<!-- Контент главной страницы -->
</div>
barba.init({
views: [
{
namespace: 'home',
beforeEnter() {
console.log('Инициализация главной страницы');
}
},
{
namespace: 'about',
beforeEnter() {
console.log('Инициализация страницы "О нас"');
}
}
]
});
Использование namespace особенно важно для проектов с
различными интерактивными блоками на каждой странице.
Barba.js поддерживает загрузку контента через AJAX, что ускоряет переходы без перезагрузки всей страницы. Для этого необходимо настроить сервер и правильно структурировать HTML:
barba.init({
transitions: [
{
async leave(data) {
await gsap.to(data.current.container, { opacity: 0 });
},
async enter(data) {
await gsap.from(data.next.container, { opacity: 0 });
}
}
]
});
Асинхронные функции позволяют выполнять дополнительные действия, например, подгружать данные через fetch перед отображением нового контейнера.
Barba.js отлично сочетается с GSAP и другими библиотеками анимаций.
Основная схема: анимации выхода применяются к старому контейнеру, а
входные — к новому. Можно использовать сложные цепочки анимаций с
timeline:
leave(data) {
const tl = gsap.timeline();
tl.to(data.current.container, { opacity: 0, y: -50, duration: 0.5 });
tl.to('.loader', { opacity: 1, duration: 0.3 }, '-=0.3');
return tl;
},
enter(data) {
const tl = gsap.timeline();
tl.from(data.next.container, { opacity: 0, y: 50, duration: 0.5 });
tl.to('.loader', { opacity: 0, duration: 0.3 }, '-=0.3');
return tl;
}
При переходах с помощью Barba.js скрипты внутри контейнера старой
страницы уничтожаются, а новые не всегда запускаются автоматически. Для
исправления этого используются хуки beforeEnter и
afterEnter:
barba.hooks.afterEnter(() => {
initSlider();
initAnimations();
});
Это позволяет поддерживать интерактивные элементы на всех страницах без дублирования кода.
Barba.js ускоряет взаимодействие за счет того, что перезагружается только контейнер, а не вся страница. Для оптимизации можно:
prefetch для заранее загрузки следующих
страниц.По умолчанию Barba.js перехватывает клики на все ссылки внутри
контейнера. Для исключения внешних ссылок или якорей используется
prevent:
barba.init({
prevent: ({ href }) => href.startsWith('http') || href.includes('#')
});
Это гарантирует, что переходы выполняются только между внутренними страницами проекта.
При интеграции с Locomotive Scroll важно:
barba.hooks.afterEnter(() => {
scroll.update();
});
Такой подход обеспечивает плавные переходы и синхронизацию со скроллом без потери производительности.