Метод update() при изменении DOM

Метод update() в библиотеке Locomotive Scroll предназначен для синхронизации состояния скролла с текущей структурой DOM. Он необходим в случаях, когда в документ динамически добавляются, удаляются или изменяются элементы, влияющие на размеры контента и положение прокрутки. Без вызова этого метода библиотека может работать некорректно: элементы с атрибутами data-scroll, data-scroll-speed или data-scroll-sticky могут неправильно позиционироваться, а анимации могут срабатывать не в том месте.

scroll.update();

Метод вызывается без аргументов и не возвращает значения. Его задача — пересчитать все позиции и размеры элементов, участвующих в скролле, и обновить внутренние кэши Locomotive Scroll.


Когда необходимо использовать update()

  • Добавление новых элементов в DOM Если после инициализации скролла в контейнер добавляются новые блоки с атрибутами data-scroll, их позиции не будут учтены автоматически. Вызов update() позволяет библиотеке «узнать» о новых элементах.

  • Удаление или изменение размеров элементов Изменение контента может привести к смещению других элементов. Метод пересчитывает позиции, чтобы прокрутка оставалась точной.

  • Динамическая загрузка контента При использовании AJAX или других методов подгрузки элементов на страницу метод update() позволяет корректно интегрировать новые блоки в текущий скролл.

  • Изменение размеров окна или контейнера Хотя Locomotive Scroll автоматически отслеживает ресайз, иногда после сложных манипуляций с DOM требуется явный вызов update() для точного расчета новых координат.


Как работает update()

Locomotive Scroll хранит внутренние кэши размеров и координат всех элементов с атрибутами скролла. Когда вызывается update(), происходит следующее:

  1. Сбор актуальных элементов Все элементы с data-scroll, data-scroll-speed, data-scroll-sticky собираются заново.
  2. Пересчет координат и размеров Для каждого элемента вычисляется положение относительно контейнера и документа.
  3. Обновление внутренних кэшей Локальные позиции и размеры сохраняются для использования при прокрутке.
  4. Перезапуск скролл-событий Если элементы имеют привязанные события типа scroll или call, они корректно реагируют на новую структуру DOM.

Примеры использования

Пример 1: добавление элемента через JavaScript

const newSection = document.createElement('section');
newSection.setAttribute('data-scroll', '');
newSection.textContent = "Новая секция";

document.querySelector('#scroll-container').appendChild(newSection);

// Обновление Locomotive Scroll
scroll.update();

Пример 2: удаление элемента

const sectionToRemove = document.querySelector('.old-section');
sectionToRemove.remove();

// Пересчет позиций после удаления
scroll.update();

Пример 3: изменение размеров блока

const resizableBox = document.querySelector('.resizable');
resizableBox.style.height = '500px';

// Обновление координат элементов
scroll.update();

Важные нюансы и рекомендации

  • Не злоупотреблять частым вызовом Частый вызов update() на больших страницах может снижать производительность. Лучше объединять несколько изменений DOM и вызывать метод один раз после всех изменений.

  • Использовать после асинхронных операций Если элементы подгружаются динамически через fetch, AJAX или WebSocket, update() следует вызывать после того, как новые элементы полностью вставлены в DOM.

  • Связь с методом refresh() Метод refresh() также обновляет позиции, но кроме этого инициирует ресайз контейнера и пересчет всех внутренних размеров. Для простых изменений DOM достаточно update().

  • Влияние на анимации Элементы с анимацией, привязанной к прокрутке (data-scroll-call, data-scroll-class), начинают корректно срабатывать только после пересчета. Это особенно важно для страниц с ленивой загрузкой изображений.


Совместимость с другими методами

Метод update() тесно связан с событиями Locomotive Scroll:

  • scroll.scrollTo() — после вызова update() можно корректно использовать прокрутку к новым элементам.
  • scroll.on('scroll', callback) — позиции элементов будут точными только после обновления.
  • scroll.update() можно безопасно вызывать несколько раз подряд; библиотека корректно пересчитает позиции без дублирования.

Метод update() является ключевым инструментом для поддержки динамических интерфейсов при использовании Locomotive Scroll, обеспечивая точность анимаций и позиционирования элементов даже в условиях активно изменяемого DOM.