One option imho would be to:
// on browser back, load old page and set scroll position
window.addEventListener('popstate', eve => {
if (eve.state.scrollPos) {
// load old page
// change address bar
document.documentElement.scrollTop = document.body.scrollTop = eve.state.scrollPos;
}
});
// on anchor click, store scroll position and load new page
for (let a of document.querySelectorAll('a')) {
a.addEventListener('click', eve => {
history.pushState(
{
scrollPos: window.pageYOffset || document.documentElement.scrollTop,
},
null,
window.location.toString()
);
// load new page
// change address bar
}
}