Интеграция fullPage.js в существующую дизайн-систему требует согласования поведения скроллинга, визуальной иерархии и токенов интерфейса (цвета, отступы, типографика, анимации). Основная задача — сделать полноэкранную прокрутку частью общей системы, а не изолированным компонентом.
Ключевые аспекты:
fullPage.js строит интерфейс на основе секций (.section)
и слайдов (.slide). В дизайн-системе эти сущности должны
быть приведены к единому layout-подходу.
<div id="fullpage">
<section class="section layout-section">
<div class="container">
<h1 class="heading-xl">Заголовок</h1>
<p class="text-body">Контент</p>
</div>
</section>
<section class="section layout-section theme-dark">
<div class="container">
<h2 class="heading-lg">Вторая секция</h2>
</div>
</section>
</div>
.section не должна напрямую содержать контент —
используется промежуточный .containerВсе визуальные параметры должны быть привязаны к переменным дизайн-системы.
:root {
--color-bg-light: #ffffff;
--color-bg-dark: #0f172a;
--spacing-lg: 32px;
--spacing-xl: 64px;
--transition-base: 300ms ease;
}
.section {
padding: var(--spacing-xl);
background-color: var(--color-bg-light);
transition: background-color var(--transition-base);
}
.section.theme-dark {
background-color: var(--color-bg-dark);
}
new fullpage('#fullpage', {
scrollingSpeed: 700, // синхронизировать с motion tokens
});
Полноэкранные секции часто нарушают вертикальный ритм, если не учитывать правила дизайн-системы.
.heading-xl {
font-size: 48px;
line-height: 1.2;
}
.text-body {
font-size: 16px;
line-height: 1.6;
max-width: 640px;
}
fullPage.js предоставляет встроенные переходы между секциями, но они должны соответствовать motion-системе.
new fullpage('#fullpage', {
scrollingSpeed: 600,
easing: 'easeInOutCubic',
css3: true
});
motion-duration-base).section .content {
opacity: 0;
transform: translateY(40px);
transition: all 0.5s ease;
}
.section.active .content {
opacity: 1;
transform: translateY(0);
}
fullPage.js активно работает с классами (active,
fp-viewing-*), что удобно для переключения тем.
new fullpage('#fullpage', {
onLeave: function(origin, destination) {
document.body.setAttribute('data-theme', destination.item.dataset.theme);
}
});
<section class="section" data-theme="dark"></section>
<section class="section" data-theme="light"></section>
body[data-theme="dark"] {
--color-bg: #000;
--color-text: #fff;
}
body[data-theme="light"] {
--color-bg: #fff;
--color-text: #000;
}
Каждая секция должна рассматриваться как независимый компонент дизайн-системы.
<section class="section hero">
<div class="container hero__content">
<h1 class="hero__title">Продукт</h1>
<button class="btn btn-primary">Начать</button>
</div>
</section>
.hero {
display: flex;
align-items: center;
min-height: 100%;
}
fullPage.js генерирует навигацию (#fp-nav), которую
необходимо привести к стандартам дизайн-системы.
#fp-nav ul li a span {
background: var(--color-primary);
width: 8px;
height: 8px;
}
#fp-nav ul li a.active span {
transform: scale(1.5);
}
По умолчанию fullPage.js плохо сочетается с мобильными паттернами, поэтому требуется адаптация.
new fullpage('#fullpage', {
responsiveWidth: 768,
autoScrolling: true
});
afterResponsive: function(isResponsive) {
if (isResponsive) {
console.log('Обычный скролл');
}
}
Полноэкранный скроллинг может нарушать доступность, если не учитывать правила.
new fullpage('#fullpage', {
keyboardScrolling: true,
animateAnchor: true
});
<section class="section" aria-label="Раздел 1"></section>
Состояния компонентов (hover, active, disabled) должны совпадать с глобальными правилами.
.btn {
transition: background var(--transition-base);
}
.btn:hover {
background: var(--color-primary-hover);
}
onLeave: function(origin, destination) {
document.body.classList.remove('section-' + origin.index);
document.body.classList.add('section-' + destination.index);
}
Полноэкранный формат требует строгого контроля плотности информации.
При использовании UI-фреймворков (React, Vue) важно сохранять соответствие дизайн-системе.
import ReactFullpage from '@fullpage/react-fullpage';
<ReactFullpage
scrollingSpeed={600}
render={() => (
<ReactFullpage.Wrapper>
<div className="section">
<Component />
</div>
</ReactFullpage.Wrapper>
)}
/>
Проверка соответствия дизайн-системе включает: