"GSAP Scroll Direction"
Bootstrap 4.1.1 Snippet by pankaj92

<link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css"> <script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <!------ Include the above in your HEAD tag ----------> <section class="div-section"> <ul class="circle-container fade-top-bottom" id="circle"> <li class="circle-item">Quick Transfer</li> <li class="circle-item">SEPA & SWIFT</li> <li class="circle-item">Send Payments</li> <li class="circle-item">Currency Exchange</li> <li class="circle-item">Innovation</li> <li class="circle-item">Book a Meeting</li> <li class="circle-item">Quick Transfer</li> <li class="circle-item">SEPA & SWIFT</li> <li class="circle-item">Send Payments</li> <li class="circle-item">Currency Exchange</li> <li class="circle-item">Innovation</li> <li class="circle-item">Book a Meeting</li> <li class="circle-item">Quick Transfer</li> <li class="circle-item">SEPA & SWIFT</li> <li class="circle-item">Send Payments</li> <li class="circle-item">Currency Exchange</li> <li class="circle-item">Innovation</li> <li class="circle-item">Book a Meeting</li> </ul> </section>
body { min-height: 100vh; margin: 0; background: #7fd8ff; overflow-x: hidden; } .div-section { width: 100vw; height: 100vh; position: relative; background: #7fd8ff; } .circle-container { height: 100%; width: 100%; overflow: hidden; margin: auto 0px; -webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 20%, black 80%, transparent 100%); mask-image: linear-gradient(to bottom, transparent 0%, black 20%, black 80%, transparent 100%); position: absolute; top: 50%; left: 90%; transform: translate(-50%, -50%); pointer-events: none; list-style: none; } .circle-item { position: absolute; top: 50%; left: 50%; transform-origin: center center; font-size: 3.8rem; font-weight: bold; color: #003366; white-space: nowrap; }
const items = document.querySelectorAll(".circle-item"); const radius = 400; const total = items.length; let rotation = 0; let scrollDelta = 0; let autoRotateSpeed = 0.01; let scrollTimeout; let scrollDirection = 1; // 1 for clockwise, -1 for anticlockwise function updatePositions() { items.forEach((el, i) => { const angle = rotation + (i / total) * Math.PI * 2; const x = Math.cos(angle) * radius; const y = Math.sin(angle) * radius; el.style.transform = `translate(${x}px, ${y}px)`; }); } // Handle scroll input window.addEventListener("wheel", (e) => { const delta = e.deltaY * 0.006; scrollDelta += delta; // Detect scroll direction scrollDirection = delta > 0 ? 1 : -1; // Reset timeout to ensure smooth transition clearTimeout(scrollTimeout); scrollTimeout = setTimeout(() => { // After scroll ends, set autoRotateSpeed in the same direction autoRotateSpeed = Math.abs(autoRotateSpeed) * scrollDirection; }, 300); // delay before returning to auto }); // Animate orbit gsap.ticker.add(() => { // Apply both scroll delta and auto-rotation rotation += autoRotateSpeed + scrollDelta; scrollDelta *= 0.9; // decay scroll effect updatePositions(); }); updatePositions(); // first render

Related: See More


Questions / Comments: