Modern Velvet 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>Modern Velvet Scroller</title> </head> <body> <div class="background-particles" id="particles"></div> <div class="main-container"> <div class="floating-header"> <h1>VELVET MOTION</h1> <div class="subtitle">Experience Visual Poetry</div> </div> <div class="scroll-wrapper"> <div class="image-column" id="imageColumn"> <div class="image-item"> <div class="image-content">?</div> <div class="item-info"> <div class="item-title">Abstract Art</div> <div class="item-desc">Flowing colors merge into infinite possibilities</div> </div> </div> <div class="image-item"> <div class="image-content">?</div> <div class="item-info"> <div class="item-title">Cosmic Dreams</div> <div class="item-desc">Stars dancing across the velvet night sky</div> </div> </div> <div class="image-item"> <div class="image-content">?</div> <div class="item-info"> <div class="item-title">Crystal Luxury</div> <div class="item-desc">Precious gems reflecting eternal light</div> </div> </div> <div class="image-item"> <div class="image-content">?</div> <div class="item-info"> <div class="item-title">Tropical Paradise</div> <div class="item-desc">Exotic blooms in vibrant harmony</div> </div> </div> <div class="image-item"> <div class="image-content">⚡</div> <div class="item-info"> <div class="item-title">Electric Energy</div> <div class="item-desc">Raw power illuminating the darkness</div> </div> </div> <div class="image-item"> <div class="image-content">?</div> <div class="item-info"> <div class="item-title">Mystic Visions</div> <div class="item-desc">Ancient wisdom in crystalline form</div> </div> </div> <!-- Duplicate for seamless loop --> <div class="image-item"> <div class="image-content">?</div> <div class="item-info"> <div class="item-title">Abstract Art</div> <div class="item-desc">Flowing colors merge into infinite possibilities</div> </div> </div> <div class="image-item"> <div class="image-content">?</div> <div class="item-info"> <div class="item-title">Cosmic Dreams</div> <div class="item-desc">Stars dancing across the velvet night sky</div> </div> </div> <div class="image-item"> <div class="image-content">?</div> <div class="item-info"> <div class="item-title">Crystal Luxury</div> <div class="item-desc">Precious gems reflecting eternal light</div> </div> </div> <div class="image-item"> <div class="image-content">?</div> <div class="item-info"> <div class="item-title">Tropical Paradise</div> <div class="item-desc">Exotic blooms in vibrant harmony</div> </div> </div> <div class="image-item"> <div class="image-content">⚡</div> <div class="item-info"> <div class="item-title">Electric Energy</div> <div class="item-desc">Raw power illuminating the darkness</div> </div> </div> <div class="image-item"> <div class="image-content">?</div> <div class="item-info"> <div class="item-title">Mystic Visions</div> <div class="item-desc">Ancient wisdom in crystalline form</div> </div> </div> </div> </div> <div class="side-controls"> <div class="control-dot active" data-speed="slow"></div> <div class="control-dot" data-speed="normal"></div> <div class="control-dot" data-speed="fast"></div> </div> <div class="floating-controls"> <button class="floating-btn" onclick="togglePause()">Pause</button> <button class="floating-btn" onclick="reverseDirection()">Reverse</button> <button class="floating-btn" onclick="resetAnimation()">Reset</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:'96a9a1ee940f8e74',t:'MTc1NDQzMTkxMC4wMDAwMDA='};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: 'Arial', sans-serif; background: radial-gradient(ellipse at center, #1a0d2e 0%, #16213e 50%, #0f3460 100%); min-height: 100vh; overflow-x: hidden; color: white; } .main-container { position: relative; width: 100%; height: 100vh; overflow: hidden; } .floating-header { position: fixed; top: 2rem; left: 50%; transform: translateX(-50%); z-index: 100; text-align: center; animation: floatIn 2s ease-out; } .floating-header h1 { font-size: 2.5rem; font-weight: 100; color: #e0c3fc; text-shadow: 0 0 20px rgba(224, 195, 252, 0.5); margin-bottom: 0.5rem; letter-spacing: 3px; } .floating-header .subtitle { color: #9bb5ff; font-size: 1rem; opacity: 0.8; font-weight: 300; } .scroll-wrapper { position: relative; width: 100%; height: 100vh; display: flex; align-items: center; justify-content: center; } .image-column { display: flex; flex-direction: column; gap: 3rem; animation: verticalScroll 25s linear infinite; padding: 2rem 0; } .image-item { width: 350px; height: 500px; position: relative; border-radius: 25px; overflow: hidden; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); box-shadow: 0 25px 50px rgba(0,0,0,0.3); transition: all 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94); cursor: pointer; } .image-item:nth-child(even) { transform: translateX(100px); background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); } .image-item:nth-child(3n) { transform: translateX(-100px); background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); } .image-item:hover { transform: scale(1.1) rotate(2deg); box-shadow: 0 35px 70px rgba(102, 126, 234, 0.4); z-index: 10; } .image-item:nth-child(even):hover { transform: translateX(100px) scale(1.1) rotate(-2deg); } .image-item:nth-child(3n):hover { transform: translateX(-100px) scale(1.1) rotate(2deg); } .image-content { position: relative; width: 100%; height: 70%; display: flex; align-items: center; justify-content: center; font-size: 5rem; background: rgba(255,255,255,0.1); backdrop-filter: blur(10px); } .image-content::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent); animation: slideShine 3s infinite; } .item-info { position: absolute; bottom: 0; left: 0; right: 0; padding: 2rem; background: rgba(0,0,0,0.7); backdrop-filter: blur(20px); transform: translateY(100%); transition: transform 0.4s ease; } .image-item:hover .item-info { transform: translateY(0); } .item-title { font-size: 1.4rem; font-weight: 600; margin-bottom: 0.5rem; color: #e0c3fc; } .item-desc { font-size: 0.9rem; color: #b8c6db; line-height: 1.5; opacity: 0.9; } .side-controls { position: fixed; right: 2rem; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; gap: 1rem; z-index: 100; } .control-dot { width: 15px; height: 15px; border-radius: 50%; background: rgba(224, 195, 252, 0.3); border: 2px solid rgba(224, 195, 252, 0.6); cursor: pointer; transition: all 0.3s ease; position: relative; } .control-dot:hover, .control-dot.active { background: #e0c3fc; box-shadow: 0 0 20px rgba(224, 195, 252, 0.8); transform: scale(1.3); } .control-dot::after { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 6px; height: 6px; border-radius: 50%; background: rgba(224, 195, 252, 0.8); opacity: 0; transition: opacity 0.3s ease; } .control-dot:hover::after, .control-dot.active::after { opacity: 1; } .floating-controls { position: fixed; bottom: 2rem; left: 50%; transform: translateX(-50%); display: flex; gap: 1rem; z-index: 100; } .floating-btn { padding: 1rem 2rem; background: rgba(224, 195, 252, 0.1); border: 1px solid rgba(224, 195, 252, 0.3); border-radius: 50px; color: #e0c3fc; font-size: 0.9rem; font-weight: 500; cursor: pointer; transition: all 0.3s ease; backdrop-filter: blur(10px); text-transform: uppercase; letter-spacing: 1px; } .floating-btn:hover { background: rgba(224, 195, 252, 0.2); border-color: rgba(224, 195, 252, 0.6); box-shadow: 0 10px 30px rgba(224, 195, 252, 0.3); transform: translateY(-2px); } .floating-btn:active { transform: translateY(0); } .background-particles { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 1; } .particle { position: absolute; width: 4px; height: 4px; background: rgba(224, 195, 252, 0.6); border-radius: 50%; animation: float 6s ease-in-out infinite; } @keyframes verticalScroll { 0% { transform: translateY(0); } 100% { transform: translateY(-50%); } } @keyframes slideShine { 0% { left: -100%; } 50% { left: 100%; } 100% { left: 100%; } } @keyframes floatIn { 0% { opacity: 0; transform: translateX(-50%) translateY(-50px); } 100% { opacity: 1; transform: translateX(-50%) translateY(0); } } @keyframes float { 0%, 100% { transform: translateY(0) rotate(0deg); opacity: 0.7; } 50% { transform: translateY(-20px) rotate(180deg); opacity: 1; } } @media (max-width: 768px) { .image-item { width: 280px; height: 400px; } .image-item:nth-child(even), .image-item:nth-child(3n) { transform: translateX(0); } .floating-header h1 { font-size: 2rem; } .side-controls { right: 1rem; } .floating-controls { flex-direction: column; align-items: center; } } .paused { animation-play-state: paused; }
JavaScript
let isPaused = false; let isReversed = false; const column = document.getElementById('imageColumn'); // Create floating particles function createParticles() { const particlesContainer = document.getElementById('particles'); for (let i = 0; i < 50; i++) { const particle = document.createElement('div'); particle.className = 'particle'; particle.style.left = Math.random() * 100 + '%'; particle.style.top = Math.random() * 100 + '%'; particle.style.animationDelay = Math.random() * 6 + 's'; particle.style.animationDuration = (Math.random() * 4 + 4) + 's'; particlesContainer.appendChild(particle); } } // Control functions function togglePause() { isPaused = !isPaused; column.classList.toggle('paused'); document.querySelector('.floating-btn').textContent = isPaused ? 'Resume' : 'Pause'; } function reverseDirection() { isReversed = !isReversed; column.style.animationDirection = isReversed ? 'reverse' : 'normal'; } function resetAnimation() { column.style.animation = 'none'; setTimeout(() => { column.style.animation = 'verticalScroll 25s linear infinite'; column.style.animationDirection = 'normal'; isReversed = false; }, 10); } // Speed controls document.querySelectorAll('.control-dot').forEach((dot, index) => { dot.addEventListener('click', function() { document.querySelectorAll('.control-dot').forEach(d => d.classList.remove('active')); this.classList.add('active'); const speeds = ['35s', '25s', '15s']; column.style.animationDuration = speeds[index]; }); }); // Hover effects for image items document.querySelectorAll('.image-item').forEach(item => { item.addEventListener('mouseenter', () => { if (!isPaused) { column.classList.add('paused'); } }); item.addEventListener('mouseleave', () => { if (!isPaused) { column.classList.remove('paused'); } }); item.addEventListener('click', function() { this.style.transform += ' scale(1.2)'; setTimeout(() => { this.style.transform = this.style.transform.replace(' scale(1.2)', ''); }, 300); }); }); // Initialize particles createParticles(); // Auto-pause on window blur window.addEventListener('blur', () => { if (!isPaused) { column.classList.add('paused'); } }); window.addEventListener('focus', () => { if (!isPaused) { column.classList.remove('paused'); } });
Output Preview
Desktop
Mobile
Fullscreen