fix: reduce the frequency of jittering effect

This commit is contained in:
XUE 2024-11-16 17:44:20 +08:00
parent 081ad8b84f
commit 06eb8a66a1

View File

@ -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');
function restoreSidebarPosition(sidebarScrollbar) {
const savedPosition = localStorage.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);
if (savedPosition !== null) {
requestAnimationFrame(() => {
sidebarScrollbar.scrollTop = parseInt(savedPosition);
});
}
}