UPD:我已经创建了一个npm包,它比下面的解决方案更好,更容易使用。
我的smoothScroll函数
我采用了Steve Banton的出色解决方案,并编写了一个函数,使其使用起来更方便。使用window.scroll()甚至window.scrollBy()会更容易,因为我以前尝试过,但这两个有一些问题:
一切都变成垃圾后,使用他们与平稳的行为。
你无论如何都不能阻止他们,必须等到卷轴的结尾。
希望我的函数对你们有用。此外,还有一个轻量级的填充程序,可以在Safari甚至IE中运行。
下面是代码
照搬就行,想怎么搞就怎么搞。
import smoothscroll from 'smoothscroll-polyfill';
smoothscroll.polyfill();
const prepareSmoothScroll = linkEl => {
const EXTRA_OFFSET = 0;
const destinationEl = document.getElementById(linkEl.dataset.smoothScrollTo);
const blockOption = linkEl.dataset.smoothScrollBlock || 'start';
if ((blockOption === 'start' || blockOption === 'end') && EXTRA_OFFSET) {
const anchorEl = document.createElement('div');
destinationEl.setAttribute('style', 'position: relative;');
anchorEl.setAttribute('style', `position: absolute; top: -${EXTRA_OFFSET}px; left: 0;`);
destinationEl.appendChild(anchorEl);
linkEl.addEventListener('click', () => {
anchorEl.scrollIntoView({
block: blockOption,
behavior: 'smooth',
});
});
}
if (blockOption === 'center' || !EXTRA_OFFSET) {
linkEl.addEventListener('click', () => {
destinationEl.scrollIntoView({
block: blockOption,
behavior: 'smooth',
});
});
}
};
export const activateSmoothScroll = () => {
const linkEls = [...document.querySelectorAll('[data-smooth-scroll-to]')];
linkEls.forEach(linkEl => prepareSmoothScroll(linkEl));
};
要创建一个link元素,只需添加以下data属性:
data-smooth-scroll-to="element-id"
还可以将另一个属性设置为加法
data-smooth-scroll-block="center"
它表示scrollIntoView()函数的块选项。默认为start。在MDN上阅读更多。
最后
根据您的需要调整平滑滚动功能。
例如,如果你有一些固定的标题(或者我用单词masthead来称呼它),你可以这样做:
const mastheadEl = document.querySelector(someMastheadSelector);
// and add it's height to the EXTRA_OFFSET variable
const EXTRA_OFFSET = mastheadEl.offsetHeight - 3;
如果你没有这样的情况,那就删除它,为什么不:-D。