The following example implements a scrollable d3.js visualization using ScrollMagic.js.
Create an index.html
with the following content:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src="https://d3js.org/d3.v4.min.js"></script> <script src="https://fastcdn.org/ScrollMagic/2.0.5/minified/ScrollMagic.min.js"></script> <style media="screen"> html, body { height: 100%; margin: 0; } .pane { width: 100%; height: 100%; background-color: #eee; } .pane.a { background-color: tomato; } .pane.b { background-color: #ddd; } .pane.c { background-color: steelblue; } </style> </head> <body> <div class="pane a"> </div> <div class="pane b"> <svg class="canvas"> </svg> </div> <div class="pane c"> </div> <script type="text/javascript"> // set SVG to full width and height var canvas = d3.select('.canvas') .attr('width', window.innerWidth) .attr('height', window.innerHeight); // create the scales for the full width and height var xScale = d3.scaleLinear() .range([150, window.innerWidth - 150]); var yScale = d3.scaleLinear() .range([150, window.innerHeight - 150]); // create the circle var circle = d3.select('.canvas') .append('circle') .attr('r', 100); // our custom function to position the circle function setCircle(progress) { circle.attr('cx', xScale(progress)); circle.attr('cy', yScale(progress)); } // make initial positioning setCircle(0); // create a scroll magic controller var controller = new ScrollMagic.Controller(); // create a scene new ScrollMagic.Scene({ // the element to scroll inside triggerElement: '.pane.b', // how many pixels do we scroll duration: window.innerHeight * 2, // set trigger to top triggerHook: 'onLeave' }) // pins the element for the the scene's duration .setPin('.pane.b') // assign the scene to the controller .addTo(controller) // subscribe to progress events .on('progress', function(e) { // position the circle accordingly setCircle(e.progress); }); </script> </body> </html>