[英]Make scroll function with vanilla javascript
我有一个带有固定导航栏菜单的 web。
我想滚动 function 到特定元素,所以如果单击菜单,它应该滚动到该元素。
实际上,当我使用 scrollToView() 时它正在工作,但是因为 scrollToView() 会将元素滚动到 0 的顶部,所以一些元素位于导航栏后面。
如何指定元素的顶部,使元素在导航栏下方滚动。
在现代浏览器上,您只需使用scroll-margin-top
属性和指向锚点的链接即可获得与 CSS 相同的行为。
当您单击链接时,页面将滚动到#section-1
块,但由于scroll-margin-top
属性,您将仅在滚动时在元素上方定义一些边距,因此该部分将在固定下方可见header。 当然这需要提前知道固定元素的高度。
html { scroll-behavior: smooth; --headerheight: 80px; } header { position: fixed; top: 0; width: 100%; height: var(--headerheight); /* eg 80px */ background: #9bc; } section { /* eg 85px */ scroll-margin-top: calc(var(--headerheight) + 5px); height: 100vh; color: #333; } header + section { padding-top: calc(var(--headerheight) + 5px); }
<main> <header>Fixed Header</header> <section id="home"> <a href="#section-1">Scroll to section 1</a> </section> <section id="section-1" > section 1 <br/> <a href="#home">Scroll up</a> </section> </main>
您可以逐步执行此操作:
.
const el = document.getElementById("idOfTheElement"); // step 1
const elFromTop = el.offsetTop; // step 2
const navBarHeight = 60; // step 3 (considering it is of fixed height)
window.scrollTo(0, elFromTop - navBarHeight); // step 4
在这里,我认为导航栏的高度是固定的。 如果导航栏的高度是动态的,则必须使用el.offsetHeight
计算高度。
window.scrollTo
将滚动没有任何 animation 的元素。 对于平滑滚动使用:
el.scrollTo({
top: x,
left: y,
behavior: "smooth"
});
但上述function存在浏览器不兼容问题。 我通常做的是创建一个自定义 function 并使用它:
function smoothScroll(x, y, el = window) {
try {
el.scrollTo({
top: x,
left: y,
behavior: "smooth"
});
} catch (e) {
el.scrollTo(x, y);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.