You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
3.5 KiB

2 years ago
  1. <template>
  2. <section :class="['tw-relative tw-mt-[48px] xl:tw-max-w-[1246px] xl:tw-mx-auto']">
  3. <div class="swiper-container centerMode xl:tw-max-w-[1106px] xl:tw-mx-auto xl:tw-px-[22px]" ref="centerMode"
  4. @mouseenter="enter" @mouseleave="leave">
  5. <div :class="['swiper-wrapper']">
  6. <div v-for="(item, index) in list" :key="index" :class="['swiper-slide']">
  7. <div class="tw-rounded-[24px]">
  8. <lazyImg :src="item.image" :customClass="'swiper-lazy tw-rounded-[24px]'"></lazyImg>
  9. </div>
  10. </div>
  11. </div>
  12. </div>
  13. <div :class="[
  14. 'swiper-button-prev ad tw-text-black tw-hidden',
  15. centerModeSwiper ? 'xl:tw-block' : '',
  16. ]"></div>
  17. <div :class="[
  18. 'swiper-button-next ad tw-text-black tw-hidden',
  19. centerModeSwiper ? 'xl:tw-block' : '',
  20. ]"></div>
  21. </section>
  22. </template>
  23. <script>
  24. import Swiper from "swiper/bundle";
  25. import lazyImg from "@/components/img/img.vue";
  26. export default {
  27. components: {
  28. Swiper,
  29. lazyImg,
  30. },
  31. props: {
  32. list: {
  33. type: Array,
  34. },
  35. },
  36. data() {
  37. return {
  38. centerModeSwiper: null,
  39. };
  40. },
  41. mounted() {
  42. let vm = this;
  43. vm.$nextTick(function () {
  44. vm.centerModeSwiper = new Swiper(".swiper-container.centerMode", {
  45. direction: "horizontal",
  46. initialSlide: 0,
  47. slidesPerView: 1.6,
  48. centeredSlides: true,
  49. loop: true,
  50. loopedSlides: 0,
  51. observer: true, //修改swiper自己或子元素时,自动初始化swiper
  52. observeParents: true, //修改swiper的父元素时,自动初始化swiper
  53. spaceBetween: 32,
  54. autoplay: {
  55. disableOnInteraction: true,
  56. delay: 5000,
  57. },
  58. preloadImages: false,
  59. lazy: {
  60. loadPrevNext: true,
  61. loadOnTransitionStart: true,
  62. loadPrevNextAmount: 6,
  63. },
  64. watchSlidesProgress: true,
  65. navigation: {
  66. nextEl: ".swiper-button-next.ad",
  67. prevEl: ".swiper-button-prev.ad",
  68. },
  69. breakpoints: {
  70. 768: {
  71. slidesPerView: 1.74,
  72. spaceBetween: 48,
  73. },
  74. 1366: {
  75. slidesPerView: 3,
  76. spaceBetween: 24,
  77. centeredSlides: false,
  78. grabCursor: true,
  79. },
  80. },
  81. });
  82. vm.centerModeSwiper.init();
  83. vm.centerModeSwiper.update();
  84. });
  85. },
  86. methods: {
  87. enter() {
  88. this.centerModeSwiper.autoplay.stop();
  89. },
  90. leave() {
  91. this.centerModeSwiper.autoplay.start();
  92. },
  93. },
  94. };
  95. </script>
  96. <style lang="scss" scoped>
  97. .swiper-container {
  98. width: 100% !important;
  99. }
  100. .swiper-slide {
  101. margin-right: 20px;
  102. }
  103. .swiper-button {
  104. &-prev.ad {
  105. z-index: 4;
  106. &:focus-visible,
  107. &:focus {
  108. outline: none;
  109. }
  110. &::after {
  111. text-align: center;
  112. color: transparent;
  113. background-image: url('~/assets/svg/u-angle-left-b.svg');
  114. background-position: center;
  115. background-repeat: no-repeat;
  116. background-size: cover;
  117. }
  118. }
  119. &-next.ad {
  120. z-index: 4;
  121. &:focus-visible,
  122. &:focus {
  123. outline: none;
  124. }
  125. &::after {
  126. text-align: center;
  127. color: transparent;
  128. background-image: url('~/assets/svg/u-angle-right-b.svg');
  129. background-position: center;
  130. background-repeat: no-repeat;
  131. background-size: cover;
  132. }
  133. }
  134. }
  135. .active {
  136. position: relative;
  137. &::after {
  138. content: "";
  139. display: block;
  140. position: absolute;
  141. bottom: -12px;
  142. width: 100%;
  143. height: 2px;
  144. background-color: #f48800;
  145. }
  146. }
  147. </style>