Здравствуйте! У меня есть слайдер с 10 слайдами, и я хочу прокрутить его полностью 3 раза для создания небольшой анимации. <br/> Что я уже пробовал? Я добавил для Swiper свойство loop и использовал setTimeout внутри useEffect для вызова slideTo(30) при загрузке страницы. Слайдер прокрутился, но только до 10-го слайда. Как мне решить эту проблему? <br/> <br/> Код на React: <br/> <pre><code class="javascript">const Roulette = () => { const swiperRef = useRef<any>(null) const [currentSlide, setCurrentSlide] = useState<number | null>(null) const times = 3 useEffect(() => { if (swiperRef.current) setTimeout(() => { swiperRef.current.slideTo(30) }, 300) }, [swiperRef]) const spinWheel = () => { if (swiperRef.current) { const totalSlides = swiperRef.current.slides.length const randomIndex = Math.floor(Math.random() * totalSlides) const spinTimes = times * totalSlides + randomIndex console.log(spinTimes, swiperRef.current.slideTo) // Вращаем колесо swiperRef.current.slideTo(spinTimes, 2000, 'ease-out') // Выводим индекс в console после вращения setTimeout(() => { setCurrentSlide(randomIndex) console.log('Выпавший слайд: ', randomIndex) }, 2000) // 2 секунды - это длина времени вращения } } return ( <div className='bg-red-200 relative'> <Swiper onSwiper={swiper => { swiperRef.current = swiper }} slidesPerView={1} loop={true} className='mySwiper' > {[...Array(10)].map((_, index) => ( <SwiperSlide className='swiper-slide' key={index}> Слайд {index + 1} </SwiperSlide> ))} </Swiper> <di
Чтобы реализовать эффект вращения слайдера на Swiper.js, прокручивая его три полного оборота, вам необходимо скорректировать способ, которым вы вызываете `slideTo`. Чтобы слайдер прокрутился на три оборота, учтите, что вы должны передать число, которое является кратным количеству слайдов, умноженным на 3, плюс случайный индекс. Вот исправленный вариант вашего кода: ```javascript import React, { useEffect, useRef, useState } from 'react'; import { Swiper, SwiperSlide } from 'swiper/react'; import 'swiper/swiper-bundle.css'; const Roulette = () => { const swiperRef = useRef(null); const [currentSlide, setCurrentSlide] = useState(null); const times = 3; // количество полных прокруток // Функция, которая будет выполняться по загрузке компонента useEffect(() => { if (swiperRef.current) { const totalSlides = swiperRef.current.slides.length; const randomIndex = Math.floor(Math.random() * totalSlides); const spinTimes = times * totalSlides + randomIndex; // Вращаем колесо swiperRef.current.slideTo(spinTimes, 2000, true); // используем "true" для анимации // Выводим индекс в console после вращения setTimeout(() => { setCurrentSlide(randomIndex); console.log('Выпавший слайд: ', randomIndex); }, 2000); // 2 секунды - это длина времени вращения } }, [swiperRef]); return ( <div className='bg-red-200 relative'> <Swiper onSwiper={swiper => { swiperRef.current = swiper; }} slidesPerView={1} loop={true} className='mySwiper' > {[...Array(10)].map((_, index) => ( <SwiperSlide className='swiper-slide' key={index}> Слайд {index + 1} </SwiperSlide> ))} </Swiper> </div> ); }; export default Roulette; ``` ### Объяснение изменений: 1. **spinTimes**: Этот расчет теперь учитывает количество слайдов, и вы добавляете случайный индекс для обеспечения полного прокручивания слайдов. 2. **slideTo**: Вы вызываете его с проекцией на `spinTimes`, что позволяет слайдеру прокрутиться на нужное количество раз. 3. **Анимация**: Убедитесь, что параметр анимации установлен на `true` (или оставьте по умолчанию), чтобы анимация работала корректно. При таком подходе слайдер будет вертеться на три полных круга и остановится на случайном слайде. Не забудьте удостовериться, что ваш Swiper настроен на работу с нужными стилями и компонентами.
Проблема в том, что Swiper с включённым loop воспринимает только фактические индексы слайдов, соответствующие количеству слайдов (в вашем случае — от 0 до 9).
Даже если ты передаёшь индекс больше количества слайдов, Swiper всё равно будет ограничивать значение.
Чтобы реализовать вращение на 3 полных круга + случайный индекс, нужно учитывать поведение с loop, а также использовать slideToLoop, который корректно обрабатывает циклическую прокрутку
swiperRef.current.slideToLoop(randomIndex, 2000, 'ease-out'); setTimeout(() => { setCurrentSlide(randomIndex); console.log('Выпавший слайд: ', randomIndex); }, 2000);
И useEffect лишний
потому что он пытался сразу перейти на индекс 30, который не существует
https://jsfiddle.net/fdot6gpe/