UPD: Saya telah membuat paket npm yang bekerja lebih baik daripada solusi berikut dan lebih mudah digunakan.
Fungsi smoothScroll saya
Saya telah mengambil solusi luar biasa dari Steve Banton dan menulis fungsi yang membuatnya lebih nyaman digunakan. Akan lebih mudah untuk digunakan window.scroll()
atau bahkan window.scrollBy()
, seperti yang pernah saya coba sebelumnya, tetapi keduanya memiliki beberapa masalah:
- Semuanya menjadi bermutu rendah setelah menggunakannya dengan perilaku halus.
- Anda tidak dapat mencegahnya dan harus menunggu hingga gulungan dan. Jadi saya berharap fungsi saya bermanfaat untuk Anda. Juga, ada polyfill ringan yang membuatnya berfungsi di Safari dan bahkan IE.
Ini kodenya
Cukup salin dan ubahlah sesuka Anda.
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));
};
Untuk membuat elemen link cukup tambahkan atribut data berikut:
data-smooth-scroll-to="element-id"
Anda juga dapat mengatur atribut lain sebagai tambahan
data-smooth-scroll-block="center"
Ini mewakili block
opsi scrollIntoView()
fungsi. Secara default, ini start
. Baca lebih lanjut tentang MDN .
Akhirnya
Sesuaikan fungsi smoothScroll dengan kebutuhan Anda.
Misalnya, jika Anda memiliki beberapa tajuk tetap (atau saya menyebutnya dengan kata masthead
), Anda dapat melakukan sesuatu seperti ini:
const mastheadEl = document.querySelector(someMastheadSelector);
// and add it's height to the EXTRA_OFFSET variable
const EXTRA_OFFSET = mastheadEl.offsetHeight - 3;
Jika Anda tidak memiliki kasus seperti itu, maka hapus saja, mengapa tidak :-D.
scrollIntoView
mengganggu.