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>

