我有一个页面,可以在滚动事件中添加和删除一些内容。
现在使用Chrome时(IE11似乎没有这种行为),无论何时添加内容并将其删除到页面,都会生成滚动事件(我想是为了保持客户端视图在页面更改上保持一致)。
我不想要这个。内容更改时生成的滚动事件将触发更多内容更改,从而触发更多滚动事件。
有关如何为所有浏览器停止此行为的任何建议?我不希望任何自动滚动发生。我只想要注册用户滚动。
这是一些简单的示例代码。单击“单击”按钮将重新调整彩色差异并使页面自动滚动(在Chrome中,而不是IE11)...
function removeStuff(){
var elem = document.getElementById("center");
document.getElementById("container").removeChild(elem);
document.getElementById("container").appendChild(elem);
}
#top {
background-color: green;
height:1500px;
}
#center {
background-color: blue;
height:1000px;
}
#bottom {
background-color: red;
height:1500px;
}
<div id="container">
<div id="top"></div>
<div id="center"></div>
<button id="button" onclick="removeStuff()">click</button>
<div id="bottom"></div>
</div>
答案 0 :(得分:6)
这是最近添加的Chromium功能,称为滚动锚定。
在浏览器中禁用:转到chrome://flags/#enable-scroll-anchoring
并设置&#34;滚动锚定&#34;到&#34;禁用&#34;。
通过CSS禁用:
.some-element {
overflow-anchor: none;
}
答案 1 :(得分:0)
我认为您无法禁用此行为,但您可以解决此问题。由于Chrome在您调用scroll
时同步执行removeChild
事件,因此您可以通过在true
之前将全局布尔设置为removeChild
并设置它来检测这些类型的滚动事件直接回到false
。
var isRemovingStuff = false;
function removeStuff(){
var elem = document.getElementById("center");
// Chrome does a scroll here, set isRemovingStuff to true
// so our scroll handler can know to ignore it.
isRemovingStuff = true;
document.getElementById("container").removeChild(elem);
isRemovingStuff = false;
document.getElementById("container").appendChild(elem);
// TODO: set the scrollTop back to what you want it to be.
}
你的滚动处理程序看起来像:
function onScroll() {
if (isRemovingStuff)
return;
// Do cool stuff
}
答案 2 :(得分:0)
如果您使用的是 bootrap 4/5,这是一个解决方案
* {
overflow-anchor: none !important;
scroll-snap-stop: normal !important;
overscroll-behavior: unset !important;
scroll-behavior: unset !important;
}
.container, header, footer, .container-fluid, body, div, span, section {
overflow-anchor: none !important;
scroll-snap-stop: normal !important;
overscroll-behavior: unset !important;
scroll-behavior: unset !important;
}