finish up slider (mostly)
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
const fetchedElements = document.getElementsByClassName('slider-element');
|
||||
const sliderElements = [];
|
||||
let okToMove = true;
|
||||
let currentSlideIndex = 0;
|
||||
const sliderContainer = document.getElementsByClassName('slider-container')[0];
|
||||
function sliderGoToIndex(index) {
|
||||
if (okToMove) {
|
||||
if (index < sliderElements.length && index >= 0) {
|
||||
okToMove = false;
|
||||
// Determine next and previous elements
|
||||
let previousElement = 0;
|
||||
let nextElement = 0;
|
||||
if (index < sliderElements.length - 1) {
|
||||
nextElement = index + 1;
|
||||
}
|
||||
else {
|
||||
nextElement = 0;
|
||||
}
|
||||
if (index === 0) {
|
||||
previousElement = sliderElements.length - 1;
|
||||
}
|
||||
else {
|
||||
previousElement = index - 1;
|
||||
}
|
||||
// Determine move direction:
|
||||
// true = next, false = previous
|
||||
let moveDirection = true;
|
||||
if ((index < currentSlideIndex || (index === sliderElements.length - 1 && currentSlideIndex === 0)) && !(index === 0 && currentSlideIndex === sliderElements.length - 1)) {
|
||||
moveDirection = false;
|
||||
}
|
||||
/*
|
||||
Add correct classes to all elements
|
||||
*/
|
||||
// New current element
|
||||
sliderElements[index].classList.add('current');
|
||||
sliderElements[index].classList.remove('next');
|
||||
sliderElements[index].classList.remove('past');
|
||||
// New next element
|
||||
if (moveDirection) {
|
||||
sliderElements[nextElement].classList.add('future');
|
||||
}
|
||||
else {
|
||||
sliderElements[nextElement].classList.add('next');
|
||||
}
|
||||
sliderElements[nextElement].classList.remove('current');
|
||||
sliderElements[nextElement].classList.remove('past');
|
||||
// new past element
|
||||
sliderElements[previousElement].classList.add('past');
|
||||
sliderElements[previousElement].classList.remove('current');
|
||||
sliderElements[previousElement].classList.remove('next');
|
||||
// Glitch fixes
|
||||
setTimeout(() => {
|
||||
if (moveDirection) {
|
||||
sliderElements[nextElement].classList.add('next');
|
||||
sliderElements[nextElement].classList.remove('future');
|
||||
}
|
||||
currentSlideIndex = index;
|
||||
setTimeout(() => {
|
||||
okToMove = true;
|
||||
}, 750);
|
||||
}, 1000);
|
||||
}
|
||||
else if (index < 0) {
|
||||
sliderGoToIndex(sliderElements.length - 1);
|
||||
}
|
||||
else {
|
||||
sliderGoToIndex(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
function sliderControl(action) {
|
||||
if (action === 'next') {
|
||||
sliderGoToIndex(currentSlideIndex + 1);
|
||||
}
|
||||
else if (action === 'previous') {
|
||||
sliderGoToIndex(currentSlideIndex - 1);
|
||||
}
|
||||
sliderAutoAdvance();
|
||||
}
|
||||
let sliderAutoAdvanceInterval = 0;
|
||||
let sliderInterval = 0;
|
||||
function activateSlider(interval) {
|
||||
sliderAutoAdvanceInterval = interval;
|
||||
sliderContainer.addEventListener('mouseenter', () => {
|
||||
stopSliderAutoAdvance();
|
||||
});
|
||||
sliderContainer.addEventListener('mouseleave', () => {
|
||||
sliderAutoAdvance();
|
||||
});
|
||||
document.addEventListener('blur', () => {
|
||||
stopSliderAutoAdvance();
|
||||
});
|
||||
window.addEventListener('focus', () => {
|
||||
sliderAutoAdvance();
|
||||
});
|
||||
sliderAutoAdvance();
|
||||
}
|
||||
const sliderAutoAdvance = () => {
|
||||
if (sliderAutoAdvanceInterval > 0) {
|
||||
stopSliderAutoAdvance();
|
||||
sliderInterval = setInterval(() => {
|
||||
sliderGoToIndex(currentSlideIndex + 1);
|
||||
}, sliderAutoAdvanceInterval);
|
||||
}
|
||||
};
|
||||
const stopSliderAutoAdvance = () => {
|
||||
try {
|
||||
clearInterval(sliderInterval);
|
||||
}
|
||||
catch (e) { }
|
||||
;
|
||||
};
|
||||
for (let el in fetchedElements) {
|
||||
if (fetchedElements[el].className) {
|
||||
sliderElements.push(fetchedElements[el]);
|
||||
}
|
||||
}
|
||||
sliderGoToIndex(0);
|
||||
|
||||
Reference in New Issue
Block a user