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.

160 lines
3.6 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
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: false,
  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. 414: {
  71. slidesPerView: 1.74,
  72. spaceBetween: 32,
  73. },
  74. 768: {
  75. slidesPerView: 1.74,
  76. spaceBetween: 48,
  77. },
  78. 1366: {
  79. slidesPerView: 3,
  80. spaceBetween: 24,
  81. centeredSlides: false,
  82. grabCursor: true,
  83. },
  84. },
  85. });
  86. vm.centerModeSwiper.init();
  87. vm.centerModeSwiper.update();
  88. });
  89. },
  90. methods: {
  91. enter() {
  92. this.centerModeSwiper.autoplay.stop();
  93. },
  94. leave() {
  95. this.centerModeSwiper.autoplay.start();
  96. },
  97. },
  98. };
  99. </script>
  100. <style lang="scss" scoped>
  101. .swiper-container {
  102. width: 100% !important;
  103. }
  104. .swiper-slide {
  105. margin-right: 20px;
  106. }
  107. .swiper-button {
  108. &-prev.ad {
  109. z-index: 4;
  110. &:focus-visible,
  111. &:focus {
  112. outline: none;
  113. }
  114. &::after {
  115. text-align: center;
  116. color: transparent;
  117. background-image: url('~/assets/svg/u-angle-left-b.svg');
  118. background-position: center;
  119. background-repeat: no-repeat;
  120. background-size: cover;
  121. }
  122. }
  123. &-next.ad {
  124. z-index: 4;
  125. &:focus-visible,
  126. &:focus {
  127. outline: none;
  128. }
  129. &::after {
  130. text-align: center;
  131. color: transparent;
  132. background-image: url('~/assets/svg/u-angle-right-b.svg');
  133. background-position: center;
  134. background-repeat: no-repeat;
  135. background-size: cover;
  136. }
  137. }
  138. }
  139. .active {
  140. position: relative;
  141. &::after {
  142. content: "";
  143. display: block;
  144. position: absolute;
  145. bottom: -12px;
  146. width: 100%;
  147. height: 2px;
  148. background-color: #f48800;
  149. }
  150. }
  151. </style>