CustomSwiper.vue 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <script setup lang="ts">
  2. import type { Swiper as SwiperClass} from 'swiper';
  3. interface ISwiperData {
  4. id: number,
  5. url: string,
  6. }
  7. interface ISwiperProps {
  8. list: ISwiperData[]
  9. reverseDirection?: boolean,
  10. }
  11. withDefaults(defineProps<ISwiperProps>(), {
  12. reverseDirection: () => false
  13. })
  14. let swiperInstance: SwiperClass;
  15. let timer: null | NodeJS.Timeout = null;
  16. const onSwiper = (swiper: SwiperClass) => {
  17. swiperInstance = swiper;
  18. }
  19. const listenerScreenSize = () => {
  20. swiperInstance.autoplay.stop();
  21. clearTimeout(Number(timer));
  22. timer = setTimeout(() => {
  23. swiperInstance.autoplay.start();
  24. }, 2000);
  25. }
  26. onMounted(() => {
  27. if (process.client) {
  28. window.addEventListener('resize', listenerScreenSize);
  29. }
  30. })
  31. onUnmounted(() => {
  32. if (process.client) {
  33. window.removeEventListener('resize', listenerScreenSize);
  34. }
  35. })
  36. </script>
  37. <template>
  38. <Swiper
  39. class="swiper-no-swiping"
  40. @swiper="onSwiper"
  41. :modules="[SwiperAutoplay]"
  42. :slides-per-view="1"
  43. :loop="true"
  44. :speed="2000"
  45. :observer="true"
  46. :observeParents="true"
  47. :resizeObserver="true"
  48. :autoplay="{
  49. delay: 3000,
  50. disableOnInteraction: false,
  51. reverseDirection,
  52. }"
  53. >
  54. <SwiperSlide v-for="slide in list" :key="slide.id" >
  55. <div class="swiper-item" :style="{ background: 'url(' + slide.url + ')', backgroundSize: 'cover' }"></div>
  56. </SwiperSlide>
  57. </Swiper>
  58. </template>
  59. <style scoped lang="scss">
  60. .swiper, .swiper-item {
  61. height: 100%;
  62. }
  63. </style>