cczg-lottery-activity/uni_modules/zebra-swiper/modules/autoplay/autoplay.js

211 lines
4.8 KiB
JavaScript

import {
nextTick
} from '../../shared/utils.js';
export default function Autoplay({
swiper,
extendParams,
on,
emit
}) {
let timeout;
swiper.autoplay = {
running: false,
paused: false
};
extendParams({
autoplay: {
enabled: false,
delay: 3000,
waitForTransition: true,
disableOnInteraction: true,
stopOnLastSlide: false,
reverseDirection: false,
pauseOnMouseEnter: false
}
});
function run() {
const $activeSlideEl = swiper.slides[swiper.activeIndex];
let delay = swiper.params.autoplay.delay;
clearTimeout(timeout);
timeout = nextTick(() => {
let autoplayResult;
if (swiper.params.autoplay.reverseDirection) {
if (swiper.params.loop) {
swiper.loopFix();
autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);
emit('autoplay');
} else if (!swiper.isBeginning) {
autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);
emit('autoplay');
} else if (!swiper.params.autoplay.stopOnLastSlide) {
autoplayResult = swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);
emit('autoplay');
} else {
stop();
}
} else if (swiper.params.loop) {
swiper.loopFix();
setTimeout(() => {
autoplayResult = swiper.slideNext(swiper.params.speed, true, true);
}, 30)
emit('autoplay');
} else if (!swiper.isEnd) {
autoplayResult = swiper.slideNext(swiper.params.speed, true, true);
emit('autoplay');
} else if (!swiper.params.autoplay.stopOnLastSlide) {
autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);
emit('autoplay');
} else {
stop();
}
if (swiper.params.cssMode && swiper.autoplay.running) run();
else if (autoplayResult === false) {
run();
}
}, delay);
}
function start() {
if (typeof timeout !== 'undefined') return false;
if (swiper.autoplay.running) return false;
swiper.autoplay.running = true;
emit('autoplayStart');
run();
return true;
}
function stop() {
if (!swiper.autoplay.running) return false;
if (typeof timeout === 'undefined') return false;
if (timeout) {
clearTimeout(timeout);
timeout = undefined;
}
swiper.autoplay.running = false;
emit('autoplayStop');
return true;
}
function pause(speed) {
if (!swiper.autoplay.running) return;
if (swiper.autoplay.paused) return;
if (timeout) clearTimeout(timeout);
swiper.autoplay.paused = true;
if (speed === 0 || !swiper.params.autoplay.waitForTransition) {
swiper.autoplay.paused = false;
run();
} else {
['transitionEnd', 'webkitTransitionEnd'].forEach(event => {
swiper.on(event, onTransitionEnd);
});
}
}
function onVisibilityChange() {
// const document = getDocument();
// if (document.visibilityState === 'hidden' && swiper.autoplay.running) {
// pause();
// }
// if (document.visibilityState === 'visible' && swiper.autoplay.paused) {
// run();
// swiper.autoplay.paused = false;
// }
}
function onTransitionEnd(e) {
if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;
// if (e.target !== swiper.$wrapperEl[0]) return;
['transitionEnd', 'webkitTransitionEnd'].forEach(event => {
swiper.off(event, onTransitionEnd);
});
swiper.autoplay.paused = false;
if (!swiper.autoplay.running) {
stop();
} else {
run();
}
}
function onMouseEnter() {
if (swiper.params.autoplay.disableOnInteraction) {
stop();
} else {
pause();
}
// ['transitionend', 'webkitTransitionEnd'].forEach(event => {
// swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);
// });
}
function onMouseLeave() {
if (swiper.params.autoplay.disableOnInteraction) {
return;
}
swiper.autoplay.paused = false;
run();
}
function attachMouseEvents() {
if (swiper.params.autoplay.pauseOnMouseEnter) {}
}
function detachMouseEvents() {}
on('init update', () => {
if (swiper.params.autoplay.enabled) {
start();
attachMouseEvents();
}
});
on('beforeTransitionStart', (_s, speed, internal) => {
if (swiper.autoplay.running) {
if (internal || !swiper.params.autoplay.disableOnInteraction) {
swiper.autoplay.pause(speed);
} else {
if (!swiper.params.loop) {
stop();
}
}
}
});
on('sliderFirstMove', () => {
if (swiper.autoplay.running) {
if (swiper.params.autoplay.disableOnInteraction) {
stop();
} else {
pause();
}
}
});
on('touch-end', () => {
if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) {
run();
}
});
on('destroy', () => {
detachMouseEvents();
if (swiper.autoplay.running) {
stop();
}
});
Object.assign(swiper.autoplay, {
pause,
run,
start,
stop
});
}