UPD: Tôi đã tạo một gói npm hoạt động tốt hơn giải pháp sau và dễ sử dụng hơn.
Chức năng SmoothScroll của tôi
Tôi đã sử dụng giải pháp tuyệt vời của Steve Banton và viết một hàm giúp sử dụng thuận tiện hơn. Nó sẽ dễ dàng hơn chỉ để sử dụng window.scroll()
hoặc thậm chí window.scrollBy()
, như tôi đã thử trước đây, nhưng hai cái này có một số vấn đề:
- Mọi thứ trở nên lộn xộn sau khi sử dụng chúng với một hoạt động mượt mà trên.
- Dù sao thì bạn cũng không thể ngăn cản chúng và phải đợi cho đến khi hết cuộn. Vì vậy, tôi hy vọng chức năng của tôi sẽ hữu ích cho bạn. Ngoài ra, có một polyfill nhẹ giúp nó hoạt động trong Safari và thậm chí cả IE.
Đây là mã
Chỉ cần sao chép nó và lộn xộn với nó bao giờ bạn muố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));
};
Để tạo phần tử liên kết, chỉ cần thêm thuộc tính dữ liệu sau:
data-smooth-scroll-to="element-id"
Ngoài ra, bạn có thể đặt một thuộc tính khác làm phụ đề
data-smooth-scroll-block="center"
Nó đại diện cho block
tùy chọn của scrollIntoView()
chức năng. Theo mặc định, nó start
. Đọc thêm trên MDN .
Cuối cùng
Điều chỉnh chức năng SmoothScroll theo nhu cầu của bạn.
Ví dụ: nếu bạn có một số tiêu đề cố định (hoặc tôi gọi nó bằng từ này masthead
), bạn có thể làm như sau:
const mastheadEl = document.querySelector(someMastheadSelector);
// and add it's height to the EXTRA_OFFSET variable
const EXTRA_OFFSET = mastheadEl.offsetHeight - 3;
Nếu không gặp trường hợp như vậy thì bạn cứ xóa đi, tại sao không :-D.
scrollIntoView
đang gây rắc rối.