HTML
<nav>
<button id="btn1" onclick="goTo(1)">1</button>
<button id="btn2" onclick="goTo(2)">2</button>
</nav>
<div id="el1">1</div>
<div id="el2">2</div>
JS
function goTo(x) {
const elm = document.getElementById(`el${x}`);
elm.scrollIntoView({
behavior: "smooth",
block: "start"
});
let func = _.debounce(() => {
document.documentElement.scrollBy({
top: -20,
behavior: "smooth"
})
}, 500)
document.addEventListener('scroll', e => {
func()
})
}
答案 0 :(得分:1)
不是debounce
。请注意,scrollBy
中调用的func
也是一个滚动条 - 这就是为什么它会被func
的延迟调用再次一次又一次地延迟处理。你真正需要的是使func
成为一个(有效的)单次事件处理程序。一种可能的方法(demo):
function goTo(x) {
const elm = document.getElementById(`el${x}`);
elm.scrollIntoView({
behavior: "smooth",
block: "start"
});
let func = _.debounce(() => {
document.removeEventListener('scroll', func);
document.documentElement.scrollBy({
top: -20,
behavior: "smooth"
});
}, 500);
document.addEventListener('scroll', func);
}