Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js"></script>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>D3 Playground</title>
</head>
<body>
  <svg id="svg-container" width="800" height="450">
    <circle id="c1" cx="100" cy="100" r="50" />
    <path id="p1" />
  </svg>
  <p>This is a D3 playground, from the article <a href="http://andyshora.com/tweening-shapes-paths-d3-js.html" target="_blank">Tweening Custom Shapes and Paths in D3.js</a>.
  
</body>
</html>
 
circle {
  stroke: black;
  stroke-width: 4;
  fill: powderblue;
}
path {
  stroke: black;
  stroke-width: 4;
}
p {
  font-size: 12px;
}
 
var c1, p1;
window.onload = onLoad();
function tweenCircle() {
  var newRadius = parseInt(c1.attr('r'), 10) === 20 ? 50 : 20;
  c1
    .transition()
    .duration(2000)
    .attr('r', newRadius)
    .each('end', tweenCircle);
};
function tweenPath() {
  
  p1
    .transition()
    .duration(2000)
    .attrTween('d', () => {
      return t => {
        var arr = ['M', 100, 300, 'l', 100 * Math.sin(t * Math.PI), 100 *Math.cos(t * Math.PI), 'Z'];
        return arr.join(' ');
      }
    })
    .each('end', tweenPath);
};
function onLoad() {
  var svg = d3.select('#svg-container');
  c1 = svg.select('#c1');
  p1 = svg.select('#p1');
  
  tweenCircle();
  tweenPath();
}
Output 300px

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
anonymouspro
0viewers