<!-- @format --> <script lang="ts" setup> import { Swiper, SwiperSlide } from 'swiper/vue' import { Autoplay, EffectCards, Navigation, Pagination } from 'swiper/modules' import 'swiper/css' import 'swiper/css/navigation' import 'swiper/css/autoplay' import 'swiper/css/pagination' // import 'swiper/css/bundle' // 全部css const modules = [Navigation, Pagination, EffectCards, Autoplay] const swiperVertical = ref<any>(null) const swiperHorizontal = ref<any>(null) function onVerticalSwiper(swiper: any) { swiperVertical.value = swiper } function onHorizontalSwiper(swiper: any) { swiperHorizontal.value = swiper } function onSlideChange(swiper: any) { if (!swiperVertical.value) return swiperVertical.value.slideTo(swiper.realIndex) } function onSlideChange2(swiper: any) { if (!swiperHorizontal.value) return swiperHorizontal.value.slideTo(swiper.realIndex) } const list = ref([ { title: 'Insight-Driven Creativity111', description: 'We believe creativity should be rooted in real consumer insights. Every idea starts with what the new generation truly wants — we turn those insights into inspiring products.', }, { title: 'Insight-Driven Creativity22', description: 'We believe creativity should be rooted in real consumer insights. Every idea starts with what the new generation truly wants — we turn those insights into inspiring products.', }, { title: 'Insight-Driven Creativity333', description: 'We believe creativity should be rooted in real consumer insights. Every idea starts with what the new generation truly wants — we turn those insights into inspiring products.', }, ]) onUnmounted(() => { if (swiperVertical.value) { swiperVertical.value.destroy() swiperVertical.value = null } }) </script> <template> <div class="bg-#EAE5FA"> <div class="w-1200-auto"> <div class="flex justify-between "> <div class="w-50% block-left flex user-select justify-center items-center pr-100px"> <Swiper :modules="modules" mousewheel="false" :loop="true" effect="cards" grab-cursor="true" :autoplay="{ delay: 3000, disableOnInteraction: false, pauseOnMouseEnter: true, }" :pagination="{ clickable: true, }" class="pos-relative" @slide-change="onSlideChange2" @swiper="onVerticalSwiper" > <SwiperSlide v-for="(item, index) in list" :key="index"> Slide {{ index }} </SwiperSlide> </Swiper> </div> <div class="w-50% h-700px pos-relative block-right"> <Swiper direction="vertical" :modules="modules" mousewheel="false" :loop="true" :allow-touch-move="false" :pagination="false" class="pos-relative" @swiper="onHorizontalSwiper" > <SwiperSlide v-for="(item, index) in list" :key="index"> <div class="text-left user-select"> <div class="text-40px fw-800 text-#333 custom-title-font"> {{ item.title }} </div> <div class="text-#999 mt-20px lh-24px"> {{ item.description }} </div> </div> </SwiperSlide> </Swiper> </div> </div> </div> </div> </template> <style lang="less" scoped> .user-select{ user-select: none; } :deep(.block-right) { .swiper { position: relative; width: 100%; height: 100%; .swiper-slide { text-align: center; font-size: 18px; display: flex; justify-content: center; align-items: center; } } } :deep(.block-left) { .swiper { width: 480px; height: 480px; } .swiper-slide { display: flex; align-items: center; justify-content: center; border-radius: 18px; font-size: 22px; font-weight: bold; color: #fff; } .swiper-pagination{ top: unset; bottom: -80px; left: unset; right: -100px; display: flex; justify-content: end; } .swiper-slide:nth-child(1n) { background-color: rgb(206, 17, 17); } .swiper-slide:nth-child(2n) { background-color: rgb(0, 140, 255); } .swiper-slide:nth-child(3n) { background-color: rgb(10, 184, 111); } } </style>