fix: 🐛 make end detection more robust
Smooth scrolling messes with the detection of isAtEnd. Introduce a debounce to delay updateActiveStates until scroll has actually finished.
This commit is contained in:
parent
a98028b880
commit
c0b42b82d0
1 changed files with 16 additions and 6 deletions
|
@ -8,6 +8,20 @@
|
||||||
|
|
||||||
const TOLERANCE = 2;
|
const TOLERANCE = 2;
|
||||||
|
|
||||||
|
const debounce = (fn, delay = 300) => {
|
||||||
|
let timer = 0;
|
||||||
|
const debounced = (...args) => {
|
||||||
|
if (!args) args = [];
|
||||||
|
clearTimeout(timer);
|
||||||
|
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
fn.apply(fn, args);
|
||||||
|
}, delay);
|
||||||
|
};
|
||||||
|
|
||||||
|
return debounced;
|
||||||
|
};
|
||||||
|
|
||||||
const isAtStart = () => Math.floor(track.scrollLeft) <= TOLERANCE;
|
const isAtStart = () => Math.floor(track.scrollLeft) <= TOLERANCE;
|
||||||
const isAtEnd = () => {
|
const isAtEnd = () => {
|
||||||
const { scrollLeft, offsetWidth, scrollWidth } = track;
|
const { scrollLeft, offsetWidth, scrollWidth } = track;
|
||||||
|
@ -41,12 +55,7 @@
|
||||||
const prev = () => scrollToIndex(currentIndex - 1);
|
const prev = () => scrollToIndex(currentIndex - 1);
|
||||||
const next = () => scrollToIndex(currentIndex + 1);
|
const next = () => scrollToIndex(currentIndex + 1);
|
||||||
|
|
||||||
const resizeObserver = new ResizeObserver(() => {
|
const resizeObserver = new ResizeObserver(() => debounce(scrollToIndex(currentIndex)));
|
||||||
clearTimeout(resizeTimeout);
|
|
||||||
resizeTimeout = setTimeout(() => {
|
|
||||||
scrollToIndex(currentIndex);
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
resizeObserver.observe(track);
|
resizeObserver.observe(track);
|
||||||
|
|
||||||
const galleryObserver = new IntersectionObserver(
|
const galleryObserver = new IntersectionObserver(
|
||||||
|
@ -89,6 +98,7 @@
|
||||||
images.forEach((el) => galleryObserver.observe(el));
|
images.forEach((el) => galleryObserver.observe(el));
|
||||||
prevButton.addEventListener('click', prev);
|
prevButton.addEventListener('click', prev);
|
||||||
nextButton.addEventListener('click', next);
|
nextButton.addEventListener('click', next);
|
||||||
|
track.addEventListener('scroll', () => debounce(updateActiveStates(currentIndex)));
|
||||||
document.addEventListener('DOMContentLoaded', () => initializeGallery());
|
document.addEventListener('DOMContentLoaded', () => initializeGallery());
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue