UPD: Ich habe ein npm-Paket erstellt , das besser als die folgende Lösung funktioniert und einfacher zu verwenden ist.
Meine SmoothScroll-Funktion
Ich habe die wunderbare Lösung von Steve Banton genommen und eine Funktion geschrieben, die die Verwendung bequemer macht. Es wäre einfacher, es einfach zu benutzen window.scroll()
oder sogar window.scrollBy()
, wie ich es zuvor versucht habe, aber diese beiden haben einige Probleme:
- Alles wird Junkie, nachdem man sie mit einem reibungslosen Verhalten verwendet hat.
- Sie können sie sowieso nicht verhindern und müssen bis zum und der Schriftrolle warten. Ich hoffe also, dass meine Funktion für Sie nützlich sein wird. Außerdem gibt es eine leichte Polyfüllung , mit der es in Safari und sogar im Internet Explorer funktioniert.
Hier ist der Code
Kopieren Sie es einfach und machen Sie es fertig, wie immer Sie wollen.
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));
};
Um ein Linkelement zu erstellen, fügen Sie einfach das folgende Datenattribut hinzu:
data-smooth-scroll-to="element-id"
Sie können auch ein anderes Attribut als Ergänzung festlegen
data-smooth-scroll-block="center"
Es repräsentiert die block
Option der scrollIntoView()
Funktion. Standardmäßig ist es start
. Lesen Sie mehr über MDN .
Schließlich
Passen Sie die SmoothScroll-Funktion an Ihre Bedürfnisse an.
Wenn Sie beispielsweise einen festen Header haben (oder ich nenne ihn mit dem Wort masthead
), können Sie Folgendes tun:
const mastheadEl = document.querySelector(someMastheadSelector);
// and add it's height to the EXTRA_OFFSET variable
const EXTRA_OFFSET = mastheadEl.offsetHeight - 3;
Wenn Sie einen solchen Fall nicht haben, löschen Sie ihn einfach. Warum nicht :-D.
scrollIntoView
ist besorgniserregend.