Velvet Gallery Scroller Template
Preview
Edit
Download
Run
Download Options
HTML File
Download as .html file
CSS File
Download as .css file
JavaScript File
Download as .js file
Combined HTML
All code in one HTML file
Project ZIP
All files in a ZIP archive
Cancel
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Velvet Image Scroller</title> </head> <body> <div class="container"> <div class="header"> <h1>Velvet Gallery</h1> <p>Discover stunning visuals in luxurious motion</p> </div> <div class="scroller-container"> <div class="image-track" id="imageTrack"> <div class="image-card"> <div class="image-placeholder">?</div> <div class="card-content"> <div class="card-title">Cherry Blossoms</div> <div class="card-description">Delicate pink petals dancing in spring breeze</div> </div> </div> <div class="image-card"> <div class="image-placeholder">?</div> <div class="card-content"> <div class="card-title">Golden Sunrise</div> <div class="card-description">Majestic dawn breaking over mountain peaks</div> </div> </div> <div class="image-card"> <div class="image-placeholder">?</div> <div class="card-content"> <div class="card-title">Ocean Waves</div> <div class="card-description">Endless blue waters meeting the horizon</div> </div> </div> <div class="image-card"> <div class="image-placeholder">?️</div> <div class="card-content"> <div class="card-title">Snow Peaks</div> <div class="card-description">Pristine white summits touching the clouds</div> </div> </div> <div class="image-card"> <div class="image-placeholder">?</div> <div class="card-content"> <div class="card-title">Moonlit Night</div> <div class="card-description">Silver light illuminating the peaceful darkness</div> </div> </div> <div class="image-card"> <div class="image-placeholder">?</div> <div class="card-content"> <div class="card-title">Butterfly Garden</div> <div class="card-description">Colorful wings fluttering among flowers</div> </div> </div> <!-- Duplicate set for seamless loop --> <div class="image-card"> <div class="image-placeholder">?</div> <div class="card-content"> <div class="card-title">Cherry Blossoms</div> <div class="card-description">Delicate pink petals dancing in spring breeze</div> </div> </div> <div class="image-card"> <div class="image-placeholder">?</div> <div class="card-content"> <div class="card-title">Golden Sunrise</div> <div class="card-description">Majestic dawn breaking over mountain peaks</div> </div> </div> <div class="image-card"> <div class="image-placeholder">?</div> <div class="card-content"> <div class="card-title">Ocean Waves</div> <div class="card-description">Endless blue waters meeting the horizon</div> </div> </div> <div class="image-card"> <div class="image-placeholder">?️</div> <div class="card-content"> <div class="card-title">Snow Peaks</div> <div class="card-description">Pristine white summits touching the clouds</div> </div> </div> <div class="image-card"> <div class="image-placeholder">?</div> <div class="card-content"> <div class="card-title">Moonlit Night</div> <div class="card-description">Silver light illuminating the peaceful darkness</div> </div> </div> <div class="image-card"> <div class="image-placeholder">?</div> <div class="card-content"> <div class="card-title">Butterfly Garden</div> <div class="card-description">Colorful wings fluttering among flowers</div> </div> </div> </div> </div> <div class="controls"> <button class="control-btn" onclick="pauseScroll()">Pause</button> <button class="control-btn" onclick="resumeScroll()">Resume</button> <button class="control-btn" onclick="changeSpeed()">Speed Up</button> </div> </div> <script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'96a9a596507a4061',t:'MTc1NDQzMjA2MC4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body> </html>
CSS
* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Georgia', serif; background: linear-gradient(135deg, #2d1b69 0%, #11001c 50%, #1a0033 100%); min-height: 100vh; overflow-x: hidden; } .container { max-width: 1200px; margin: 0 auto; padding: 2rem; } .header { text-align: center; margin-bottom: 3rem; animation: fadeInDown 1s ease-out; } .header h1 { color: #e6d7ff; font-size: 3rem; font-weight: 300; letter-spacing: 2px; text-shadow: 0 4px 8px rgba(0,0,0,0.3); margin-bottom: 1rem; } .header p { color: #c4a7ff; font-size: 1.2rem; opacity: 0.9; } .scroller-container { position: relative; overflow: hidden; border-radius: 20px; box-shadow: 0 20px 40px rgba(0,0,0,0.4); background: rgba(255,255,255,0.05); backdrop-filter: blur(10px); border: 1px solid rgba(255,255,255,0.1); } .image-track { display: flex; animation: scroll 20s linear infinite; gap: 2rem; padding: 2rem; } .image-card { flex-shrink: 0; width: 300px; height: 400px; border-radius: 15px; overflow: hidden; position: relative; transition: transform 0.3s ease, box-shadow 0.3s ease; cursor: pointer; background: linear-gradient(45deg, #8b5cf6, #a855f7, #9333ea); } .image-card:hover { transform: translateY(-10px) scale(1.05); box-shadow: 0 25px 50px rgba(139, 92, 246, 0.4); z-index: 10; } .image-placeholder { width: 100%; height: 70%; background: linear-gradient(135deg, #f3e8ff 0%, #e9d5ff 50%, #ddd6fe 100%); display: flex; align-items: center; justify-content: center; font-size: 4rem; position: relative; overflow: hidden; } .image-placeholder::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: linear-gradient(45deg, transparent, rgba(255,255,255,0.3), transparent); animation: shimmer 2s infinite; } .card-content { padding: 1.5rem; background: rgba(139, 92, 246, 0.9); backdrop-filter: blur(10px); height: 30%; display: flex; flex-direction: column; justify-content: center; } .card-title { color: white; font-size: 1.3rem; font-weight: 600; margin-bottom: 0.5rem; text-shadow: 0 2px 4px rgba(0,0,0,0.3); } .card-description { color: #e6d7ff; font-size: 0.9rem; opacity: 0.9; line-height: 1.4; } .controls { display: flex; justify-content: center; gap: 1rem; margin-top: 2rem; animation: fadeInUp 1s ease-out 0.5s both; } .control-btn { background: linear-gradient(135deg, #8b5cf6, #a855f7); border: none; color: white; padding: 1rem 2rem; border-radius: 50px; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 8px 16px rgba(139, 92, 246, 0.3); text-transform: uppercase; letter-spacing: 1px; } .control-btn:hover { transform: translateY(-2px); box-shadow: 0 12px 24px rgba(139, 92, 246, 0.4); background: linear-gradient(135deg, #7c3aed, #8b5cf6); } .control-btn:active { transform: translateY(0); } @keyframes scroll { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } } @keyframes shimmer { 0% { transform: translateX(-100%) translateY(-100%) rotate(45deg); } 100% { transform: translateX(100%) translateY(100%) rotate(45deg); } } @keyframes fadeInDown { from { opacity: 0; transform: translateY(-30px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } @media (max-width: 768px) { .container { padding: 1rem; } .header h1 { font-size: 2rem; } .image-card { width: 250px; height: 350px; } .image-track { padding: 1rem; gap: 1rem; } .controls { flex-direction: column; align-items: center; } .control-btn { width: 200px; } } @media (max-width: 480px) { .image-card { width: 200px; height: 300px; } .header h1 { font-size: 1.5rem; } .card-title { font-size: 1.1rem; } } .paused { animation-play-state: paused; }
JavaScript
let isPaused = false; let currentSpeed = 20; const track = document.getElementById('imageTrack'); function pauseScroll() { track.classList.add('paused'); isPaused = true; } function resumeScroll() { track.classList.remove('paused'); isPaused = false; } function changeSpeed() { if (currentSpeed === 20) { currentSpeed = 10; track.style.animationDuration = '10s'; } else if (currentSpeed === 10) { currentSpeed = 5; track.style.animationDuration = '5s'; } else { currentSpeed = 20; track.style.animationDuration = '20s'; } } // Add hover pause functionality track.addEventListener('mouseenter', () => { if (!isPaused) { track.classList.add('paused'); } }); track.addEventListener('mouseleave', () => { if (!isPaused) { track.classList.remove('paused'); } }); // Add click effects to cards document.querySelectorAll('.image-card').forEach(card => { card.addEventListener('click', function() { this.style.transform = 'translateY(-15px) scale(1.08)'; setTimeout(() => { this.style.transform = ''; }, 200); }); });
Output Preview
Desktop
Mobile
Fullscreen