Отслеживание изменения состояния

Библиотека Stickybits предоставляет удобный инструмент для реализации “липких” элементов на веб-странице, которые фиксируются при прокрутке. Одной из ключевых возможностей является отслеживание изменения состояния элемента — например, перехода между обычным положением, фиксированным состоянием и состоянием «закреплён внизу». Stickybits предлагает встроенные события и методы для работы с этим.


Состояния элемента

Элемент, к которому применён Stickybits, может находиться в нескольких состояниях:

  1. default – начальное состояние, элемент находится в потоке документа, не фиксирован.
  2. sticky – элемент фиксируется в верхней части области просмотра при прокрутке.
  3. stuck – элемент достиг нижнего края родительского контейнера и больше не прокручивается с прокруткой страницы.

Каждое из этих состояний задаётся автоматически библиотекой в процессе прокрутки. Для взаимодействия с этими состояниями Stickybits использует классы и события.


Классы состояния

Stickybits автоматически добавляет CSS-классы для обозначения текущего состояния элемента:

  • .js-is-sticky – применяется, когда элемент фиксируется.
  • .js-is-stuck – применяется, когда элемент «прилипает» к нижней границе контейнера.
  • .js-is-default – применяется, когда элемент находится в исходном положении.

Эти классы позволяют управлять стилями через CSS без дополнительного JavaScript-кода. Например:

.sticky-element.js-is-sticky {
  background-color: #f0f0f0;
  box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}

.sticky-element.js-is-stuck {
  background-color: #e0e0e0;
}

Отслеживание состояния через события

Stickybits предоставляет возможность подписки на события изменения состояния элемента. События генерируются при каждом переходе между состояниями:

const sticky = Stickybits('.sticky-element', { stickyBitStickyOffset: 0 });

sticky.onStickyStateCha nge = function(state) {
  console.log('Текущее состояние элемента:', state);
};

Значения state могут быть:

  • 'default' – элемент в обычном положении;
  • 'sticky' – элемент закреплён;
  • 'stuck' – элемент достиг нижнего края контейнера.

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


Отслеживание через коллбэк onStick и onUnstick

Stickybits поддерживает отдельные коллбэки для более точечного управления:

Stickybits('.sticky-element', {
  onStick: function() {
    console.log('Элемент теперь фиксирован');
  },
  onUnstick: function() {
    console.log('Элемент перестал быть фиксирован');
  }
});
  • onStick вызывается, когда элемент входит в состояние sticky.
  • onUnstick вызывается, когда элемент возвращается в состояние default или достигает stuck.

Эти функции особенно полезны для интеграции с анимациями или управления классами вручную, если требуется более сложная логика.


Использование Stickybits.update()

При динамическом изменении DOM (например, добавлении новых элементов или изменении размеров контейнера) важно обновлять вычисления Stickybits, чтобы корректно отслеживать состояния:

sticky.update();

Метод update() пересчитывает позиции и размеры контейнера и элемента, что предотвращает некорректное срабатывание классов и событий.


Пример комплексного отслеживания состояния

const stickyElement = Stickybits('.sticky-element', { stickyBitStickyOffset: 10 });

stickyElement.onStickyStateCha nge = function(state) {
  switch(state) {
    case 'default':
      console.log('Элемент в исходном положении');
      break;
    case 'sticky':
      console.log('Элемент закреплён');
      break;
    case 'stuck':
      console.log('Элемент достиг низа контейнера');
      break;
  }
};

В этом примере создаётся единый обработчик, который реагирует на любое изменение состояния элемента. Такая организация кода упрощает управление сложными интерфейсами с множеством липких блоков.


Советы по производительности

  1. Минимизировать обработку на каждом событии прокрутки – события состояния генерируются часто, поэтому тяжелая логика в коллбэках может замедлять страницу.
  2. Использовать CSS для визуальных изменений, а JavaScript — только для динамических действий.
  3. Вызов update() только при необходимости, например, после изменения размера контейнера или добавления новых элементов.

Stickybits обеспечивает прозрачное управление состояниями и гибкую систему событий. Правильное использование классов, коллбэков и методов обновления позволяет создавать сложные интерфейсы с динамическими липкими элементами, поддерживая чистый и поддерживаемый код.