Как можно создать параллельный эффект прокрутки в блоке, чтобы элементы находились в движении одновременно?

Можете помочь мне создать логику для скролла меню сайдбара параллельно со скроллом окна?

САБЖ:
У меня есть макет, в котором есть длинное боковое меню, которое упаковано в блок, и его можно прокручивать. При прокрутке окна, после заголовка, сайдбар прилипает к верху окна и начинает прокручиваться самостоятельно.

ПРОБЛЕМА:
Если пользователь самостоятельно прокрутит сайдбар и затем вернется к прокрутке окна, сайдбар автоматически "прыгнет" на текущую позицию прокрутки окна, что не удобно.

ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ:
Запомнить, куда пользователь прокрутил сайдбар, и продолжать прокручивание с этой позиции только в том случае, если сайдбар еще не прокручен до конца.

То же самое должно происходить и при прокрутке окна вверх.

Я не могу найти адекватную логику для реализации этого. Пожалуйста, помогите мне.

Песочница:
сниппет

Заранее спасибо!
  • 7 октября 2023 г. 12:08
Ответы на вопрос 2
Привет! Для реализации параллельного скролла в блоке сайдбара, следующая логика может быть полезной:

1. Создайте обработчик события скролла для окна:

```javascript
window.addEventListener('scroll', handleScroll);
```

2. В обработчике скролла определите текущую позицию скролла окна и сохраните ее в переменную:

```javascript
let previousScrollPosition = window.scrollY;
```

3. В обработчике скролла также определите текущую позицию скролла сайдбара и сохраните ее в другую переменную:

```javascript
let sidebarScrollPosition = sidebar.scrollTop;
```

4. Если позиция скролла окна изменилась по сравнению с предыдущей позицией, то измените позицию скролла сайдбара на разницу между текущей и предыдущей позициями скролла окна:

```javascript
if (window.scrollY !== previousScrollPosition) {
  sidebar.scrollTop += window.scrollY - previousScrollPosition;
}
```

5. Обновите переменную `previousScrollPosition` новой текущей позицией скролла окна:

```javascript
previousScrollPosition = window.scrollY;
```

6. Проверьте, прокручен ли сайдбар до конца. Если да, выключите прокрутку скролла сайдбара:

```javascript
if (sidebar.offsetHeight + sidebar.offsetTop >= sidebar.scrollHeight) {
  sidebar.style.overflow = 'hidden';
} else {
  sidebar.style.overflow = 'scroll';
}
```

Теперь вы можете применить эту логику к вашему сайдбару и скроллу окна.
.sidebar__scroller должна быть без стикеров и вместо этого .sidebar должна иметь следующие стили: position: sticky; left: 0; top: 0; height: fit-content;
Похожие вопросы