A example of using ScrollMagic to trigger Anime.js animations. Some of the animations are set to play when triggered and some are set to progress as the user scrolls the page.
A Pen by Rex Bullington on CodePen.
A example of using ScrollMagic to trigger Anime.js animations. Some of the animations are set to play when triggered and some are set to progress as the user scrolls the page.
A Pen by Rex Bullington on CodePen.
| <nav class="navbar navbar-expand-md navbar-light bg-light fixed-top"> | |
| <a class="navbar-brand" href="#">START</a> | |
| <button | |
| class="navbar-toggler" | |
| type="button" | |
| data-toggle="collapse" | |
| data-target="#navbarsExampleDefault" | |
| aria-controls="navbarsExampleDefault" | |
| aria-expanded="false" | |
| aria-label="Toggle navigation" | |
| > | |
| <span class="navbar-toggler-icon"></span> | |
| </button> | |
| <div class="collapse navbar-collapse" id="navbarsExampleDefault"> | |
| <ul class="navbar-nav mr-auto"> | |
| <li class="nav-item"> | |
| <a class="nav-link" href="#one">Section 1</a> | |
| </li> | |
| <li class="nav-item"> | |
| <a class="nav-link" href="#two">Section 2</a> | |
| </li> | |
| <li class="nav-item"> | |
| <a class="nav-link" href="#three">Section 3</a> | |
| </li> | |
| <li class="nav-item"> | |
| <a class="nav-link" href="#four">Section 4</a> | |
| </li> | |
| </ul> | |
| </div> | |
| </nav> | |
| <main role="main" class="container-fluid"> | |
| <div class="row no-gutters"> | |
| <div class="col text-center"> | |
| <h1 class="py-5">SCROLL DOWN TO TRY ANIMATIONS</h1> | |
| <img | |
| src="https://drive.google.com/uc?export=view&id=1g2iw0lEBMYFyKjI9A1jN2wm0glHiXubt" | |
| class="img-fluid" | |
| alt="Responsive image" | |
| /> | |
| </div> | |
| </div> | |
| <section id="intro" class="section"> | |
| <div class="row no-gutters"> | |
| <div class="col"> | |
| <div> | |
| The Neuron scales the steepest climbs and descends with complete | |
| control thanks to its 130 - 140mm suspension, 29” wheels (in sizes | |
| M-XL) and confidence-inspiring geometry. | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <section id="one" class="section"> | |
| <div class="row no-gutters"> | |
| <div class="col"> | |
| <div class="rectangle"></div> | |
| <div class="elem"> | |
| <div class="text-block"> | |
| <h2 class="mb-0">2021</h2> | |
| <h5>Neuron CF SLX 9</h5> | |
| </div> | |
| <div class="blocks"> | |
| <div></div> | |
| <div></div> | |
| <div></div> | |
| <div></div> | |
| <div></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <section id="two" class="section"> | |
| <div class="row no-gutters"> | |
| <div class="col"> | |
| <div class="elem"> | |
| <div> | |
| <img | |
| src="https://drive.google.com/uc?export=view&id=1wx3G8XcML7t9hTiE1ioUkLUiqUHkI_AJ" | |
| class="img-fluid" | |
| alt="Responsive image" | |
| /> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <section id="three" class="section"> | |
| <div class="image"></div> | |
| <div class="row no-gutters"> | |
| <div class="col"> | |
| <div class="elem"> | |
| <h2>GET OUT THERE</h2> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <section id="four" class="section"> | |
| <div class="image"></div> | |
| <div class="row no-gutters"> | |
| <div class="col"> | |
| <div class="elem"> | |
| <h2>GO RIDE</h2> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| </main> |
| // Add active class to current nav selected link | |
| var a = document.querySelectorAll(".navbar li a"); | |
| for (var i = 0, length = a.length; i < length; i++) { | |
| a[i].onclick = function() { | |
| var b = document.querySelector(".navbar li.active"); | |
| if (b) b.classList.remove("active"); | |
| this.parentNode.classList.add('active'); | |
| }; | |
| } | |
| // Color palette variables | |
| let dark = '#252525'; | |
| let mid = '#888'; | |
| let light = 'rgba(255, 255, 255, 0.4)'; | |
| // Add scrollmagic controller | |
| let controller = new ScrollMagic.Controller(); | |
| //------------------ | |
| //TIMELINE 1 | |
| //------------------ | |
| // Add timeline | |
| let tl1 = anime.timeline({autoplay: false}); | |
| // Add animations | |
| let s1a1 = { | |
| targets: '#one .elem', | |
| opacity: 1, | |
| translateX: { | |
| value: [250, 0], | |
| duration: 800 | |
| }, | |
| rotate: { | |
| value: [90, 0], | |
| duration: 1200, | |
| easing: 'easeInOutSine' | |
| }, | |
| scale: { | |
| value: [2, 1.5], | |
| duration: 1100, | |
| delay: 800, | |
| easing: 'easeInOutQuart' | |
| }, | |
| color: [light, dark], | |
| duration: 800, | |
| delay: 0, | |
| easing: 'easeInOutSine' | |
| }; | |
| let s1a2 = { | |
| targets: '#one .elem .blocks > div', | |
| backgroundColor: [light, dark], | |
| borderRadius: function(el) { return anime.random(2, 10); }, | |
| delay: function(el) { return anime.random(0, 800); } | |
| }; | |
| let s1a3 = { | |
| targets: '#one .rectangle', | |
| opacity: [0,1], | |
| translateX: { | |
| value: ['-100vw', '0vw'], | |
| duration: 1500, | |
| }, | |
| translateY: { | |
| value: [-100, 0], | |
| duration: 1500, | |
| }, | |
| easing: 'easeInOutSine', | |
| duration: 2000 | |
| }; | |
| // Add children | |
| tl1.add(s1a3).add(s1a1, '-=1600').add(s1a2, '-=1300'); | |
| // Get section height | |
| let oneHeight = document.getElementById("one").clientHeight; | |
| console.log('oneHeight: ' + oneHeight); | |
| //------------------ | |
| //SCENE 1 | |
| //------------------ | |
| //Add first scrollmagic scene | |
| let scene1 = new ScrollMagic.Scene({ | |
| triggerElement: "#one", | |
| triggerHook: 0.5, | |
| reverse: false | |
| }) | |
| // Add debug indicators | |
| .addIndicators({ | |
| colorTrigger: "black", | |
| colorStart: "blue", | |
| colorEnd: "red", | |
| indent: 10 | |
| }) | |
| // Trigger animation timeline | |
| .on("enter", function (event) { | |
| tl1.play(); | |
| }) | |
| .addTo(controller); | |
| //------------------ | |
| //TIMELINE 2 | |
| //------------------ | |
| // Add timeline | |
| let tl2 = anime.timeline({autoplay: false}); | |
| // Add animations | |
| let s2a1 = { | |
| targets: '#two .elem img', | |
| opacity: [0.3,1], | |
| scale: [4,1], | |
| duration: 1000, | |
| delay: 0, | |
| easing: 'easeInOutSine' | |
| }; | |
| let s2a2 = { | |
| targets: '#two .elem img', | |
| scale: 1, | |
| duration: 2000, | |
| }; | |
| // Add children | |
| tl2.add(s2a1).add(s2a2); | |
| // Get section height | |
| let twoHeight = document.getElementById("two").clientHeight; | |
| console.log('twoHeight: ' + twoHeight); | |
| //------------------ | |
| //SCENE 2 | |
| //------------------ | |
| //Add second scrollmagic scene | |
| let scene2 = new ScrollMagic.Scene({ | |
| triggerElement: "#two", | |
| duration: 4500, | |
| triggerHook: 0, | |
| }) | |
| // Add debug indicators | |
| .addIndicators({ | |
| colorTrigger: "black", | |
| colorStart: "blue", | |
| colorEnd: "red", | |
| indent: 10 | |
| }) | |
| // Trigger animation timeline | |
| //Use scroll position to play animation | |
| .on("progress", function (event) { | |
| tl2.seek(tl2.duration * event.progress); | |
| }) | |
| .setPin('#two') | |
| .addTo(controller); | |
| //------------------ | |
| //TIMELINE 3 | |
| //------------------ | |
| // Add timeline | |
| let tl3 = anime.timeline({autoplay: false}); | |
| // Add animations | |
| let s3a1 = { | |
| targets: '#three h2', | |
| opacity: 1, | |
| scale: [4,1.5], | |
| duration: 1000, | |
| delay: 0, | |
| easing: 'easeInOutSine' | |
| }; | |
| // Add children | |
| tl3.add(s3a1); | |
| //------------------ | |
| //TIMELINE 4 | |
| //------------------ | |
| // Add timeline | |
| let tl4 = anime.timeline({autoplay: false}); | |
| // Add animations | |
| let s3a2 = { | |
| targets: '#three .image', | |
| opacity: [0,.5], | |
| translateX: { | |
| value: ['-100%', '0%'], | |
| duration: 1500, | |
| }, | |
| duration: 1000, | |
| delay: 0, | |
| easing: 'easeInOutSine' | |
| }; | |
| // Add children | |
| tl4.add(s3a2); | |
| //------------------ | |
| //SCENE 3 | |
| //------------------ | |
| //Add third scrollmagic scene | |
| let scene3 = new ScrollMagic.Scene({ | |
| triggerElement: "#three", | |
| duration: 2000, | |
| triggerHook: 0 | |
| }) | |
| // Add debug indicators | |
| .addIndicators({ | |
| colorTrigger: "black", | |
| colorStart: "blue", | |
| colorEnd: "red", | |
| indent: 10 | |
| }) | |
| // Trigger animation timeline | |
| //Use scroll position to play animation | |
| .on("enter", function (event) { | |
| tl3.play(); | |
| }) | |
| .on("progress", function (event) { | |
| tl4.seek((tl4.duration * event.progress) * 3); | |
| }) | |
| .setPin('#three') | |
| .addTo(controller); | |
| //------------------ | |
| //TIMELINE 5 | |
| //------------------ | |
| // Add timeline | |
| let tl5 = anime.timeline({autoplay: false}); | |
| // Add animations | |
| let s4a1 = { | |
| targets: '#four h2', | |
| opacity: 1, | |
| scale: [1.5,3], | |
| duration: 1000, | |
| delay: 0, | |
| easing: 'easeInOutSine' | |
| }; | |
| // Add children | |
| tl5.add(s4a1); | |
| //------------------ | |
| //TIMELINE 6 | |
| //------------------ | |
| // Add timeline | |
| let tl6 = anime.timeline({autoplay: false}); | |
| // Add animations | |
| let s4a2 = { | |
| targets: '#four .image', | |
| opacity: [0,.5], | |
| translateX: { | |
| value: ['100%', '0%'], | |
| duration: 1500, | |
| }, | |
| duration: 1000, | |
| delay: 0, | |
| easing: 'easeInOutSine' | |
| }; | |
| // Add children | |
| tl6.add(s4a2); | |
| //------------------ | |
| //SCENE 4 | |
| //------------------ | |
| //Add third scrollmagic scene | |
| let scene4 = new ScrollMagic.Scene({ | |
| triggerElement: "#four", | |
| duration: 2000, | |
| triggerHook: 0 | |
| }) | |
| // Add debug indicators | |
| .addIndicators({ | |
| colorTrigger: "black", | |
| colorStart: "blue", | |
| colorEnd: "red", | |
| indent: 10 | |
| }) | |
| // Trigger animation timeline | |
| //Use scroll position to play animation | |
| .on("enter", function (event) { | |
| tl5.play(); | |
| }) | |
| .on("progress", function (event) { | |
| tl6.seek((tl6.duration * event.progress) * 3); | |
| }) | |
| .setPin('#four') | |
| .addTo(controller); | |
| <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> | |
| <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/ScrollMagic.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/plugins/debug.addIndicators.min.js"></script> |
| body { | |
| padding-top: 56px; | |
| font-weight: 300; | |
| letter-spacing: 0.03em; | |
| background-color: #f7f7f7; | |
| } | |
| nav.navbar { | |
| border-bottom: solid 1px #d6d6d6; | |
| } | |
| .navbar .navbar-brand { | |
| font-weight: 500; | |
| letter-spacing: .065em; | |
| } | |
| .navbar-nav .nav-link { | |
| letter-spacing: .035em; | |
| } | |
| .navbar li.active a { | |
| font-weight: 400; | |
| } | |
| main.container-fluid { | |
| padding-left: 0; | |
| padding-right: 0; | |
| } | |
| .spacer { | |
| height: 40vh; | |
| } | |
| .rectangle { | |
| position: absolute; | |
| width: 97vw; | |
| height: 30vw; | |
| border-radius: 10px; | |
| background: linear-gradient(45deg, #69b7bf 25%, #ffe664); | |
| } | |
| @media (min-width: 500px) { | |
| .rectangle { | |
| width: 80%; | |
| } | |
| } | |
| .section > .row > .col { | |
| height: 100vh; | |
| display: flex; | |
| justify-content: center; | |
| align-content: center; | |
| align-items: center; | |
| } | |
| #intro .col { | |
| height: 50vh; | |
| padding: 9vw 6vw; | |
| font-size: 18px; | |
| } | |
| @media (min-width: 1000px) { | |
| #intro .col { | |
| padding: 18vw 12vw; | |
| font-size: 2.7vw; | |
| } | |
| } | |
| #one { | |
| background-color: #212121; | |
| } | |
| #one .elem { | |
| opacity: 0; | |
| letter-spacing: 0.04em; | |
| } | |
| #one .text-block h2 { | |
| font-size: 5vw; | |
| letter-spacing: 0.2em; | |
| font-weight: 300; | |
| line-height: 1; | |
| } | |
| #one .text-block h5 { | |
| font-size: 4vw; | |
| line-height: 1; | |
| } | |
| #one .elem .blocks { | |
| display: flex; | |
| justify-content: space-between; | |
| align-content: center; | |
| align-items: center; | |
| } | |
| #one .elem .blocks > div { | |
| height: 20px; | |
| width: 20px; | |
| margin: 2px; | |
| border-radius: 2px; | |
| background-color: #333; | |
| } | |
| #two { | |
| height: auto; | |
| overflow: hidden; | |
| padding: 3vw 15vw 10vw; | |
| background: linear-gradient(0deg, #69b7bf 25%, #ffe664); | |
| } | |
| #three, #four { | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| #three .image, #four .image { | |
| position: absolute; | |
| top: 0; | |
| bottom:0; | |
| width: 100%; | |
| } | |
| #three .image { | |
| background-image: url("https://drive.google.com/uc?export=view&id=10tzeBrvoR5OO3EK_Wcg-gRxbVO7xv6em"); | |
| background-size: cover; | |
| background-repeat: no-repeat; | |
| background-position: center; | |
| } | |
| #four .image { | |
| background-image: url("https://drive.google.com/uc?export=view&id=1SzCTDu5_eAF569lFHtNyIlUCrdW2mOXu"); | |
| background-size: cover; | |
| background-repeat: no-repeat; | |
| background-position: center; | |
| } |
| <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" /> |