Библиотека fullPage.js изначально ориентирована на статическую
разметку, где каждая секция (.section) заранее присутствует
в DOM. Однако современные приложения требуют гибкости: загрузка контента
с сервера, генерация интерфейса на основе пользовательских действий,
ленивое добавление блоков. В таких случаях возникает необходимость
динамического создания и удаления секций.
Ключевая особенность fullPage.js — внутреннее кэширование структуры страницы. Любые изменения DOM без уведомления библиотеки приводят к рассинхронизации: навигация ломается, якоря работают некорректно, прокрутка становится нестабильной. Поэтому работа с динамическими секциями требует использования встроенных методов API.
addSectionОсновной инструмент для добавления секций — метод
fullpage_api.addSection().
Синтаксис:
fullpage_api.addSection(htmlString, index);
Параметры:
htmlString — строка HTML с разметкой новой секцииindex — позиция вставки (необязательный параметр, по
умолчанию — в конец)Пример:
fullpage_api.addSection(`
<div class="section">
<h2>Новая секция</h2>
<p>Динамически добавленный контент</p>
</div>
`);
После выполнения метода:
Добавление секции в середину структуры требует указания индекса:
fullpage_api.addSection(`
<div class="section">
<h2>Вставленная секция</h2>
</div>
`, 2);
Индексация начинается с нуля:
0 — первая секция1 — вторая и т.д.При вставке:
Для удаления используется метод:
fullpage_api.removeSection(index);
Пример:
fullpage_api.removeSection(1);
Особенности:
Частый сценарий — создание секций из массива данных:
const sectionsData = [
{ title: "Секция 1", content: "Контент 1" },
{ title: "Секция 2", content: "Контент 2" }
];
sectionsData.forEach(item => {
fullpage_api.addSection(`
<div class="section">
<h2>${item.title}</h2>
<p>${item.content}</p>
</div>
`);
});
Подход применяется при:
Существует альтернативный подход — полная пересборка:
fullpage_api.destroy('all');
// изменение DOM вручную
new fullpage('#fullpage', options);
Сравнение подходов:
| Подход | Преимущества | Недостатки |
|---|---|---|
addSection |
Быстро, без перезапуска | Ограниченная гибкость |
destroy + init |
Полный контроль | Потеря состояния, дорого по ресурсам |
Предпочтение отдается addSection, если не требуется
радикальное изменение структуры.
Для корректной навигации используются якоря
(anchors):
fullpage_api.addSection(`
<div class="section" data-anchor="dynamic">
<h2>С якорем</h2>
</div>
`);
После добавления:
#dynamicfullpage_api.moveTo('dynamic');
Важно:
Если секция добавляется без использования API (например, через
appendChild), необходимо вызвать:
fullpage_api.reBuild();
Этот метод:
Однако такой подход менее надежен, чем addSection.
Оптимизация производительности достигается через отложенное добавление:
document.addEventListener('scroll', () => {
if (условие) {
fullpage_api.addSection(`
<div class="section">
<h2>Поздняя загрузка</h2>
</div>
`);
}
});
Применяется при:
Помимо вертикальных секций, поддерживаются слайды
(.slide):
fullpage_api.addSlide(htmlString, sectionIndex, slideIndex);
Пример:
fullpage_api.addSlide(`
<div class="slide">
<h3>Новый слайд</h3>
</div>
`, 0, 1);
После добавления секций важно учитывать:
active)Иногда требуется принудительное обновление:
fullpage_api.moveTo(fullpage_api.getActiveSection().index);
1. Добавление без класса .section
<div>...</div> <!-- не будет распознано -->
2. Прямое изменение DOM без
reBuild()
3. Дублирование якорей
4. Нарушение структуры вложенности
Правильная структура:
<div id="fullpage">
<div class="section">
<div class="slide">...</div>
</div>
</div>
В React/Vue динамика часто реализуется через состояние:
React пример:
useEffect(() => {
new fullpage('#fullpage', options);
}, []);
useEffect(() => {
fullpage_api.reBuild();
}, [sections]);
Ключевая идея:
При большом количестве динамических секций:
Рекомендуется:
reBuild()После добавления секций продолжают работать стандартные события:
new fullpage('#fullpage', {
afterLoad: function(origin, destination) {
console.log(destination.index);
}
});
Новые секции автоматически участвуют в жизненном цикле.
function createSection(title, content) {
return `
<div class="section">
<h2>${title}</h2>
<p>${content}</p>
</div>
`;
}
function addNewSection(data) {
const html = createSection(data.title, data.content);
fullpage_api.addSection(html);
}
Такой подход: