Marker animation along SVG "path" element with D3.js: animating "path" and marker movement synchronously.
Created
December 28, 2013 19:08
-
-
Save KoGor/8163022 to your computer and use it in GitHub Desktop.
Marker animation along SVG <path> element with D3.js II
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="en"> | |
<meta charset="utf-8"> | |
<head> | |
<title>SVG path animation</title> | |
<link href="style.css" rel="stylesheet"> | |
<script src="http://d3js.org/d3.v3.min.js"></script> | |
<script src="http://d3js.org/queue.v1.min.js"></script> | |
</head> | |
<body> | |
<!-- start --> | |
<div id="pathAnimation"> | |
<script src="pathFollowAnimation.js"></script> | |
</div> | |
<!-- end --> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
queue() | |
.defer(d3.xml, "wiggle.svg", "image/svg+xml") | |
.await(ready); | |
function ready(error, xml) { | |
//Adding our svg file to HTML document | |
var importedNode = document.importNode(xml.documentElement, true); | |
d3.select("#pathAnimation").node().appendChild(importedNode); | |
var svg = d3.select("svg"); | |
var path = svg.select("path#wiggle").call(transition); | |
var startPoint = pathStartPoint(path); | |
var marker = svg.append("circle"); | |
marker.attr("r", 7) | |
.attr("id", "marker") | |
.attr("transform", "translate(" + startPoint + ")"); | |
//Get path start point for placing marker | |
function pathStartPoint(path) { | |
var d = path.attr("d"), | |
dsplitted = d.split(" "); | |
return dsplitted[1]; | |
} | |
function transition(path) { | |
path.transition() | |
.duration(7500) | |
.attrTween("stroke-dasharray", tweenDash) | |
.each("end", function() { d3.select(this).call(transition); });// infinite loop | |
} | |
function tweenDash() { | |
var l = path.node().getTotalLength(); | |
var i = d3.interpolateString("0," + l, l + "," + l); // interpolation of stroke-dasharray style attr | |
return function(t) { | |
var marker = d3.select("#marker"); | |
var p = path.node().getPointAtLength(t * l); | |
marker.attr("transform", "translate(" + p.x + "," + p.y + ")");//move marker | |
return i(t); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
path { | |
fill: none; | |
stroke: #000; | |
stroke-width: 1px; | |
} | |
circle { | |
fill: red; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<svg | |
xmlns="http://www.w3.org/2000/svg" | |
width="960" | |
height="500" | |
version="1.1" | |
id="svg"> | |
<path | |
d="m 480,200 c 100,0 0,250 100,200 100,-50 0,-250 100,-300 100,-50 350,100 100,200 -250,100 -350,100 -600,0 -250,-100 0,-250 100,-200 100,50 0,250 100,300 100,50 0,-200 100,-200" | |
id="wiggle" | |
class="weirdPath"/> | |
</svg> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hello, I viewed your demo http://bl.ocks.org/KoGor/8163022 with several browsers.
The animation looks great on Chrome, Safari, but on Firefox the red point is much ahead of its path. Could you please check whether this problem can be fixed? Thank you.