From 06eb8a66a12c523297d23a06b376889767a8e80d Mon Sep 17 00:00:00 2001 From: XUE <46087743+xue68@users.noreply.github.com> Date: Sat, 16 Nov 2024 17:44:20 +0800 Subject: [PATCH] fix: reduce the frequency of jittering effect --- assets/js/sidebar.js | 56 +++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/assets/js/sidebar.js b/assets/js/sidebar.js index 58f032b..ab9601e 100644 --- a/assets/js/sidebar.js +++ b/assets/js/sidebar.js @@ -1,8 +1,31 @@ document.addEventListener("DOMContentLoaded", function () { - restoreSidebarPosition(); - enableCollapsibles(); + initializeSidebar(); }); +function initializeSidebar() { + const sidebarScrollbar = document.querySelector("aside.sidebar-container > .hextra-scrollbar"); + if (!sidebarScrollbar) return; + + enableCollapsibles(); + restoreSidebarPosition(sidebarScrollbar); + + const debouncedSave = debounce((position) => { + saveSidebarPosition(position); + }, 150); + + sidebarScrollbar.addEventListener('scroll', function() { + debouncedSave(this.scrollTop); + }); + + document.querySelectorAll('a').forEach(link => { + if (link.hostname === window.location.hostname) { + link.addEventListener('click', function(e) { + saveSidebarPosition(sidebarScrollbar.scrollTop); + }); + } + }); +} + function debounce(func, wait) { let timeout; return function executedFunction(...args) { @@ -29,30 +52,15 @@ function enableCollapsibles() { } function saveSidebarPosition(scrollPosition) { - const currentPosition = sessionStorage.getItem('sidebarScrollPosition'); - if (currentPosition === null || parseInt(currentPosition) !== scrollPosition) { - sessionStorage.setItem('sidebarScrollPosition', scrollPosition); - } + localStorage.setItem('sidebarScrollPosition', scrollPosition); } -function restoreSidebarPosition() { - const sidebarScrollbar = document.querySelector("aside.sidebar-container > .hextra-scrollbar"); - if (sidebarScrollbar) { - const savedPosition = sessionStorage.getItem('sidebarScrollPosition'); - - if (savedPosition !== null) { - sidebarScrollbar.scrollTo({ - top: parseInt(savedPosition), - behavior: 'instant' - }); - } - - const debouncedSave = debounce((position) => { - saveSidebarPosition(position); - }, 150); - - sidebarScrollbar.addEventListener('scroll', function() { - debouncedSave(this.scrollTop); +function restoreSidebarPosition(sidebarScrollbar) { + const savedPosition = localStorage.getItem('sidebarScrollPosition'); + + if (savedPosition !== null) { + requestAnimationFrame(() => { + sidebarScrollbar.scrollTop = parseInt(savedPosition); }); } } \ No newline at end of file