<!DOCTYPE html> <meta charset="utf-8"> <style> text { fill: 'black'; font-family: 'Arial'; font-weight: bold; font-size: 28px; } </style> <body> <!-- load the d3.js library --> <script src="https://d3js.org/d3.v7.min.js"></script> <script> var easing = [ "easeElastic", "easeBounce", "easeLinear", "easeSin", "easeQuad", "easeCubic", "easePoly", "easeCircle", "easeExp", "easeBack" ]; var svg = d3.select("body") .append("svg") .attr("width", 960) .attr("height", 500); function circleTransition(easement,yPos){ var timeCircle = svg.append("circle") .attr("fill", "steelblue") .attr("r", 20); repeat(); function repeat() { timeCircle .attr('cx', 210) // position the circle at 40 on the x axis .attr('cy', (yPos*45)+25) // position the circle at 250 on the y axis .transition() // apply a transition .ease(easement) // control the speed of the transition .duration(4000) // apply it over 2000 milliseconds .attr('cx', 720) // move the circle to 920 on the x axis .transition() // apply a transition .ease(easement) // control the speed of the transition .duration(4000) // apply it over 2000 milliseconds .attr('cx', 210) // return the circle to 40 on the x axis .on("end", repeat); // when the transition finishes start again }; var easeType = svg.append("text") .attr("dy", ".35em") // set offset y position .attr("x", 475) .attr("text-anchor", "middle") // set anchor x justification .attr("y", (yPos*45)+25) .text(easing[yPos]); }; circleTransition(d3.easeElastic,0); circleTransition(d3.easeBounce,1); circleTransition(d3.easeLinear,2); circleTransition(d3.easeSin,3); circleTransition(d3.easeQuad,4); circleTransition(d3.easeCubic,5); circleTransition(d3.easePoly,6); circleTransition(d3.easeCircle,7); circleTransition(d3.easeExp,8); circleTransition(d3.easeBack,9); </script> </body>