— Сложно, но интересно🍡

В проекте над которым я работал столкнулся с очень интересной задачей, внизу мобильной страницы есть залипающая кнопка, требование было получить вот такой эффект: ✨
Когда пользователь прокручивает страницу на мобильном устройстве до определенной позиции, эта кнопка больше не должна быть липкой внизу, другими словами, она начнет следовать за прокруткой с этой позиции. .
Это выглядит сложно, но после некоторого анализа я обнаружил, что этого можно добиться с помощью следующих шагов, пример ниже:
☘️ Во-первых, присвойте этой закрепленной кнопке состояние видимости и идентификатор, чтобы мы могли ее найти.


☘️ Во-вторых, используйте видимое состояние для условного рендеринга этой залипающей кнопки, например:


☘️ Следующий шаг, чтобы отслеживать положение прокрутки пользователя мгновенно, мы можем добавить прослушиватель событий, который должен быть добавлен при монтировании компонента и удален при размонтировании компонента, давайте дадим ему имя «listenToScroll».
🌸 В функциональном компоненте React этот шаг можно реализовать с помощью useEffect

☘️ Последний шаг тоже самый интересный, мы реализуем эту функцию listenToScroll:
Нам понадобятся два значения выше 👇
- положение скрытия этой липкой кнопки (например, heightToHide)
- мгновенная позиция прокрутки пользователя (например, windowScrollHeight)
Нам нужно создать функцию, которая получает heightToHide (назовем ее getOffset) и сравнить ее с windowScrollHeight:
- если windowScrollHeight ‹ heightToHide, то липкая кнопка всегда будет отображаться внизу ⏹
- если windowScrollHeight › heightToHide, то липкая кнопка внизу должна исчезнуть, но до этого момента отображаться как кнопка не липкая, которая следует за прокруткой ⬆️


👉 Функция getOffset() выше использует метод getBoundingClientRect для получения информации о размере элемента и его позиции (в нашем случае ‹div › с идентификатором stickyButtonPlaceholder), информация содержит свойства left, top, right, bottom, x, y, width, height.
👓 Мы импортируем эту функцию с помощью import { getOffset } из «./getOffset» в наш компонент и выполняем ее с id div, чтобы получить позицию для скрытия — в нашем случае heightToHide.
👓 С помощью метода scrollTop мы можемполучить количество пикселей, на которое содержимое элемента прокручивается по вертикали — в нашем случае windowScrollHeight.
👉 Мы сравниваем эти два значения и обновляем состояние видимости липкой кнопки, а затем рендерим ее по условию!
🍄 Результат: прокрутите вверх до этого конкретного ‹div›, кнопка-липучка внизу исчезнет и начнет следовать за прокруткой с этой позиции в качестве кнопки замены.


Большое спасибо за ваше терпение в чтении моей статьи, я надеюсь, вам понравится. 👐
Если вам интересны другие мои статьи: