Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.05.2025, 21:07
Кандидат Javascript-наук
Отправить личное сообщение для samdo Посмотреть профиль Найти все сообщения от samdo
 
Регистрация: 27.05.2017
Сообщений: 115

Слайдер с эффектом Ken Burns (приближение) с паузой по клику
Приветствую! Есть слайдер на swiper js. Реализован эффект приближения, но никак не могу добиться нужного результата. Смысл в том, что при клике по изображению эффект приближения должен остановиться (встать на паузу) в том же месте, где он был когда я по нему кликнул. Так же, в этот момент должен остановиться autoplay слайдера. Остановка происходит на 5 секунд, либо возобновляется при повторном клике по изображению (если 5 секунд не прошло). На данный момент клик срабатывает не так как надо, эффект приближения не останавливается, а возвращается в исходный размер, плюс не встает на паузу autoplay. Если кто-то сможет помочь, буду благодарен. Мой код:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Swiper Slider with Zoom Effect</title>
    <link rel="stylesheet" href="https://unpkg.com/swiper/swiper-bundle.min.css">
    <style>
        body {
            margin: 0;
            font-family: Arial, sans-serif;
        }
        .swiper-container {
            width: 100%;
            height: 100vh;
        }
        .swiper-slide {
            display: flex;
            justify-content: center;
            align-items: center;
            overflow: hidden;
        }
        .swiper-slide img {
            max-width: 100%;
            transition: transform 5s ease-in-out;
        }
        .zoom {
            transform: scale(1.2);
        }
    </style>
</head>
<body>
    <div class="swiper-container">
        <div class="swiper-wrapper">
        <div class="swiper-slide"><img src="https://images.wallpaperscraft.com/image/single/lynx_animal_predator_1398659_1920x1080.jpg" alt=""></div>
        <div class="swiper-slide"><img src="https://images.wallpaperscraft.com/image/single/lake_trees_sunset_1398065_1920x1080.jpg" alt=""></div>
        <div class="swiper-slide"><img src="https://images.wallpaperscraft.com/image/single/field_river_trees_1399666_1920x1080.jpg" alt=""></div>
         </div>
        <div class="swiper-pagination"></div>
    </div>

    <script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>
    <script>
        const swiper = new Swiper('.swiper-container', {
            loop: true,
            pagination: {
                el: '.swiper-pagination',
                clickable: true,
            },
        });

        let zoomInterval;
        let isPaused = false;

        function startZoom() {
            const activeSlide = document.querySelector('.swiper-slide-active img');
            if (activeSlide) {
                activeSlide.classList.add('zoom');
                zoomInterval = setTimeout(() => {
                    activeSlide.classList.remove('zoom');
                    swiper.slideNext();
                    startZoom();
                }, 5000);
            }
        }

        function stopZoom() {
            const activeSlide = document.querySelector('.swiper-slide-active img');
            if (activeSlide) {
                clearTimeout(zoomInterval);
                activeSlide.classList.remove('zoom');
            }
        }

        function togglePause() {
            isPaused = !isPaused;
            const activeSlide = document.querySelector('.swiper-slide-active img');
            if (isPaused) {
                stopZoom();
            } else {
                startZoom();
            }
        }

        swiper.on('slideChange', () => {
            if (!isPaused) {
                stopZoom();
                startZoom();
            }
        });

        document.querySelectorAll('.swiper-slide').forEach(slide => {
            slide.addEventListener('click', togglePause);
        });

        // Начинаем эффект приближения
        startZoom();
    </script>
</body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Смена класса по клику, слайдер блоков Дмитрий123 Общие вопросы Javascript 2 04.02.2016 22:28