TGViewer
SuperOleg dev notes SuperOleg dev notes @super_oleg_dev · 1.75K subscribers
Post #239 549
Далее, про скролл.

В принципе для SPA-приложений это база, если при переходах на разные страницы мы не хотим оставаться в одной позиции скролла, нам нужно самостоятельно скроллить вверх страницы.

Кажется есть функционал во всех роутерах и мета-фреймворках, и как отдельные либы.

В Tramvai был старый модуль, который умел вызвать scroll top или к якорю, с логикой что бы срабатывал строго один раз после перехода.

Из коробки проблема опять таки при браузерных back/forward, в этих случаях мы хотим восстановить позицию скролла, а не сбросить ее наверх.

И конечно кейсы с виртуальными списками / пагинацией, но это уже немного out of scope, кажется тут лучше якорей ничего нет.

Но мы словили ещё интересную проблему:
- у страницы очень тяжёлый рендер
- браузер детектит soft navigation до отрисовки и делает восстановление скролла
- наш автоскролл не попадает в этот paint и у пользователя скачет скролл на одном экране

Зеркальная проблема, если автоскролл сработал до отрисовки текущего экрана а браузер восстановил скролл после paint события, которое стриггерил реакт при рендере следующего экрана.

Я долго возился с отключением/включением браузерного механизма восстановления при разных условиях для разных записей в history, все стало работать на первый взгляд идеально, а потом я включил example с View Transitions...

Потратил ещё больше времени, но все время упираюсь в одну проблему - браузерное восстановление скролла и анимация не синхронизируются, попадают в разные paint, какие бы хаки я там не делал, включая оборачивание скролла в rAF.

Пришел к тому что единственный способ рабочий это:
- браузерный механизм отключить полностью
- сохранять позицию скролла для каждой записи в history вручную
- восстанавливать/сбрасывать ее тоже полностью вручную

Так как возможны переходы вида history.go(-2), в session storage для каждой навигации (по индексу) храню позицию скролла.

Отдельно пришлось повозиться, снова, с браузерными back/forward - о переходе узнаешь пост-фактум, history уже изменен, и как раз плюсом стало хранение позиции скролла в session storage.

Работает как часы, кастомизируется, но дебажить такое это конечно никакого удовольствия - https://github.com/tramvaijs/tramvai/blob/main/packages%2Fmodules%2Fautoscroll%2Fsrc%2Fcomponents%2FScrollRestoration.tsx
GitHub tramvai/packages/modules/autoscroll/src/components/ScrollRestoration.tsx at main · tramvaijs/tramvai A modular framework for universal JS applications. Contribute to tramvaijs/tramvai development by creating an account on GitHub.
  • 🔥 3
  • 🤔 2
  • 👍 1
More from @super_oleg_dev
  1. Sep 10, 2026Посмотреть на работу анимаций и скролла можно в нашей демке, основанной на примере Remix ф…
  2. Sep 10, 2026Раз уж меня прорвало, вспомню ещё один интересный кейс. Решали примерно в одно время две п…
  3. Sep 10, 2026Вместо тысячи слов, пример работы и сразу разметка, которая долетает в HTML - и наш механи…
  4. Sep 10, 2026Когда-то давно рассказывал про интеграцию стриминга и deferred загрузки данных в Tramvai -…
  5. Sep 7, 2026TIL, небольшой, но интересный кейс! Делал кастомный анализ бандла через Claude, пишет мне…
  6. Mar 17, 2026Нет ничего интереснее на ночь глядя чем почелленджить новые SSR бенчмарки! https://x.com/i…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →