假设你设置window.history.scrollRestoration = "manual"
在一个网页上。
在 Chrome/Firefox 上,每当您单击锚点时,页面都会滚动到链接元素的位置,并且每当您在历史记录中后退/前进时,滚动位置保持不变。
在 Safari 上,无论何时单击锚点都不会发生任何事情,并且无论何时在历史记录中向后/向前导航时,页面都会滚动到链接到当前页面片段 (#sectionXYZ) 的元素的位置。
当我说“浏览历史”时,我的意思是要么使用window.history.back()
,要么使用浏览器的后退/前进按钮。window.history.forward()
window.history.go(N)
在下面的示例中,您有 2 个按钮(蓝色/红色),单击它们会将 2 个不同的状态推送到历史堆栈中。
尝试并单击它们几次并在历史记录中向后/向前导航以复制我描述的行为。
为什么即使history.scrollRestoration
设置为 Safari 也会恢复页面的滚动位置manual
?
有没有办法像 Chrome 和 Firefox 一样防止这种行为?
html,body,div {
height: 100vh;
width: 100vw;
margin: 0;
overflow-x: hidden;
}
#nav {
display:flex;
justify-content:center;
position:fixed;
width: 100%;
height: 100px;
background: rgba(0,0,0,0.7);
}
nav > a {
display:grid;
justify-content:center;
align-items:center;
text-decoration:none;
color:white;
width: 30%;
height: 90%;
font-size:120%;
cursor:pointer;
}
#a1, #blue{
background-color:blue;
}
#a2, #red {
background-color:red;
}
<body>
<nav id = "nav">
<a id = "a1" href = "#blue">BLUE</a>
<a id = "a2" href = "#red">RED</a>
</nav>
<div id = "blue"></div>
<div id = "red"></div>
<script>
window.history.scrollRestoration = "manual";
window.addEventListener("popstate", () => {
console.log("blue: ", document.getElementById("blue").getBoundingClientRect());
console.log("red: ", document.getElementById("red").getBoundingClientRect());
});
document.getElementById("a1").addEventListener("click", () => window.history.pushState("blue", "", "#blue"));
document.getElementById("a2").addEventListener("click", () => window.history.pushState("red", "", "#red"));
</script>
</body>