UPD: Aşağıdaki çözümden daha iyi çalışan ve kullanımı daha kolay bir npm paketi oluşturdum .
SmoothScroll işlevim
Steve Banton'ın harika çözümünü aldım ve kullanımı daha kolay hale getiren bir işlev yazdım. Daha önce denediğim gibi sadece kullanmak window.scroll()
veya hatta daha kolay olurdu window.scrollBy()
, ancak bu ikisinin bazı sorunları var:
- Onları pürüzsüz bir davranışla kullandıktan sonra her şey önemsiz hale gelir.
- Onları zaten engelleyemezsiniz ve parşömenin sonuna kadar beklemeniz gerekir. Umarım işlevim sizin için yararlı olur. Ayrıca, Safari'de ve hatta IE'de çalışmasını sağlayan hafif bir polyfill var.
İşte kod
Sadece kopyalayın ve istediğiniz gibi karıştırın.
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));
};
Bir bağlantı öğesi yapmak için aşağıdaki veri özelliğini eklemeniz yeterlidir:
data-smooth-scroll-to="element-id"
Ayrıca başka bir özniteliği bir eklenti olarak ayarlayabilirsiniz.
data-smooth-scroll-block="center"
İşlevin block
seçeneğini temsil eder scrollIntoView()
. Varsayılan olarak start
. MDN hakkında daha fazlasını okuyun .
En sonunda
SmoothScroll işlevini ihtiyaçlarınıza göre ayarlayın.
Örneğin, sabit bir başlığınız varsa (veya ben onu bu kelimeyle çağırıyorum masthead
) şöyle bir şey yapabilirsiniz:
const mastheadEl = document.querySelector(someMastheadSelector);
const EXTRA_OFFSET = mastheadEl.offsetHeight - 3;
Böyle bir vakanız yoksa, silin, neden olmasın: -D.
scrollIntoView
can sıkıcı.