Zigzag Card Slider

Zigzag Card Slider

I’ll create an interactive card slider with a zigzag layout that alternates card positions for visual interest. This design will work well for showcasing products, testimonials, or portfolio items.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Auto Zigzag Card Slider</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }
        
        body {
            background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);
            min-height: 100vh;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            padding: 20px;
            color: #fff;
        }
        
        .container {
            max-width: 1200px;
            width: 100%;
            text-align: center;
        }
        
        h1 {
            font-size: 2.8rem;
            margin-bottom: 10px;
            text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
        }
        
        .subtitle {
            font-size: 1.2rem;
            margin-bottom: 40px;
            opacity: 0.9;
        }
        
        .slider-container {
            position: relative;
            padding: 40px 0;
            overflow: hidden;
            width: 100%;
        }
        
        .cards-wrapper {
            display: flex;
            transition: transform 0.8s ease;
            margin: 0 -15px;
        }
        
        .card {
            flex: 0 0 calc(33.333% - 30px);
            margin: 0 15px;
            background: rgba(255, 255, 255, 0.9);
            border-radius: 15px;
            overflow: hidden;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
            transition: transform 0.5s ease, box-shadow 0.5s ease;
            color: #333;
            display: flex;
            flex-direction: column;
            position: relative;
        }
        
        .card:nth-child(even) {
            transform: translateY(40px);
        }
        
        .card:hover {
            transform: translateY(-10px) scale(1.03);
            box-shadow: 0 15px 35px rgba(0, 0, 0, 0.3);
        }
        
        .card-image {
            height: 200px;
            overflow: hidden;
            position: relative;
        }
        
        .card-image img {
            width: 100%;
            height: 100%;
            object-fit: cover;
            transition: transform 0.5s ease;
        }
        
        .card:hover .card-image img {
            transform: scale(1.1);
        }
        
        .card-content {
            padding: 20px;
            flex-grow: 1;
        }
        
        .card-title {
            font-size: 1.4rem;
            margin-bottom: 10px;
            color: #2c3e50;
        }
        
        .card-description {
            color: #7f8c8d;
            line-height: 1.6;
            margin-bottom: 15px;
        }
        
        .card-button {
            display: inline-block;
            padding: 10px 20px;
            background: linear-gradient(to right, #6a11cb, #2575fc);
            color: white;
            border-radius: 30px;
            text-decoration: none;
            font-weight: 600;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
        }
        
        .card-button:hover {
            transform: translateY(-3px);
            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
        }
        
        .slider-controls {
            display: flex;
            justify-content: center;
            margin-top: 30px;
            gap: 15px;
        }
        
        .control-btn {
            width: 50px;
            height: 50px;
            border-radius: 50%;
            background: rgba(255, 255, 255, 0.2);
            border: none;
            color: white;
            font-size: 1.5rem;
            cursor: pointer;
            transition: all 0.3s ease;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .control-btn:hover {
            background: rgba(255, 255, 255, 0.3);
            transform: scale(1.1);
        }
        
        .indicators {
            display: flex;
            justify-content: center;
            margin-top: 20px;
            gap: 10px;
        }
        
        .indicator {
            width: 12px;
            height: 12px;
            border-radius: 50%;
            background: rgba(255, 255, 255, 0.5);
            cursor: pointer;
            transition: all 0.3s ease;
        }
        
        .indicator.active {
            background: white;
            transform: scale(1.3);
        }
        
        .auto-toggle {
            margin-top: 20px;
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
        }
        
        .toggle-btn {
            padding: 8px 16px;
            background: rgba(255, 255, 255, 0.2);
            border: none;
            border-radius: 20px;
            color: white;
            cursor: pointer;
            transition: all 0.3s ease;
        }
        
        .toggle-btn:hover {
            background: rgba(255, 255, 255, 0.3);
        }
        
        .toggle-btn.active {
            background: rgba(255, 255, 255, 0.4);
        }
        
        @media (max-width: 992px) {
            .card {
                flex: 0 0 calc(50% - 30px);
            }
        }
        
        @media (max-width: 576px) {
            .card {
                flex: 0 0 calc(100% - 30px);
            }
            
            .card:nth-child(even) {
                transform: translateY(0);
            }
            
            h1 {
                font-size: 2.2rem;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Auto Zigzag Card Slider</h1>
        <p class="subtitle">Watch the cards slide automatically with a zigzag pattern</p>
        
        <div class="slider-container">
            <div class="cards-wrapper">
                <div class="card">
                    <div class="card-image">
                        <img src="https://images.unsplash.com/photo-1550745165-9bc0b252726f?ixlib=rb-4.0.3&auto=format&fit=crop&w=500&q=80" alt="Technology">
                    </div>
                    <div class="card-content">
                        <h3 class="card-title">Modern Technology</h3>
                        <p class="card-description">Discover the latest advancements in technology and how they're shaping our future.</p>
                        <a href="#" class="card-button">Learn More</a>
                    </div>
                </div>
                
                <div class="card">
                    <div class="card-image">
                        <img src="https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?ixlib=rb-4.0.3&auto=format&fit=crop&w=500&q=80" alt="Nature">
                    </div>
                    <div class="card-content">
                        <h3 class="card-title">Beautiful Nature</h3>
                        <p class="card-description">Explore the wonders of nature and find peace in the great outdoors.</p>
                        <a href="#" class="card-button">Explore</a>
                    </div>
                </div>
                
                <div class="card">
                    <div class="card-image">
                        <img src="https://images.unsplash.com/photo-1518770660439-4636190af475?ixlib=rb-4.0.3&auto=format&fit=crop&w=500&q=80" alt="Design">
                    </div>
                    <div class="card-content">
                        <h3 class="card-title">Creative Design</h3>
                        <p class="card-description">See how creative design solutions can transform ordinary into extraordinary.</p>
                        <a href="#" class="card-button">View Work</a>
                    </div>
                </div>
                
                <div class="card">
                    <div class="card-image">
                        <img src="https://images.unsplash.com/photo-1542744095-fcf48d80b0fd?ixlib=rb-4.0.3&auto=format&fit=crop&w=500&q=80" alt="Development">
                    </div>
                    <div class="card-content">
                        <h3 class="card-title">Web Development</h3>
                        <p class="card-description">Learn about modern web development practices and cutting-edge frameworks.</p>
                        <a href="#" class="card-button">Get Started</a>
                    </div>
                </div>
                
                <div class="card">
                    <div class="card-image">
                        <img src="https://images.unsplash.com/photo-1470229722913-7c0e2dbbafd3?ixlib=rb-4.0.3&auto=format&fit=crop&w=500&q=80" alt="Music">
                    </div>
                    <div class="card-content">
                        <h3 class="card-title">Music Production</h3>
                        <p class="card-description">Dive into the world of music production and create your own sound.</p>
                        <a href="#" class="card-button">Listen</a>
                    </div>
                </div>
                
                <div class="card">
                    <div class="card-image">
                        <img src="https://images.unsplash.com/photo-1460925895917-afdab827c52f?ixlib=rb-4.0.3&auto=format&fit=crop&w=500&q=80" alt="Analytics">
                    </div>
                    <div class="card-content">
                        <h3 class="card-title">Data Analytics</h3>
                        <p class="card-description">Harness the power of data to drive business decisions and strategies.</p>
                        <a href="#" class="card-button">Analyze</a>
                    </div>
                </div>
            </div>
            
            <div class="slider-controls">
                <button class="control-btn prev-btn"><i class="fas fa-chevron-left"></i></button>
                <button class="control-btn next-btn"><i class="fas fa-chevron-right"></i></button>
            </div>
            
            <div class="indicators">
                <div class="indicator active"></div>
                <div class="indicator"></div>
                <div class="indicator"></div>
            </div>
            
            <div class="auto-toggle">
                <button class="toggle-btn active" id="pause-btn"><i class="fas fa-pause"></i> Pause</button>
                <button class="toggle-btn" id="play-btn"><i class="fas fa-play"></i> Play</button>
            </div>
        </div>
    </div>

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            const cardsWrapper = document.querySelector('.cards-wrapper');
            const cards = document.querySelectorAll('.card');
            const prevBtn = document.querySelector('.prev-btn');
            const nextBtn = document.querySelector('.next-btn');
            const indicators = document.querySelectorAll('.indicator');
            const pauseBtn = document.getElementById('pause-btn');
            const playBtn = document.getElementById('play-btn');
            
            let currentIndex = 0;
            let autoSlideInterval;
            const cardCount = cards.length;
            const cardsPerView = Math.min(3, cardCount); // Show up to 3 cards at a time
            
            // Initialize auto-slide
            startAutoSlide();
            
            // Set initial position
            updateSlider();
            
            // Event listeners for buttons
            prevBtn.addEventListener('click', () => {
                if (currentIndex > 0) {
                    currentIndex--;
                    updateSlider();
                    resetAutoSlide();
                }
            });
            
            nextBtn.addEventListener('click', () => {
                if (currentIndex < cardCount - cardsPerView) {
                    currentIndex++;
                    updateSlider();
                    resetAutoSlide();
                }
            });
            
            // Event listeners for indicators
            indicators.forEach((indicator, index) => {
                indicator.addEventListener('click', () => {
                    currentIndex = index * cardsPerView;
                    updateSlider();
                    resetAutoSlide();
                });
            });
            
            // Toggle auto-slide
            pauseBtn.addEventListener('click', () => {
                stopAutoSlide();
                pauseBtn.classList.add('active');
                playBtn.classList.remove('active');
            });
            
            playBtn.addEventListener('click', () => {
                startAutoSlide();
                playBtn.classList.add('active');
                pauseBtn.classList.remove('active');
            });
            
            // Touch events for mobile swipe
            let startX = 0;
            let endX = 0;
            
            cardsWrapper.addEventListener('touchstart', (e) => {
                startX = e.touches[0].clientX;
            }, { passive: true });
            
            cardsWrapper.addEventListener('touchend', (e) => {
                endX = e.changedTouches[0].clientX;
                handleSwipe();
            }, { passive: true });
            
            function handleSwipe() {
                const swipeThreshold = 50;
                
                if (startX - endX > swipeThreshold) {
                    // Swipe left - next
                    if (currentIndex < cardCount - cardsPerView) {
                        currentIndex++;
                        updateSlider();
                        resetAutoSlide();
                    }
                } else if (endX - startX > swipeThreshold) {
                    // Swipe right - previous
                    if (currentIndex > 0) {
                        currentIndex--;
                        updateSlider();
                        resetAutoSlide();
                    }
                }
            }
            
            function updateSlider() {
                const cardWidth = cards[0].offsetWidth + 30; // width + margin
                cardsWrapper.style.transform = `translateX(-${currentIndex * cardWidth}px)`;
                
                // Update indicators
                indicators.forEach((indicator, index) => {
                    indicator.classList.toggle('active', index === Math.floor(currentIndex / cardsPerView));
                });
                
                // Show/hide navigation buttons based on position
                prevBtn.style.visibility = currentIndex === 0 ? 'hidden' : 'visible';
                nextBtn.style.visibility = currentIndex >= cardCount - cardsPerView ? 'hidden' : 'visible';
            }
            
            function startAutoSlide() {
                autoSlideInterval = setInterval(() => {
                    if (currentIndex < cardCount - cardsPerView) {
                        currentIndex++;
                    } else {
                        currentIndex = 0; // Loop back to start
                    }
                    updateSlider();
                }, 3000); // Change slide every 3 seconds
            }
            
            function stopAutoSlide() {
                clearInterval(autoSlideInterval);
            }
            
            function resetAutoSlide() {
                stopAutoSlide();
                startAutoSlide();
            }
            
            // Handle window resize
            window.addEventListener('resize', () => {
                // Recalculate the translate value based on current card width
                const cardWidth = cards[0].offsetWidth + 30;
                cardsWrapper.style.transform = `translateX(-${currentIndex * cardWidth}px)`;
            });
            
            // Pause auto-slide when user hovers over slider
            cardsWrapper.addEventListener('mouseenter', stopAutoSlide);
            cardsWrapper.addEventListener('mouseleave', () => {
                if (playBtn.classList.contains('active')) {
                    startAutoSlide();
                }
            });
        });
    </script>
</body>
</html>

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *